Imported Upstream version 3.10.8 upstream/3.10.8
authorJinWang An <jinwang.an@samsung.com>
Wed, 18 Jan 2023 06:01:47 +0000 (15:01 +0900)
committerJinWang An <jinwang.an@samsung.com>
Wed, 18 Jan 2023 06:01:47 +0000 (15:01 +0900)
249 files changed:
Doc/README.rst
Doc/about.rst
Doc/c-api/arg.rst
Doc/c-api/buffer.rst
Doc/c-api/call.rst
Doc/c-api/capsule.rst
Doc/c-api/complex.rst
Doc/c-api/conversion.rst
Doc/c-api/dict.rst
Doc/c-api/exceptions.rst
Doc/c-api/file.rst
Doc/c-api/float.rst
Doc/c-api/import.rst
Doc/c-api/init.rst
Doc/c-api/intro.rst
Doc/c-api/long.rst
Doc/c-api/marshal.rst
Doc/c-api/memory.rst
Doc/c-api/memoryview.rst
Doc/c-api/module.rst
Doc/c-api/object.rst
Doc/c-api/structures.rst
Doc/c-api/sys.rst
Doc/c-api/tuple.rst
Doc/c-api/typehints.rst
Doc/c-api/typeobj.rst
Doc/c-api/unicode.rst
Doc/c-api/veryhigh.rst
Doc/conf.py
Doc/extending/extending.rst
Doc/extending/newtypes.rst
Doc/extending/newtypes_tutorial.rst
Doc/faq/extending.rst
Doc/faq/general.rst
Doc/faq/gui.rst
Doc/faq/library.rst
Doc/faq/programming.rst
Doc/faq/windows.rst
Doc/glossary.rst
Doc/howto/descriptor.rst
Doc/howto/logging-cookbook.rst
Doc/howto/unicode.rst
Doc/includes/email-read-alternative.py
Doc/includes/tzinfo_examples.py
Doc/library/_thread.rst
Doc/library/ast.rst
Doc/library/asyncio-dev.rst
Doc/library/asyncio-eventloop.rst
Doc/library/asyncio-future.rst
Doc/library/asyncio-llapi-index.rst
Doc/library/asyncio-policy.rst
Doc/library/asyncio-stream.rst
Doc/library/asyncio-task.rst
Doc/library/bisect.rst
Doc/library/copyreg.rst
Doc/library/csv.rst
Doc/library/ctypes.rst
Doc/library/decimal.rst
Doc/library/dis.rst
Doc/library/email.compat32-message.rst
Doc/library/email.generator.rst
Doc/library/functions.rst
Doc/library/http.client.rst
Doc/library/http.cookiejar.rst
Doc/library/http.server.rst
Doc/library/importlib.rst
Doc/library/io.rst
Doc/library/json.rst
Doc/library/logging.rst
Doc/library/mailbox.rst
Doc/library/mailcap.rst
Doc/library/multiprocessing.rst
Doc/library/multiprocessing.shared_memory.rst
Doc/library/os.path.rst
Doc/library/os.rst
Doc/library/pickle.rst
Doc/library/posix.rst
Doc/library/random.rst
Doc/library/re.rst
Doc/library/socket.rst
Doc/library/sqlite3.rst
Doc/library/stdtypes.rst
Doc/library/struct.rst
Doc/library/subprocess.rst
Doc/library/sys.rst
Doc/library/test.rst
Doc/library/tkinter.rst
Doc/library/tkinter.tix.rst
Doc/library/tkinter.ttk.rst
Doc/library/traceback.rst
Doc/library/typing.rst
Doc/library/unittest.rst
Doc/library/urllib.parse.rst
Doc/library/venv.rst
Doc/library/wave.rst
Doc/library/xmlrpc.client.rst
Doc/reference/datamodel.rst
Doc/reference/expressions.rst
Doc/reference/import.rst
Doc/tools/extensions/pyspecific.py
Doc/tools/susp-ignored.csv
Doc/tutorial/errors.rst
Doc/tutorial/inputoutput.rst
Doc/tutorial/introduction.rst
Doc/using/unix.rst
Doc/using/windows.rst
Doc/whatsnew/2.0.rst
Doc/whatsnew/2.2.rst
Doc/whatsnew/2.3.rst
Doc/whatsnew/2.4.rst
Doc/whatsnew/2.5.rst
Doc/whatsnew/2.6.rst
Doc/whatsnew/2.7.rst
Doc/whatsnew/3.1.rst
Doc/whatsnew/3.10.rst
Doc/whatsnew/3.2.rst
Doc/whatsnew/3.3.rst
Doc/whatsnew/3.4.rst
Doc/whatsnew/3.5.rst
Doc/whatsnew/3.6.rst
Doc/whatsnew/3.7.rst
Doc/whatsnew/3.8.rst
Doc/whatsnew/3.9.rst
Include/dynamic_annotations.h
Include/patchlevel.h
LICENSE
Lib/ast.py
Lib/asyncio/base_events.py
Lib/asyncio/futures.py
Lib/asyncio/locks.py
Lib/asyncio/streams.py
Lib/asyncio/tasks.py
Lib/asyncio/unix_events.py
Lib/codeop.py
Lib/http/cookiejar.py
Lib/idlelib/config_key.py
Lib/idlelib/configdialog.py
Lib/idlelib/idle_test/test_config_key.py
Lib/idlelib/idle_test/test_configdialog.py
Lib/idlelib/idle_test/test_text.py
Lib/idlelib/idle_test/test_zzdummy.py
Lib/idlelib/macosx.py
Lib/inspect.py
Lib/json/__init__.py
Lib/json/decoder.py
Lib/json/encoder.py
Lib/mailcap.py
Lib/multiprocessing/resource_tracker.py
Lib/os.py
Lib/plistlib.py
Lib/pstats.py
Lib/pydoc_data/topics.py
Lib/subprocess.py
Lib/tabnanny.py
Lib/test/_test_multiprocessing.py
Lib/test/audit-tests.py
Lib/test/clinic.test
Lib/test/pickletester.py
Lib/test/test_asyncio/test_futures.py
Lib/test/test_asyncio/test_locks.py
Lib/test/test_asyncio/test_streams.py
Lib/test/test_audit.py
Lib/test/test_baseexception.py
Lib/test/test_cmd_line.py
Lib/test/test_codeop.py
Lib/test/test_compile.py
Lib/test/test_coroutines.py
Lib/test/test_csv.py
Lib/test/test_dis.py
Lib/test/test_exceptions.py
Lib/test/test_inspect.py
Lib/test/test_int.py
Lib/test/test_ipaddress.py
Lib/test/test_json/test_fail.py
Lib/test/test_json/test_pass1.py
Lib/test/test_json/test_pass2.py
Lib/test/test_json/test_pass3.py
Lib/test/test_list.py
Lib/test/test_long.py
Lib/test/test_mailcap.py
Lib/test/test_posix.py
Lib/test/test_sched.py
Lib/test/test_source_encoding.py
Lib/test/test_string_literals.py
Lib/test/test_subprocess.py
Lib/test/test_sys_settrace.py
Lib/test/test_syslog.py
Lib/test/test_unicode.py
Lib/test/test_unicodedata.py
Lib/test/test_unparse.py
Lib/test/typinganndata/__init__.py [new file with mode: 0644]
Lib/test/typinganndata/ann_module9.py [new file with mode: 0644]
Lib/tkinter/__init__.py
Lib/tkinter/dialog.py
Lib/tkinter/test/test_tkinter/test_widgets.py
Lib/tkinter/test/test_ttk/test_widgets.py
Lib/tkinter/tix.py
Lib/turtle.py
Lib/turtledemo/clock.py
Lib/urllib/request.py
Lib/venv/__init__.py
Lib/wsgiref/validate.py
Mac/BuildScript/build-installer.py
Mac/BuildScript/openssl1.1.1q-pr-18719.patch [new file with mode: 0644]
Mac/BuildScript/resources/License.rtf
Makefile.pre.in
Misc/ACKS
Misc/HISTORY
Misc/NEWS
Modules/_asynciomodule.c
Modules/_csv.c
Modules/_functoolsmodule.c
Modules/_testcapimodule.c
Modules/clinic/_winapi.c.h
Modules/clinic/overlapped.c.h
Modules/clinic/posixmodule.c.h
Modules/expat/COPYING
Modules/expat/expat.h
Modules/expat/internal.h
Modules/expat/siphash.h
Modules/expat/xmlparse.c
Modules/expat/xmltok.c
Modules/expat/xmltok_impl.c
Modules/faulthandler.c
Modules/posixmodule.c
Modules/syslogmodule.c
Objects/descrobject.c
Objects/exceptions.c
Objects/funcobject.c
Objects/listobject.c
Objects/longobject.c
Objects/object.c
PC/_msi.c
PC/clinic/_msi.c.h
PC/clinic/winreg.c.h
Parser/tokenizer.c
Python/ceval.c
Python/ceval_gil.h
Python/compile.c
Python/importlib.h
Python/importlib_external.h
Python/importlib_zipimport.h
Python/initconfig.c
Python/mysnprintf.c
README.rst
Tools/clinic/clinic.py
Tools/msi/buildrelease.bat
Tools/msi/bundle/Default.wxl
Tools/scripts/get-remote-certificate.py

index 7e8a27b..729f4f8 100644 (file)
@@ -40,7 +40,7 @@ If you'd like to create the virtual environment in a different location,
 you can specify it using the ``VENVDIR`` variable.
 
 You can also skip creating the virtual environment altogether, in which case
-the Makefile will look for instances of ``sphinxbuild`` and ``blurb``
+the Makefile will look for instances of ``sphinx-build`` and ``blurb``
 installed on your process ``PATH`` (configurable with the ``SPHINXBUILD`` and
 ``BLURB`` variables).
 
index 0ce3566..5e6160f 100644 (file)
@@ -7,7 +7,7 @@ These documents are generated from `reStructuredText`_ sources by `Sphinx`_, a
 document processor specifically written for the Python documentation.
 
 .. _reStructuredText: https://docutils.sourceforge.io/rst.html
-.. _Sphinx: http://sphinx-doc.org/
+.. _Sphinx: https://www.sphinx-doc.org/
 
 .. In the online version of these documents, you can submit comments and suggest
    changes directly on the documentation pages.
index 926e524..85f9eda 100644 (file)
@@ -129,12 +129,12 @@ which disallows mutable objects such as :class:`bytearray`.
 ``S`` (:class:`bytes`) [PyBytesObject \*]
    Requires that the Python object is a :class:`bytes` object, without
    attempting any conversion.  Raises :exc:`TypeError` if the object is not
-   a bytes object.  The C variable may also be declared as :c:type:`PyObject*`.
+   a bytes object.  The C variable may also be declared as :c:expr:`PyObject*`.
 
 ``Y`` (:class:`bytearray`) [PyByteArrayObject \*]
    Requires that the Python object is a :class:`bytearray` object, without
    attempting any conversion.  Raises :exc:`TypeError` if the object is not
-   a :class:`bytearray` object. The C variable may also be declared as :c:type:`PyObject*`.
+   a :class:`bytearray` object. The C variable may also be declared as :c:expr:`PyObject*`.
 
 ``u`` (:class:`str`) [const Py_UNICODE \*]
    Convert a Python Unicode object to a C pointer to a NUL-terminated buffer of
@@ -181,7 +181,7 @@ which disallows mutable objects such as :class:`bytearray`.
 ``U`` (:class:`str`) [PyObject \*]
    Requires that the Python object is a Unicode object, without attempting
    any conversion.  Raises :exc:`TypeError` if the object is not a Unicode
-   object.  The C variable may also be declared as :c:type:`PyObject*`.
+   object.  The C variable may also be declared as :c:expr:`PyObject*`.
 
 ``w*`` (read-write :term:`bytes-like object`) [Py_buffer]
    This format accepts any object which implements the read-write buffer
@@ -194,10 +194,10 @@ which disallows mutable objects such as :class:`bytearray`.
    It only works for encoded data without embedded NUL bytes.
 
    This format requires two arguments.  The first is only used as input, and
-   must be a :c:type:`const char*` which points to the name of an encoding as a
+   must be a :c:expr:`const char*` which points to the name of an encoding as a
    NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used.
    An exception is raised if the named encoding is not known to Python.  The
-   second argument must be a :c:type:`char**`; the value of the pointer it
+   second argument must be a :c:expr:`char**`; the value of the pointer it
    references will be set to a buffer with the contents of the argument text.
    The text will be encoded in the encoding specified by the first argument.
 
@@ -217,10 +217,10 @@ which disallows mutable objects such as :class:`bytearray`.
    characters.
 
    It requires three arguments.  The first is only used as input, and must be a
-   :c:type:`const char*` which points to the name of an encoding as a
+   :c:expr:`const char*` which points to the name of an encoding as a
    NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used.
    An exception is raised if the named encoding is not known to Python.  The
-   second argument must be a :c:type:`char**`; the value of the pointer it
+   second argument must be a :c:expr:`char**`; the value of the pointer it
    references will be set to a buffer with the contents of the argument text.
    The text will be encoded in the encoding specified by the first argument.
    The third argument must be a pointer to an integer; the referenced integer
@@ -252,38 +252,38 @@ Numbers
 
 ``b`` (:class:`int`) [unsigned char]
    Convert a nonnegative Python integer to an unsigned tiny int, stored in a C
-   :c:type:`unsigned char`.
+   :c:expr:`unsigned char`.
 
 ``B`` (:class:`int`) [unsigned char]
    Convert a Python integer to a tiny int without overflow checking, stored in a C
-   :c:type:`unsigned char`.
+   :c:expr:`unsigned char`.
 
 ``h`` (:class:`int`) [short int]
-   Convert a Python integer to a C :c:type:`short int`.
+   Convert a Python integer to a C :c:expr:`short int`.
 
 ``H`` (:class:`int`) [unsigned short int]
-   Convert a Python integer to a C :c:type:`unsigned short int`, without overflow
+   Convert a Python integer to a C :c:expr:`unsigned short int`, without overflow
    checking.
 
 ``i`` (:class:`int`) [int]
-   Convert a Python integer to a plain C :c:type:`int`.
+   Convert a Python integer to a plain C :c:expr:`int`.
 
 ``I`` (:class:`int`) [unsigned int]
-   Convert a Python integer to a C :c:type:`unsigned int`, without overflow
+   Convert a Python integer to a C :c:expr:`unsigned int`, without overflow
    checking.
 
 ``l`` (:class:`int`) [long int]
-   Convert a Python integer to a C :c:type:`long int`.
+   Convert a Python integer to a C :c:expr:`long int`.
 
 ``k`` (:class:`int`) [unsigned long]
-   Convert a Python integer to a C :c:type:`unsigned long` without
+   Convert a Python integer to a C :c:expr:`unsigned long` without
    overflow checking.
 
 ``L`` (:class:`int`) [long long]
-   Convert a Python integer to a C :c:type:`long long`.
+   Convert a Python integer to a C :c:expr:`long long`.
 
 ``K`` (:class:`int`) [unsigned long long]
-   Convert a Python integer to a C :c:type:`unsigned long long`
+   Convert a Python integer to a C :c:expr:`unsigned long long`
    without overflow checking.
 
 ``n`` (:class:`int`) [:c:type:`Py_ssize_t`]
@@ -291,20 +291,20 @@ Numbers
 
 ``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char]
    Convert a Python byte, represented as a :class:`bytes` or
-   :class:`bytearray` object of length 1, to a C :c:type:`char`.
+   :class:`bytearray` object of length 1, to a C :c:expr:`char`.
 
    .. versionchanged:: 3.3
       Allow :class:`bytearray` objects.
 
 ``C`` (:class:`str` of length 1) [int]
    Convert a Python character, represented as a :class:`str` object of
-   length 1, to a C :c:type:`int`.
+   length 1, to a C :c:expr:`int`.
 
 ``f`` (:class:`float`) [float]
-   Convert a Python floating point number to a C :c:type:`float`.
+   Convert a Python floating point number to a C :c:expr:`float`.
 
 ``d`` (:class:`float`) [double]
-   Convert a Python floating point number to a C :c:type:`double`.
+   Convert a Python floating point number to a C :c:expr:`double`.
 
 ``D`` (:class:`complex`) [Py_complex]
    Convert a Python complex number to a C :c:type:`Py_complex` structure.
@@ -320,7 +320,7 @@ Other objects
 ``O!`` (object) [*typeobject*, PyObject \*]
    Store a Python object in a C object pointer.  This is similar to ``O``, but
    takes two C arguments: the first is the address of a Python type object, the
-   second is the address of the C variable (of type :c:type:`PyObject*`) into which
+   second is the address of the C variable (of type :c:expr:`PyObject*`) into which
    the object pointer is stored.  If the Python object does not have the required
    type, :exc:`TypeError` is raised.
 
@@ -329,13 +329,13 @@ Other objects
 ``O&`` (object) [*converter*, *anything*]
    Convert a Python object to a C variable through a *converter* function.  This
    takes two arguments: the first is a function, the second is the address of a C
-   variable (of arbitrary type), converted to :c:type:`void *`.  The *converter*
+   variable (of arbitrary type), converted to :c:expr:`void *`.  The *converter*
    function in turn is called as follows::
 
       status = converter(object, address);
 
    where *object* is the Python object to be converted and *address* is the
-   :c:type:`void*` argument that was passed to the :c:func:`PyArg_Parse\*` function.
+   :c:expr:`void*` argument that was passed to the ``PyArg_Parse*`` function.
    The returned *status* should be ``1`` for a successful conversion and ``0`` if
    the conversion has failed.  When the conversion fails, the *converter* function
    should raise an exception and leave the content of *address* unmodified.
@@ -409,9 +409,9 @@ what is specified for the corresponding format unit in that case.
 
 For the conversion to succeed, the *arg* object must match the format
 and the format must be exhausted.  On success, the
-:c:func:`PyArg_Parse\*` functions return true, otherwise they return
+``PyArg_Parse*`` functions return true, otherwise they return
 false and raise an appropriate exception. When the
-:c:func:`PyArg_Parse\*` functions fail due to conversion failure in one
+``PyArg_Parse*`` functions fail due to conversion failure in one
 of the format units, the variables at the addresses corresponding to that
 and the following format units are left untouched.
 
@@ -481,7 +481,7 @@ API Functions
    *args*; it must actually be a tuple.  The length of the tuple must be at least
    *min* and no more than *max*; *min* and *max* may be equal.  Additional
    arguments must be passed to the function, each of which should be a pointer to a
-   :c:type:`PyObject*` variable; these will be filled in with the values from
+   :c:expr:`PyObject*` variable; these will be filled in with the values from
    *args*; they will contain :term:`borrowed references <borrowed reference>`.
    The variables which correspond
    to optional parameters not given by *args* will not be filled in; these should
@@ -518,7 +518,7 @@ Building values
 .. c:function:: PyObject* Py_BuildValue(const char *format, ...)
 
    Create a new value based on a format string similar to those accepted by the
-   :c:func:`PyArg_Parse\*` family of functions and a sequence of values.  Returns
+   ``PyArg_Parse*`` family of functions and a sequence of values.  Returns
    the value or ``NULL`` in the case of an error; an exception will be raised if
    ``NULL`` is returned.
 
@@ -568,7 +568,7 @@ Building values
       Same as ``s#``.
 
    ``u`` (:class:`str`) [const wchar_t \*]
-      Convert a null-terminated :c:type:`wchar_t` buffer of Unicode (UTF-16 or UCS-4)
+      Convert a null-terminated :c:expr:`wchar_t` buffer of Unicode (UTF-16 or UCS-4)
       data to a Python Unicode object.  If the Unicode buffer pointer is ``NULL``,
       ``None`` is returned.
 
@@ -584,51 +584,51 @@ Building values
       Same as ``s#``.
 
    ``i`` (:class:`int`) [int]
-      Convert a plain C :c:type:`int` to a Python integer object.
+      Convert a plain C :c:expr:`int` to a Python integer object.
 
    ``b`` (:class:`int`) [char]
-      Convert a plain C :c:type:`char` to a Python integer object.
+      Convert a plain C :c:expr:`char` to a Python integer object.
 
    ``h`` (:class:`int`) [short int]
-      Convert a plain C :c:type:`short int` to a Python integer object.
+      Convert a plain C :c:expr:`short int` to a Python integer object.
 
    ``l`` (:class:`int`) [long int]
-      Convert a C :c:type:`long int` to a Python integer object.
+      Convert a C :c:expr:`long int` to a Python integer object.
 
    ``B`` (:class:`int`) [unsigned char]
-      Convert a C :c:type:`unsigned char` to a Python integer object.
+      Convert a C :c:expr:`unsigned char` to a Python integer object.
 
    ``H`` (:class:`int`) [unsigned short int]
-      Convert a C :c:type:`unsigned short int` to a Python integer object.
+      Convert a C :c:expr:`unsigned short int` to a Python integer object.
 
    ``I`` (:class:`int`) [unsigned int]
-      Convert a C :c:type:`unsigned int` to a Python integer object.
+      Convert a C :c:expr:`unsigned int` to a Python integer object.
 
    ``k`` (:class:`int`) [unsigned long]
-      Convert a C :c:type:`unsigned long` to a Python integer object.
+      Convert a C :c:expr:`unsigned long` to a Python integer object.
 
    ``L`` (:class:`int`) [long long]
-      Convert a C :c:type:`long long` to a Python integer object.
+      Convert a C :c:expr:`long long` to a Python integer object.
 
    ``K`` (:class:`int`) [unsigned long long]
-      Convert a C :c:type:`unsigned long long` to a Python integer object.
+      Convert a C :c:expr:`unsigned long long` to a Python integer object.
 
    ``n`` (:class:`int`) [:c:type:`Py_ssize_t`]
       Convert a C :c:type:`Py_ssize_t` to a Python integer.
 
    ``c`` (:class:`bytes` of length 1) [char]
-      Convert a C :c:type:`int` representing a byte to a Python :class:`bytes` object of
+      Convert a C :c:expr:`int` representing a byte to a Python :class:`bytes` object of
       length 1.
 
    ``C`` (:class:`str` of length 1) [int]
-      Convert a C :c:type:`int` representing a character to Python :class:`str`
+      Convert a C :c:expr:`int` representing a character to Python :class:`str`
       object of length 1.
 
    ``d`` (:class:`float`) [double]
-      Convert a C :c:type:`double` to a Python floating point number.
+      Convert a C :c:expr:`double` to a Python floating point number.
 
    ``f`` (:class:`float`) [float]
-      Convert a C :c:type:`float` to a Python floating point number.
+      Convert a C :c:expr:`float` to a Python floating point number.
 
    ``D`` (:class:`complex`) [Py_complex \*]
       Convert a C :c:type:`Py_complex` structure to a Python complex number.
@@ -651,7 +651,7 @@ Building values
 
    ``O&`` (object) [*converter*, *anything*]
       Convert *anything* to a Python object through a *converter* function.  The
-      function is called with *anything* (which should be compatible with :c:type:`void*`)
+      function is called with *anything* (which should be compatible with :c:expr:`void*`)
       as its argument and should return a "new" Python object, or ``NULL`` if an
       error occurred.
 
index e327193..e3b4947 100644 (file)
@@ -99,7 +99,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`.
       For :term:`contiguous` arrays, the value points to the beginning of
       the memory block.
 
-   .. c:member:: void *obj
+   .. c:member:: PyObject *obj
 
       A new reference to the exporting object. The reference is owned by
       the consumer and automatically decremented and set to ``NULL`` by
index 13ef8b2..36149f1 100644 (file)
@@ -275,7 +275,7 @@ please see individual documentation for details.
 
    This is the equivalent of the Python expression: ``callable(*args)``.
 
-   Note that if you only pass :c:type:`PyObject *` args,
+   Note that if you only pass :c:expr:`PyObject *` args,
    :c:func:`PyObject_CallFunctionObjArgs` is a faster alternative.
 
    .. versionchanged:: 3.4
@@ -296,7 +296,7 @@ please see individual documentation for details.
    This is the equivalent of the Python expression:
    ``obj.name(arg1, arg2, ...)``.
 
-   Note that if you only pass :c:type:`PyObject *` args,
+   Note that if you only pass :c:expr:`PyObject *` args,
    :c:func:`PyObject_CallMethodObjArgs` is a faster alternative.
 
    .. versionchanged:: 3.4
@@ -306,7 +306,7 @@ please see individual documentation for details.
 .. 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
+   :c:expr:`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
@@ -320,7 +320,7 @@ please see individual documentation for details.
 
    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
+   :c:expr:`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
index 908e926..6049b24 100644 (file)
@@ -15,7 +15,7 @@ Refer to :ref:`using-capsules` for more information on using these objects.
 .. c:type:: PyCapsule
 
    This subtype of :c:type:`PyObject` represents an opaque value, useful for C
-   extension modules who need to pass an opaque value (as a :c:type:`void*`
+   extension modules who need to pass an opaque value (as a :c:expr:`void*`
    pointer) through Python code to other C code.  It is often used to make a C
    function pointer defined in one module available to other modules, so the
    regular import mechanism can be used to access C APIs defined in dynamically
index c258946..9228ce8 100644 (file)
@@ -115,12 +115,12 @@ Complex Numbers as Python Objects
 
 .. c:function:: double PyComplex_RealAsDouble(PyObject *op)
 
-   Return the real part of *op* as a C :c:type:`double`.
+   Return the real part of *op* as a C :c:expr:`double`.
 
 
 .. c:function:: double PyComplex_ImagAsDouble(PyObject *op)
 
-   Return the imaginary part of *op* as a C :c:type:`double`.
+   Return the imaginary part of *op* as a C :c:expr:`double`.
 
 
 .. c:function:: Py_complex PyComplex_AsCComplex(PyObject *op)
index 7b4cc1c..fdb321f 100644 (file)
@@ -28,7 +28,8 @@ not.
 The wrappers ensure that ``str[size-1]`` is always ``'\0'`` upon return. They
 never write more than *size* bytes (including the trailing ``'\0'``) into str.
 Both functions require that ``str != NULL``, ``size > 0``, ``format != NULL``
-and ``size < INT_MAX``.
+and ``size < INT_MAX``. Note that this means there is no equivalent to the C99
+``n = snprintf(NULL, 0, ...)`` which would determine the necessary buffer size.
 
 The return value (*rv*) for these functions should be interpreted as follows:
 
@@ -49,7 +50,7 @@ The following functions provide locale-independent string to number conversions.
 
 .. c:function:: double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
 
-   Convert a string ``s`` to a :c:type:`double`, raising a Python
+   Convert a string ``s`` to a :c:expr:`double`, raising a Python
    exception on failure.  The set of accepted strings corresponds to
    the set of strings accepted by Python's :func:`float` constructor,
    except that ``s`` must not have leading or trailing whitespace.
@@ -83,7 +84,7 @@ The following functions provide locale-independent string to number conversions.
 
 .. c:function:: char* PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)
 
-   Convert a :c:type:`double` *val* to a string using supplied
+   Convert a :c:expr:`double` *val* to a string using supplied
    *format_code*, *precision*, and *flags*.
 
    *format_code* must be one of ``'e'``, ``'E'``, ``'f'``, ``'F'``,
index d257c9b..819168d 100644 (file)
@@ -73,7 +73,7 @@ Dictionary Objects
    .. index:: single: PyUnicode_FromString()
 
    Insert *val* into the dictionary *p* using *key* as a key. *key* should
-   be a :c:type:`const char*`.  The key object is created using
+   be a :c:expr:`const char*`.  The key object is created using
    ``PyUnicode_FromString(key)``.  Return ``0`` on success or ``-1`` on
    failure.  This function *does not* steal a reference to *val*.
 
@@ -118,7 +118,7 @@ Dictionary Objects
 .. c:function:: PyObject* PyDict_GetItemString(PyObject *p, const char *key)
 
    This is the same as :c:func:`PyDict_GetItem`, but *key* is specified as a
-   :c:type:`const char*`, rather than a :c:type:`PyObject*`.
+   :c:expr:`const char*`, rather than a :c:expr:`PyObject*`.
 
    Note that exceptions which occur while calling :meth:`__hash__` and
    :meth:`__eq__` methods and creating a temporary string object
@@ -167,7 +167,7 @@ Dictionary Objects
    prior to the first call to this function to start the iteration; the
    function returns true for each pair in the dictionary, and false once all
    pairs have been reported.  The parameters *pkey* and *pvalue* should either
-   point to :c:type:`PyObject*` variables that will be filled in with each key
+   point to :c:expr:`PyObject*` variables that will be filled in with each key
    and value, respectively, or may be ``NULL``.  Any references returned through
    them are borrowed.  *ppos* should not be altered during iteration. Its
    value represents offsets within the internal dictionary structure, and
index fc90fa2..37c938a 100644 (file)
@@ -14,7 +14,7 @@ there is a global indicator (per thread) of the last error that occurred.  Most
 C API functions don't clear this on success, but will set it to indicate the
 cause of the error on failure.  Most C API functions also return an error
 indicator, usually ``NULL`` if they are supposed to return a pointer, or ``-1``
-if they return an integer (exception: the :c:func:`PyArg_\*` functions
+if they return an integer (exception: the ``PyArg_*`` functions
 return ``1`` for success and ``0`` for failure).
 
 Concretely, the error indicator consists of three object pointers: the
@@ -189,7 +189,7 @@ For convenience, some of these functions will always return a
 .. c:function:: PyObject* PyErr_SetFromWindowsErr(int ierr)
 
    This is a convenience function to raise :exc:`WindowsError`. If called with
-   *ierr* of :c:data:`0`, the error code returned by a call to :c:func:`GetLastError`
+   *ierr* of ``0``, the error code returned by a call to :c:func:`GetLastError`
    is used instead.  It calls the Win32 function :c:func:`FormatMessage` to retrieve
    the Windows description of error code given by *ierr* or :c:func:`GetLastError`,
    then it constructs a tuple object whose first item is the *ierr* value and whose
@@ -370,7 +370,7 @@ Querying the error indicator
 .. c:function:: PyObject* PyErr_Occurred()
 
    Test whether the error indicator is set.  If set, return the exception *type*
-   (the first argument to the last call to one of the :c:func:`PyErr_Set\*`
+   (the first argument to the last call to one of the ``PyErr_Set*``
    functions or to :c:func:`PyErr_Restore`).  If not set, return ``NULL``.  You do not
    own a reference to the return value, so you do not need to :c:func:`Py_DECREF`
    it.
@@ -828,7 +828,7 @@ Standard Exceptions
 
 All standard Python exceptions are available as global variables whose names are
 ``PyExc_`` followed by the Python exception name.  These have the type
-:c:type:`PyObject*`; they are all class objects.  For completeness, here are all
+:c:expr:`PyObject*`; they are all class objects.  For completeness, here are all
 the variables:
 
 .. index::
@@ -1048,7 +1048,7 @@ Standard Warning Categories
 
 All standard Python warning categories are available as global variables whose
 names are ``PyExc_`` followed by the Python exception name. These have the type
-:c:type:`PyObject*`; they are all class objects. For completeness, here are all
+:c:expr:`PyObject*`; they are all class objects. For completeness, here are all
 the variables:
 
 .. index::
index ed3735a..58ed58e 100644 (file)
@@ -8,7 +8,7 @@ File Objects
 .. index:: object: file
 
 These APIs are a minimal emulation of the Python 2 C API for built-in file
-objects, which used to rely on the buffered I/O (:c:type:`FILE*`) support
+objects, which used to rely on the buffered I/O (:c:expr:`FILE*`) support
 from the C standard library.  In Python 3, files and streams use the new
 :mod:`io` module, which defines several layers over the low-level unbuffered
 I/O of the operating system.  The functions described below are
@@ -38,7 +38,7 @@ the :mod:`io` APIs instead.
 
 .. c:function:: int PyObject_AsFileDescriptor(PyObject *p)
 
-   Return the file descriptor associated with *p* as an :c:type:`int`.  If the
+   Return the file descriptor associated with *p* as an :c:expr:`int`.  If the
    object is an integer, its value is returned.  If not, the
    object's :meth:`~io.IOBase.fileno` method is called if it exists; the
    method must return an integer, which is returned as the file descriptor
@@ -65,7 +65,7 @@ the :mod:`io` APIs instead.
    Overrides the normal behavior of :func:`io.open_code` to pass its parameter
    through the provided handler.
 
-   The handler is a function of type :c:type:`PyObject *(\*)(PyObject *path,
+   The handler is a function of type :c:expr:`PyObject *(\*)(PyObject *path,
    void *userData)`, where *path* is guaranteed to be :c:type:`PyUnicodeObject`.
 
    The *userData* pointer is passed into the hook function. Since hook
index c107243..6b6f99f 100644 (file)
@@ -44,7 +44,7 @@ Floating Point Objects
 
 .. c:function:: double PyFloat_AsDouble(PyObject *pyfloat)
 
-   Return a C :c:type:`double` representation of the contents of *pyfloat*.  If
+   Return a C :c:expr:`double` representation of the contents of *pyfloat*.  If
    *pyfloat* is not a Python floating point object but has a :meth:`__float__`
    method, this method will first be called to convert *pyfloat* into a float.
    If ``__float__()`` is not defined then it falls back to :meth:`__index__`.
@@ -57,7 +57,7 @@ Floating Point Objects
 
 .. c:function:: double PyFloat_AS_DOUBLE(PyObject *pyfloat)
 
-   Return a C :c:type:`double` representation of the contents of *pyfloat*, but
+   Return a C :c:expr:`double` representation of the contents of *pyfloat*, but
    without error checking.
 
 
@@ -70,9 +70,9 @@ Floating Point Objects
 
 .. c:function:: double PyFloat_GetMax()
 
-   Return the maximum representable finite float *DBL_MAX* as C :c:type:`double`.
+   Return the maximum representable finite float *DBL_MAX* as C :c:expr:`double`.
 
 
 .. c:function:: double PyFloat_GetMin()
 
-   Return the minimum normalized positive float *DBL_MIN* as C :c:type:`double`.
+   Return the minimum normalized positive float *DBL_MIN* as C :c:expr:`double`.
index d2ae6b6..46ba1f8 100644 (file)
@@ -243,7 +243,7 @@ Importing Modules
    UTF-8 encoded string instead of a Unicode object.
 
 
-.. c:type:: struct _frozen
+.. c:struct:: _frozen
 
    .. index:: single: freeze utility
 
@@ -261,7 +261,7 @@ Importing Modules
 
 .. c:var:: const struct _frozen* PyImport_FrozenModules
 
-   This pointer is initialized to point to an array of :c:type:`struct _frozen`
+   This pointer is initialized to point to an array of :c:struct:`_frozen`
    records, terminated by one whose members are all ``NULL`` or zero.  When a frozen
    module is imported, it is searched in this table.  Third-party code could play
    tricks with this to provide a dynamically created collection of frozen modules.
@@ -277,7 +277,7 @@ Importing Modules
    :c:func:`Py_Initialize`.
 
 
-.. c:type:: struct _inittab
+.. c:struct:: _inittab
 
    Structure describing a single entry in the list of built-in modules.  Each of
    these structures gives the name and initialization function for a module built
index a44442a..3192189 100644 (file)
@@ -365,7 +365,7 @@ Process-wide parameters
    interpreter will change the contents of this storage.
 
    Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
-   :c:type:`wchar_*` string.
+   :c:expr:`wchar_*` string.
 
 
 .. c:function:: wchar* Py_GetProgramName()
@@ -509,7 +509,7 @@ Process-wide parameters
    if required after calling :c:func:`Py_Initialize`.
 
    Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
-   :c:type:`wchar_*` string.
+   :c:expr:`wchar_*` string.
 
    The path argument is copied internally, so the caller may free it after the
    call completes.
@@ -615,7 +615,7 @@ Process-wide parameters
      directory (``"."``).
 
    Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
-   :c:type:`wchar_*` string.
+   :c:expr:`wchar_*` string.
 
    .. note::
       It is recommended that applications embedding the Python interpreter
@@ -642,7 +642,7 @@ Process-wide parameters
    :option:`-I`.
 
    Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
-   :c:type:`wchar_*` string.
+   :c:expr:`wchar_*` string.
 
    .. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`.
 
@@ -659,7 +659,7 @@ Process-wide parameters
    this storage.
 
    Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
-   :c:type:`wchar_*` string.
+   :c:expr:`wchar_*` string.
 
 
 .. c:function:: w_char* Py_GetPythonHome()
@@ -800,11 +800,11 @@ from a C thread is::
    /* Release the thread. No Python API allowed beyond this point. */
    PyGILState_Release(gstate);
 
-Note that the :c:func:`PyGILState_\*` functions assume there is only one global
+Note that the ``PyGILState_*`` functions assume there is only one global
 interpreter (created automatically by :c:func:`Py_Initialize`).  Python
 supports the creation of additional interpreters (using
 :c:func:`Py_NewInterpreter`), but mixing multiple interpreters and the
-:c:func:`PyGILState_\*` API is unsupported.
+``PyGILState_*`` API is unsupported.
 
 
 .. _fork-and-threads:
@@ -867,7 +867,7 @@ code, or when embedding the Python interpreter:
 .. c:type:: PyThreadState
 
    This data structure represents the state of a single thread.  The only public
-   data member is :attr:`interp` (:c:type:`PyInterpreterState *`), which points to
+   data member is :attr:`interp` (:c:expr:`PyInterpreterState *`), which points to
    this thread's interpreter state.
 
 
@@ -1221,8 +1221,8 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
    exception (if any) for the thread is cleared. This raises no exceptions.
 
    .. versionchanged:: 3.7
-      The type of the *id* parameter changed from :c:type:`long` to
-      :c:type:`unsigned long`.
+      The type of the *id* parameter changed from :c:expr:`long` to
+      :c:expr:`unsigned long`.
 
 .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate)
 
@@ -1408,7 +1408,7 @@ operations executed by such objects may affect the wrong (sub-)interpreter's
 dictionary of loaded modules. It is equally important to avoid sharing
 objects from which the above are reachable.
 
-Also note that combining this functionality with :c:func:`PyGILState_\*` APIs
+Also note that combining this functionality with ``PyGILState_*`` APIs
 is delicate, because these APIs assume a bijection between Python thread states
 and OS-level threads, an assumption broken by the presence of sub-interpreters.
 It is highly recommended that you don't switch sub-interpreters between a pair
@@ -1656,7 +1656,7 @@ The Python interpreter provides low-level support for thread-local storage
 (TLS) which wraps the underlying native TLS implementation to support the
 Python-level thread local storage API (:class:`threading.local`).  The
 CPython C level APIs are similar to those offered by pthreads and Windows:
-use a thread key and functions to associate a :c:type:`void*` value per
+use a thread key and functions to associate a :c:expr:`void*` value per
 thread.
 
 The GIL does *not* need to be held when calling these functions; they supply
@@ -1667,8 +1667,8 @@ you need to include :file:`pythread.h` to use thread-local storage.
 
 .. note::
    None of these API functions handle memory management on behalf of the
-   :c:type:`void*` values.  You need to allocate and deallocate them yourself.
-   If the :c:type:`void*` values happen to be :c:type:`PyObject*`, these
+   :c:expr:`void*` values.  You need to allocate and deallocate them yourself.
+   If the :c:expr:`void*` values happen to be :c:expr:`PyObject*`, these
    functions don't do refcount operations on them either.
 
 .. _thread-specific-storage-api:
@@ -1678,7 +1678,7 @@ Thread Specific Storage (TSS) API
 
 TSS API is introduced to supersede the use of the existing TLS API within the
 CPython interpreter.  This API uses a new type :c:type:`Py_tss_t` instead of
-:c:type:`int` to represent thread keys.
+:c:expr:`int` to represent thread keys.
 
 .. versionadded:: 3.7
 
@@ -1764,14 +1764,14 @@ undefined if the given :c:type:`Py_tss_t` has not been initialized by
 
 .. c:function:: int PyThread_tss_set(Py_tss_t *key, void *value)
 
-   Return a zero value to indicate successfully associating a :c:type:`void*`
+   Return a zero value to indicate successfully associating a :c:expr:`void*`
    value with a TSS key in the current thread.  Each thread has a distinct
-   mapping of the key to a :c:type:`void*` value.
+   mapping of the key to a :c:expr:`void*` value.
 
 
 .. c:function:: void* PyThread_tss_get(Py_tss_t *key)
 
-   Return the :c:type:`void*` value associated with a TSS key in the current
+   Return the :c:expr:`void*` value associated with a TSS key in the current
    thread.  This returns ``NULL`` if no value is associated with the key in the
    current thread.
 
index 2c09ac5..80713c5 100644 (file)
@@ -229,13 +229,13 @@ Objects, Types and Reference Counts
 .. index:: object: type
 
 Most Python/C API functions have one or more arguments as well as a return value
-of type :c:type:`PyObject*`.  This type is a pointer to an opaque data type
+of type :c:expr:`PyObject*`.  This type is a pointer to an opaque data type
 representing an arbitrary Python object.  Since all Python object types are
 treated the same way by the Python language in most situations (e.g.,
 assignments, scope rules, and argument passing), it is only fitting that they
 should be represented by a single C type.  Almost all Python objects live on the
 heap: you never declare an automatic or static variable of type
-:c:type:`PyObject`, only pointer variables of type :c:type:`PyObject*` can  be
+:c:type:`PyObject`, only pointer variables of type :c:expr:`PyObject*` can  be
 declared.  The sole exception are the type objects; since these must never be
 deallocated, they are typically static :c:type:`PyTypeObject` objects.
 
@@ -495,8 +495,8 @@ Types
 -----
 
 There are few other data types that play a significant role in  the Python/C
-API; most are simple C types such as :c:type:`int`,  :c:type:`long`,
-:c:type:`double` and :c:type:`char*`.  A few structure types  are used to
+API; most are simple C types such as :c:expr:`int`,  :c:expr:`long`,
+:c:expr:`double` and :c:expr:`char*`.  A few structure types  are used to
 describe static tables used to list the functions exported  by a module or the
 data attributes of a new object type, and another is used to describe the value
 of a complex number.  These will  be discussed together with the functions that
index 620344e..bd3d731 100644 (file)
@@ -47,7 +47,7 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: PyObject* PyLong_FromUnsignedLong(unsigned long v)
 
-   Return a new :c:type:`PyLongObject` object from a C :c:type:`unsigned long`, or
+   Return a new :c:type:`PyLongObject` object from a C :c:expr:`unsigned long`, or
    ``NULL`` on failure.
 
 
@@ -65,13 +65,13 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: PyObject* PyLong_FromLongLong(long long v)
 
-   Return a new :c:type:`PyLongObject` object from a C :c:type:`long long`, or ``NULL``
+   Return a new :c:type:`PyLongObject` object from a C :c:expr:`long long`, or ``NULL``
    on failure.
 
 
 .. c:function:: PyObject* PyLong_FromUnsignedLongLong(unsigned long long v)
 
-   Return a new :c:type:`PyLongObject` object from a C :c:type:`unsigned long long`,
+   Return a new :c:type:`PyLongObject` object from a C :c:expr:`unsigned long long`,
    or ``NULL`` on failure.
 
 
@@ -115,12 +115,12 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
       single: LONG_MAX
       single: OverflowError (built-in exception)
 
-   Return a C :c:type:`long` representation of *obj*.  If *obj* is not an
+   Return a C :c:expr:`long` representation of *obj*.  If *obj* is not an
    instance of :c:type:`PyLongObject`, first call its :meth:`__index__` method
    (if present) to convert it to a :c:type:`PyLongObject`.
 
    Raise :exc:`OverflowError` if the value of *obj* is out of range for a
-   :c:type:`long`.
+   :c:expr:`long`.
 
    Returns ``-1`` on error.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
@@ -133,7 +133,7 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow)
 
-   Return a C :c:type:`long` representation of *obj*.  If *obj* is not an
+   Return a C :c:expr:`long` representation of *obj*.  If *obj* is not an
    instance of :c:type:`PyLongObject`, first call its :meth:`__index__`
    method (if present) to convert it to a :c:type:`PyLongObject`.
 
@@ -156,12 +156,12 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
    .. index::
       single: OverflowError (built-in exception)
 
-   Return a C :c:type:`long long` representation of *obj*.  If *obj* is not an
+   Return a C :c:expr:`long long` representation of *obj*.  If *obj* is not an
    instance of :c:type:`PyLongObject`, first call its :meth:`__index__` method
    (if present) to convert it to a :c:type:`PyLongObject`.
 
    Raise :exc:`OverflowError` if the value of *obj* is out of range for a
-   :c:type:`long long`.
+   :c:expr:`long long`.
 
    Returns ``-1`` on error.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
@@ -174,7 +174,7 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: long long PyLong_AsLongLongAndOverflow(PyObject *obj, int *overflow)
 
-   Return a C :c:type:`long long` representation of *obj*.  If *obj* is not an
+   Return a C :c:expr:`long long` representation of *obj*.  If *obj* is not an
    instance of :c:type:`PyLongObject`, first call its :meth:`__index__` method
    (if present) to convert it to a :c:type:`PyLongObject`.
 
@@ -215,11 +215,11 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
       single: ULONG_MAX
       single: OverflowError (built-in exception)
 
-   Return a C :c:type:`unsigned long` representation of *pylong*.  *pylong*
+   Return a C :c:expr:`unsigned long` representation of *pylong*.  *pylong*
    must be an instance of :c:type:`PyLongObject`.
 
    Raise :exc:`OverflowError` if the value of *pylong* is out of range for a
-   :c:type:`unsigned long`.
+   :c:expr:`unsigned long`.
 
    Returns ``(unsigned long)-1`` on error.
    Use :c:func:`PyErr_Occurred` to disambiguate.
@@ -246,11 +246,11 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
    .. index::
       single: OverflowError (built-in exception)
 
-   Return a C :c:type:`unsigned long long` representation of *pylong*.  *pylong*
+   Return a C :c:expr:`unsigned long long` representation of *pylong*.  *pylong*
    must be an instance of :c:type:`PyLongObject`.
 
    Raise :exc:`OverflowError` if the value of *pylong* is out of range for an
-   :c:type:`unsigned long long`.
+   :c:expr:`unsigned long long`.
 
    Returns ``(unsigned long long)-1`` on error.
    Use :c:func:`PyErr_Occurred` to disambiguate.
@@ -261,11 +261,11 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: unsigned long PyLong_AsUnsignedLongMask(PyObject *obj)
 
-   Return a C :c:type:`unsigned long` representation of *obj*.  If *obj* is not
+   Return a C :c:expr:`unsigned long` representation of *obj*.  If *obj* is not
    an instance of :c:type:`PyLongObject`, first call its :meth:`__index__`
    method (if present) to convert it to a :c:type:`PyLongObject`.
 
-   If the value of *obj* is out of range for an :c:type:`unsigned long`,
+   If the value of *obj* is out of range for an :c:expr:`unsigned long`,
    return the reduction of that value modulo ``ULONG_MAX + 1``.
 
    Returns ``(unsigned long)-1`` on error.  Use :c:func:`PyErr_Occurred` to
@@ -280,12 +280,12 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: unsigned long long PyLong_AsUnsignedLongLongMask(PyObject *obj)
 
-   Return a C :c:type:`unsigned long long` representation of *obj*.  If *obj*
+   Return a C :c:expr:`unsigned long long` representation of *obj*.  If *obj*
    is not an instance of :c:type:`PyLongObject`, first call its
    :meth:`__index__` method (if present) to convert it to a
    :c:type:`PyLongObject`.
 
-   If the value of *obj* is out of range for an :c:type:`unsigned long long`,
+   If the value of *obj* is out of range for an :c:expr:`unsigned long long`,
    return the reduction of that value modulo ``ULLONG_MAX + 1``.
 
    Returns ``(unsigned long long)-1`` on error.  Use :c:func:`PyErr_Occurred`
@@ -300,20 +300,20 @@ distinguished from a number.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 .. c:function:: double PyLong_AsDouble(PyObject *pylong)
 
-   Return a C :c:type:`double` representation of *pylong*.  *pylong* must be
+   Return a C :c:expr:`double` representation of *pylong*.  *pylong* must be
    an instance of :c:type:`PyLongObject`.
 
    Raise :exc:`OverflowError` if the value of *pylong* is out of range for a
-   :c:type:`double`.
+   :c:expr:`double`.
 
    Returns ``-1.0`` on error.  Use :c:func:`PyErr_Occurred` to disambiguate.
 
 
 .. c:function:: void* PyLong_AsVoidPtr(PyObject *pylong)
 
-   Convert a Python integer *pylong* to a C :c:type:`void` pointer.
+   Convert a Python integer *pylong* to a C :c:expr:`void` pointer.
    If *pylong* cannot be converted, an :exc:`OverflowError` will be raised.  This
-   is only assured to produce a usable :c:type:`void` pointer for values created
+   is only assured to produce a usable :c:expr:`void` pointer for values created
    with :c:func:`PyLong_FromVoidPtr`.
 
    Returns ``NULL`` on error.  Use :c:func:`PyErr_Occurred` to disambiguate.
index 7bb0dad..8e25968 100644 (file)
@@ -21,9 +21,9 @@ unmarshalling.  Version 2 uses a binary format for floating point numbers.
 
 .. c:function:: void PyMarshal_WriteLongToFile(long value, FILE *file, int version)
 
-   Marshal a :c:type:`long` integer, *value*, to *file*.  This will only write
+   Marshal a :c:expr:`long` integer, *value*, to *file*.  This will only write
    the least-significant 32 bits of *value*; regardless of the size of the
-   native :c:type:`long` type.  *version* indicates the file format.
+   native :c:expr:`long` type.  *version* indicates the file format.
 
 
 .. c:function:: void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version)
@@ -43,9 +43,9 @@ The following functions allow marshalled values to be read back in.
 
 .. c:function:: long PyMarshal_ReadLongFromFile(FILE *file)
 
-   Return a C :c:type:`long` from the data stream in a :c:type:`FILE*` opened
+   Return a C :c:expr:`long` from the data stream in a :c:expr:`FILE*` opened
    for reading.  Only a 32-bit value can be read in using this function,
-   regardless of the native size of :c:type:`long`.
+   regardless of the native size of :c:expr:`long`.
 
    On error, sets the appropriate exception (:exc:`EOFError`) and returns
    ``-1``.
@@ -53,9 +53,9 @@ The following functions allow marshalled values to be read back in.
 
 .. c:function:: int PyMarshal_ReadShortFromFile(FILE *file)
 
-   Return a C :c:type:`short` from the data stream in a :c:type:`FILE*` opened
+   Return a C :c:expr:`short` from the data stream in a :c:expr:`FILE*` opened
    for reading.  Only a 16-bit value can be read in using this function,
-   regardless of the native size of :c:type:`short`.
+   regardless of the native size of :c:expr:`short`.
 
    On error, sets the appropriate exception (:exc:`EOFError`) and returns
    ``-1``.
@@ -63,7 +63,7 @@ The following functions allow marshalled values to be read back in.
 
 .. c:function:: PyObject* PyMarshal_ReadObjectFromFile(FILE *file)
 
-   Return a Python object from the data stream in a :c:type:`FILE*` opened for
+   Return a Python object from the data stream in a :c:expr:`FILE*` opened for
    reading.
 
    On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
@@ -72,7 +72,7 @@ The following functions allow marshalled values to be read back in.
 
 .. c:function:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file)
 
-   Return a Python object from the data stream in a :c:type:`FILE*` opened for
+   Return a Python object from the data stream in a :c:expr:`FILE*` opened for
    reading.  Unlike :c:func:`PyMarshal_ReadObjectFromFile`, this function
    assumes that no further objects will be read from the file, allowing it to
    aggressively load file data into memory so that the de-serialization can
index 1bdb6a8..1372dc4 100644 (file)
@@ -141,7 +141,7 @@ zero bytes.
 
 .. c:function:: void* PyMem_RawMalloc(size_t n)
 
-   Allocates *n* bytes and returns a pointer of type :c:type:`void*` to the
+   Allocates *n* bytes and returns a pointer of type :c:expr:`void*` to the
    allocated memory, or ``NULL`` if the request fails.
 
    Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as
@@ -152,7 +152,7 @@ zero bytes.
 .. c:function:: void* PyMem_RawCalloc(size_t nelem, size_t elsize)
 
    Allocates *nelem* elements each whose size in bytes is *elsize* and returns
-   a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the
+   a pointer of type :c:expr:`void*` to the allocated memory, or ``NULL`` if the
    request fails. The memory is initialized to zeros.
 
    Requesting zero elements or elements of size zero bytes returns a distinct
@@ -212,7 +212,7 @@ The :ref:`default memory allocator <default-memory-allocators>` uses the
 
 .. c:function:: void* PyMem_Malloc(size_t n)
 
-   Allocates *n* bytes and returns a pointer of type :c:type:`void*` to the
+   Allocates *n* bytes and returns a pointer of type :c:expr:`void*` to the
    allocated memory, or ``NULL`` if the request fails.
 
    Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as
@@ -223,7 +223,7 @@ The :ref:`default memory allocator <default-memory-allocators>` uses the
 .. c:function:: void* PyMem_Calloc(size_t nelem, size_t elsize)
 
    Allocates *nelem* elements each whose size in bytes is *elsize* and returns
-   a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the
+   a pointer of type :c:expr:`void*` to the allocated memory, or ``NULL`` if the
    request fails. The memory is initialized to zeros.
 
    Requesting zero elements or elements of size zero bytes returns a distinct
@@ -265,14 +265,14 @@ The following type-oriented macros are provided for convenience.  Note  that
 .. c:function:: TYPE* PyMem_New(TYPE, size_t n)
 
    Same as :c:func:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes of
-   memory.  Returns a pointer cast to :c:type:`TYPE*`.  The memory will not have
+   memory.  Returns a pointer cast to :c:expr:`TYPE*`.  The memory will not have
    been initialized in any way.
 
 
 .. c:function:: TYPE* PyMem_Resize(void *p, TYPE, size_t n)
 
    Same as :c:func:`PyMem_Realloc`, but the memory block is resized to ``(n *
-   sizeof(TYPE))`` bytes.  Returns a pointer cast to :c:type:`TYPE*`. On return,
+   sizeof(TYPE))`` bytes.  Returns a pointer cast to :c:expr:`TYPE*`. On return,
    *p* will be a pointer to the new memory area, or ``NULL`` in the event of
    failure.
 
@@ -320,7 +320,7 @@ The :ref:`default object allocator <default-memory-allocators>` uses the
 
 .. c:function:: void* PyObject_Malloc(size_t n)
 
-   Allocates *n* bytes and returns a pointer of type :c:type:`void*` to the
+   Allocates *n* bytes and returns a pointer of type :c:expr:`void*` to the
    allocated memory, or ``NULL`` if the request fails.
 
    Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as
@@ -331,7 +331,7 @@ The :ref:`default object allocator <default-memory-allocators>` uses the
 .. c:function:: void* PyObject_Calloc(size_t nelem, size_t elsize)
 
    Allocates *nelem* elements each whose size in bytes is *elsize* and returns
-   a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the
+   a pointer of type :c:expr:`void*` to the allocated memory, or ``NULL`` if the
    request fails. The memory is initialized to zeros.
 
    Requesting zero elements or elements of size zero bytes returns a distinct
index 24f8c93..94ee812 100644 (file)
@@ -55,7 +55,7 @@ any other object.
    *mview* **must** be a memoryview instance; this macro doesn't check its type,
    you must do it yourself or you will risk crashes.
 
-.. c:function:: Py_buffer *PyMemoryView_GET_BASE(PyObject *mview)
+.. c:function:: PyObject *PyMemoryView_GET_BASE(PyObject *mview)
 
    Return either a pointer to the exporting object that the memoryview is based
    on or ``NULL`` if the memoryview has been created by one of the functions
index 94c8d9f..e2ba157 100644 (file)
@@ -64,8 +64,8 @@ Module Objects
    If *module* is not a module object (or a subtype of a module object),
    :exc:`SystemError` is raised and ``NULL`` is returned.
 
-   It is recommended extensions use other :c:func:`PyModule_\*` and
-   :c:func:`PyObject_\*` functions rather than directly manipulate a module's
+   It is recommended extensions use other ``PyModule_*`` and
+   ``PyObject_*`` functions rather than directly manipulate a module's
    :attr:`~object.__dict__`.
 
 
index 07a625b..eef42ca 100644 (file)
@@ -292,7 +292,7 @@ Object Protocol
    is equivalent to the Python expression ``type(o)``. This function increments the
    reference count of the return value. There's really no reason to use this
    function instead of the :c:func:`Py_TYPE()` function, which returns a
-   pointer of type :c:type:`PyTypeObject*`, except when the incremented reference
+   pointer of type :c:expr:`PyTypeObject*`, except when the incremented reference
    count is needed.
 
 
index c1c83b0..0697747 100644 (file)
@@ -27,7 +27,7 @@ the definition of all other Python objects.
    object.  In a normal "release" build, it contains only the object's
    reference count and a pointer to the corresponding type object.
    Nothing is actually declared to be a :c:type:`PyObject`, but every pointer
-   to a Python object can be cast to a :c:type:`PyObject*`.  Access to the
+   to a Python object can be cast to a :c:expr:`PyObject*`.  Access to the
    members must be done by using the macros :c:macro:`Py_REFCNT` and
    :c:macro:`Py_TYPE`.
 
@@ -99,7 +99,7 @@ the definition of all other Python objects.
 
    Return a :term:`borrowed reference`.
 
-   The :c:func:`Py_SET_TYPE` function must be used to set an object type.
+   Use the :c:func:`Py_SET_TYPE` function to set an object type.
 
 
 .. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type)
@@ -137,7 +137,7 @@ the definition of all other Python objects.
 
    Get the size of the Python object *o*.
 
-   The :c:func:`Py_SET_SIZE` function must be used to set an object size.
+   Use the :c:func:`Py_SET_SIZE` function to set an object size.
 
 
 .. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)
@@ -172,7 +172,7 @@ Implementing functions and methods
 .. c:type:: PyCFunction
 
    Type of the functions used to implement most Python callables in C.
-   Functions of this type take two :c:type:`PyObject*` parameters and return
+   Functions of this type take two :c:expr:`PyObject*` parameters and return
    one such value.  If the return value is ``NULL``, an exception shall have
    been set.  If not ``NULL``, the return value is interpreted as the return
    value of the function as exposed in Python.  The function must return a new
@@ -251,10 +251,10 @@ Implementing functions and methods
    +------------------+---------------+-------------------------------+
 
 The :attr:`ml_meth` is a C function pointer.  The functions may be of different
-types, but they always return :c:type:`PyObject*`.  If the function is not of
+types, but they always return :c:expr:`PyObject*`.  If the function is not of
 the :c:type:`PyCFunction`, the compiler will require a cast in the method table.
 Even though :c:type:`PyCFunction` defines the first parameter as
-:c:type:`PyObject*`, it is common that the method implementation uses the
+:c:expr:`PyObject*`, it is common that the method implementation uses the
 specific C type of the *self* object.
 
 The :attr:`ml_flags` field is a bitfield which can include the following flags.
@@ -266,7 +266,7 @@ There are these calling conventions:
 .. data:: METH_VARARGS
 
    This is the typical calling convention, where the methods have the type
-   :c:type:`PyCFunction`. The function expects two :c:type:`PyObject*` values.
+   :c:type:`PyCFunction`. The function expects two :c:expr:`PyObject*` values.
    The first one is the *self* object for methods; for module functions, it is
    the module object.  The second parameter (often called *args*) is a tuple
    object representing all arguments. This parameter is typically processed
@@ -287,7 +287,7 @@ There are these calling conventions:
    Fast calling convention supporting only positional arguments.
    The methods have the type :c:type:`_PyCFunctionFast`.
    The first parameter is *self*, the second parameter is a C array
-   of :c:type:`PyObject*` values indicating the arguments and the third
+   of :c:expr:`PyObject*` values indicating the arguments and the third
    parameter is the number of arguments (the length of the array).
 
    .. versionadded:: 3.7
@@ -303,7 +303,7 @@ There are these calling conventions:
    with methods of type :c:type:`_PyCFunctionFastWithKeywords`.
    Keyword arguments are passed the same way as in the
    :ref:`vectorcall protocol <vectorcall>`:
-   there is an additional fourth :c:type:`PyObject*` parameter
+   there is an additional fourth :c:expr:`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
@@ -339,7 +339,7 @@ There are these calling conventions:
    Methods with a single object argument can be listed with the :const:`METH_O`
    flag, instead of invoking :c:func:`PyArg_ParseTuple` with a ``"O"`` argument.
    They have the type :c:type:`PyCFunction`, with the *self* parameter, and a
-   :c:type:`PyObject*` parameter representing the single argument.
+   :c:expr:`PyObject*` parameter representing the single argument.
 
 
 These two constants are not used to indicate the calling convention but the
@@ -505,7 +505,7 @@ Accessing attributes of extension types
    |             |                  | getter and setter                 |
    +-------------+------------------+-----------------------------------+
 
-   The ``get`` function takes one :c:type:`PyObject*` parameter (the
+   The ``get`` function takes one :c:expr:`PyObject*` parameter (the
    instance) and a function pointer (the associated ``closure``)::
 
       typedef PyObject *(*getter)(PyObject *, void *);
@@ -513,7 +513,7 @@ Accessing attributes of extension types
    It should return a new reference on success or ``NULL`` with a set exception
    on failure.
 
-   ``set`` functions take two :c:type:`PyObject*` parameters (the instance and
+   ``set`` functions take two :c:expr:`PyObject*` parameters (the instance and
    the value to be set) and a function pointer (the associated ``closure``)::
 
       typedef int (*setter)(PyObject *, PyObject *, void *);
index 7cf0a6b..8ea90da 100644 (file)
@@ -105,7 +105,7 @@ Operating System Utilities
 
    Return the current signal handler for signal *i*.  This is a thin wrapper around
    either :c:func:`sigaction` or :c:func:`signal`.  Do not call those functions
-   directly! :c:type:`PyOS_sighandler_t` is a typedef alias for :c:type:`void
+   directly! :c:type:`PyOS_sighandler_t` is a typedef alias for :c:expr:`void
    (\*)(int)`.
 
 
@@ -114,7 +114,7 @@ Operating System Utilities
    Set the signal handler for signal *i* to be *h*; return the old signal handler.
    This is a thin wrapper around either :c:func:`sigaction` or :c:func:`signal`.  Do
    not call those functions directly!  :c:type:`PyOS_sighandler_t` is a typedef
-   alias for :c:type:`void (\*)(int)`.
+   alias for :c:expr:`void (\*)(int)`.
 
 .. c:function:: wchar_t* Py_DecodeLocale(const char* arg, size_t *size)
 
@@ -352,7 +352,7 @@ accessible to C code.  They all work with the current interpreter thread's
    silently abort the operation by raising an error subclassed from
    :class:`Exception` (other errors will not be silenced).
 
-   The hook function is of type :c:type:`int (*)(const char *event, PyObject
+   The hook function is of type :c:expr:`int (*)(const char *event, PyObject
    *args, void *userData)`, where *args* is guaranteed to be a
    :c:type:`PyTupleObject`. The hook function is always called with the GIL
    held by the Python interpreter that raised the event.
index 6919e61..b330cda 100644 (file)
@@ -161,7 +161,7 @@ type.
 .. c:type:: PyStructSequence_Field
 
    Describes a field of a struct sequence. As a struct sequence is modeled as a
-   tuple, all fields are typed as :c:type:`PyObject*`.  The index in the
+   tuple, all fields are typed as :c:expr:`PyObject*`.  The index in the
    :attr:`fields` array of the :c:type:`PyStructSequence_Desc` determines which
    field of the struct sequence is described.
 
index dfda96a..3606800 100644 (file)
@@ -15,8 +15,8 @@ two types exist -- :ref:`GenericAlias <types-genericalias>` and
    Equivalent to calling the Python class
    :class:`types.GenericAlias`.  The *origin* and *args* arguments set the
    ``GenericAlias``\ 's ``__origin__`` and ``__args__`` attributes respectively.
-   *origin* should be a :c:type:`PyTypeObject*`, and *args* can be a
-   :c:type:`PyTupleObject*` or any ``PyObject*``.  If *args* passed is
+   *origin* should be a :c:expr:`PyTypeObject*`, and *args* can be a
+   :c:expr:`PyTupleObject*` or any ``PyObject*``.  If *args* passed is
    not a tuple, a 1-tuple is automatically constructed and ``__args__`` is set
    to ``(args,)``.
    Minimal checking is done for the arguments, so the function will succeed even
index b939d93..21385af 100644 (file)
@@ -7,8 +7,8 @@ Type Objects
 
 Perhaps one of the most important structures of the Python object system is the
 structure that defines a new type: the :c:type:`PyTypeObject` structure.  Type
-objects can be handled using any of the :c:func:`PyObject_\*` or
-:c:func:`PyType_\*` functions, but do not offer much that's interesting to most
+objects can be handled using any of the ``PyObject_*`` or
+``PyType_*`` functions, but do not offer much that's interesting to most
 Python applications. These objects are fundamental to how objects behave, so
 they are very important to the interpreter itself and to any extension module
 that implements new types.
@@ -1483,8 +1483,8 @@ and :c:type:`PyType_Type` effectively act as defaults.)
    If the instances of this type are weakly referenceable, this field is greater
    than zero and contains the offset in the instance structure of the weak
    reference list head (ignoring the GC header, if present); this offset is used by
-   :c:func:`PyObject_ClearWeakRefs` and the :c:func:`PyWeakref_\*` functions.  The
-   instance structure needs to include a field of type :c:type:`PyObject*` which is
+   :c:func:`PyObject_ClearWeakRefs` and the ``PyWeakref_*`` functions.  The
+   instance structure needs to include a field of type :c:expr:`PyObject*` which is
    initialized to ``NULL``.
 
    Do not confuse this field with :c:member:`~PyTypeObject.tp_weaklist`; that is the list head for
@@ -2327,13 +2327,13 @@ Buffer Object Structures
    steps:
 
    (1) Check if the request can be met. If not, raise :c:data:`PyExc_BufferError`,
-       set :c:data:`view->obj` to ``NULL`` and return ``-1``.
+       set :c:expr:`view->obj` to ``NULL`` and return ``-1``.
 
    (2) Fill in the requested fields.
 
    (3) Increment an internal counter for the number of exports.
 
-   (4) Set :c:data:`view->obj` to *exporter* and increment :c:data:`view->obj`.
+   (4) Set :c:expr:`view->obj` to *exporter* and increment :c:expr:`view->obj`.
 
    (5) Return ``0``.
 
@@ -2341,10 +2341,10 @@ Buffer Object Structures
    schemes can be used:
 
    * Re-export: Each member of the tree acts as the exporting object and
-     sets :c:data:`view->obj` to a new reference to itself.
+     sets :c:expr:`view->obj` to a new reference to itself.
 
    * Redirect: The buffer request is redirected to the root object of the
-     tree. Here, :c:data:`view->obj` will be a new reference to the root
+     tree. Here, :c:expr:`view->obj` will be a new reference to the root
      object.
 
    The individual fields of *view* are described in section
@@ -2386,7 +2386,7 @@ Buffer Object Structures
    *view* argument.
 
 
-   This function MUST NOT decrement :c:data:`view->obj`, since that is
+   This function MUST NOT decrement :c:expr:`view->obj`, since that is
    done automatically in :c:func:`PyBuffer_Release` (this scheme is
    useful for breaking reference cycles).
 
index 09ded4c..0ef4ff9 100644 (file)
@@ -17,8 +17,8 @@ of Unicode characters while staying memory efficient.  There are special cases
 for strings where all code points are below 128, 256, or 65536; otherwise, code
 points must be below 1114112 (which is the full Unicode range).
 
-:c:type:`Py_UNICODE*` and UTF-8 representations are created on demand and cached
-in the Unicode object.  The :c:type:`Py_UNICODE*` representation is deprecated
+:c:expr:`Py_UNICODE*` and UTF-8 representations are created on demand and cached
+in the Unicode object.  The :c:expr:`Py_UNICODE*` representation is deprecated
 and inefficient.
 
 Due to the transition between the old APIs and the new APIs, Unicode objects
@@ -30,7 +30,7 @@ can internally be in two states depending on how they were created:
 
 * "legacy" Unicode objects have been created through one of the deprecated
   APIs (typically :c:func:`PyUnicode_FromUnicode`) and only bear the
-  :c:type:`Py_UNICODE*` representation; you will have to call
+  :c:expr:`Py_UNICODE*` representation; you will have to call
   :c:func:`PyUnicode_READY` on them before calling any other API.
 
 .. note::
@@ -58,7 +58,7 @@ Python:
 
 .. c:type:: Py_UNICODE
 
-   This is a typedef of :c:type:`wchar_t`, which is a 16-bit type or 32-bit type
+   This is a typedef of :c:expr:`wchar_t`, which is a 16-bit type or 32-bit type
    depending on the platform.
 
    .. versionchanged:: 3.3
@@ -235,7 +235,7 @@ access internal read-only data of Unicode objects:
    returned buffer is always terminated with an extra null code point.  It
    may also contain embedded null code points, which would cause the string
    to be truncated when used in most C functions.  The ``AS_DATA`` form
-   casts the pointer to :c:type:`const char *`.  The *o* argument has to be
+   casts the pointer to :c:expr:`const char *`.  The *o* argument has to be
    a Unicode object (not checked).
 
    .. versionchanged:: 3.3
@@ -707,7 +707,7 @@ Extension modules can continue using them, as they will not be removed in Python
 
    Return a read-only pointer to the Unicode object's internal
    :c:type:`Py_UNICODE` buffer, or ``NULL`` on error. This will create the
-   :c:type:`Py_UNICODE*` representation of the object if it is not yet
+   :c:expr:`Py_UNICODE*` representation of the object if it is not yet
    available. The buffer is always terminated with an extra null code point.
    Note that the resulting :c:type:`Py_UNICODE` string may also contain
    embedded null code points, which would cause the string to be truncated when
@@ -734,7 +734,7 @@ Extension modules can continue using them, as they will not be removed in Python
 
    Like :c:func:`PyUnicode_AsUnicode`, but also saves the :c:func:`Py_UNICODE`
    array length (excluding the extra null terminator) in *size*.
-   Note that the resulting :c:type:`Py_UNICODE*` string
+   Note that the resulting :c:expr:`Py_UNICODE*` string
    may contain embedded null code points, which would cause the string to be
    truncated when used in most C functions.
 
@@ -853,7 +853,7 @@ argument parsing, the ``"O&"`` converter should be used, passing
    ParseTuple converter: encode :class:`str` objects -- obtained directly or
    through the :class:`os.PathLike` interface -- to :class:`bytes` using
    :c:func:`PyUnicode_EncodeFSDefault`; :class:`bytes` objects are output as-is.
-   *result* must be a :c:type:`PyBytesObject*` which must be released when it is
+   *result* must be a :c:expr:`PyBytesObject*` which must be released when it is
    no longer used.
 
    .. versionadded:: 3.1
@@ -870,7 +870,7 @@ conversion function:
    ParseTuple converter: decode :class:`bytes` objects -- obtained either
    directly or indirectly through the :class:`os.PathLike` interface -- to
    :class:`str` using :c:func:`PyUnicode_DecodeFSDefaultAndSize`; :class:`str`
-   objects are output as-is. *result* must be a :c:type:`PyUnicodeObject*` which
+   objects are output as-is. *result* must be a :c:expr:`PyUnicodeObject*` which
    must be released when it is no longer used.
 
    .. versionadded:: 3.2
@@ -939,11 +939,11 @@ conversion function:
 wchar_t Support
 """""""""""""""
 
-:c:type:`wchar_t` support for platforms which support it:
+:c:expr:`wchar_t` support for platforms which support it:
 
 .. c:function:: PyObject* PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size)
 
-   Create a Unicode object from the :c:type:`wchar_t` buffer *w* of the given *size*.
+   Create a Unicode object from the :c:expr:`wchar_t` buffer *w* of the given *size*.
    Passing ``-1`` as the *size* indicates that the function must itself compute the length,
    using wcslen.
    Return ``NULL`` on failure.
@@ -951,13 +951,13 @@ wchar_t Support
 
 .. c:function:: Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, Py_ssize_t size)
 
-   Copy the Unicode object contents into the :c:type:`wchar_t` buffer *w*.  At most
-   *size* :c:type:`wchar_t` characters are copied (excluding a possibly trailing
-   null termination character).  Return the number of :c:type:`wchar_t` characters
-   copied or ``-1`` in case of an error.  Note that the resulting :c:type:`wchar_t*`
+   Copy the Unicode object contents into the :c:expr:`wchar_t` buffer *w*.  At most
+   *size* :c:expr:`wchar_t` characters are copied (excluding a possibly trailing
+   null termination character).  Return the number of :c:expr:`wchar_t` characters
+   copied or ``-1`` in case of an error.  Note that the resulting :c:expr:`wchar_t*`
    string may or may not be null-terminated.  It is the responsibility of the caller
-   to make sure that the :c:type:`wchar_t*` string is null-terminated in case this is
-   required by the application. Also, note that the :c:type:`wchar_t*` string
+   to make sure that the :c:expr:`wchar_t*` string is null-terminated in case this is
+   required by the application. Also, note that the :c:expr:`wchar_t*` string
    might contain null characters, which would cause the string to be truncated
    when used with most C functions.
 
@@ -967,9 +967,9 @@ wchar_t Support
    Convert the Unicode object to a wide character string. The output string
    always ends with a null character. If *size* is not ``NULL``, write the number
    of wide characters (excluding the trailing null termination character) into
-   *\*size*. Note that the resulting :c:type:`wchar_t` string might contain
+   *\*size*. Note that the resulting :c:expr:`wchar_t` string might contain
    null characters, which would cause the string to be truncated when used with
-   most C functions. If *size* is ``NULL`` and the :c:type:`wchar_t*` string
+   most C functions. If *size* is ``NULL`` and the :c:expr:`wchar_t*` string
    contains null characters a :exc:`ValueError` is raised.
 
    Returns a buffer allocated by :c:func:`PyMem_Alloc` (use
@@ -980,7 +980,7 @@ wchar_t Support
    .. versionadded:: 3.2
 
    .. versionchanged:: 3.7
-      Raises a :exc:`ValueError` if *size* is ``NULL`` and the :c:type:`wchar_t*`
+      Raises a :exc:`ValueError` if *size* is ``NULL`` and the :c:expr:`wchar_t*`
       string contains null characters.
 
 
index 5b8735d..628e628 100644 (file)
@@ -16,11 +16,11 @@ parameter.  The available start symbols are :const:`Py_eval_input`,
 :const:`Py_file_input`, and :const:`Py_single_input`.  These are described
 following the functions which accept them as parameters.
 
-Note also that several of these functions take :c:type:`FILE*` parameters.  One
-particular issue which needs to be handled carefully is that the :c:type:`FILE`
+Note also that several of these functions take :c:expr:`FILE*` parameters.  One
+particular issue which needs to be handled carefully is that the :c:expr:`FILE`
 structure for different C libraries can be different and incompatible.  Under
 Windows (at least), it is possible for dynamically linked extensions to actually
-use different libraries, so care should be taken that :c:type:`FILE*` parameters
+use different libraries, so care should be taken that :c:expr:`FILE*` parameters
 are only passed to these functions if it is certain that they were created by
 the same library that the Python runtime is using.
 
@@ -82,7 +82,7 @@ the same library that the Python runtime is using.
 .. c:function:: int PyRun_SimpleString(const char *command)
 
    This is a simplified interface to :c:func:`PyRun_SimpleStringFlags` below,
-   leaving the :c:type:`PyCompilerFlags`\* argument set to ``NULL``.
+   leaving the :c:struct:`PyCompilerFlags`\* argument set to ``NULL``.
 
 
 .. c:function:: int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
@@ -344,7 +344,7 @@ the same library that the Python runtime is using.
    interpreter loop.
 
 
-.. c:type:: struct PyCompilerFlags
+.. c:struct:: PyCompilerFlags
 
    This is the structure used to hold compiler flags.  In cases where code is only
    being compiled, it is passed as ``int flags``, and in cases where code is being
index 8fdff79..178e520 100644 (file)
@@ -234,13 +234,3 @@ linkcheck_ignore = [r'https://bugs.python.org/(issue)?\d+',
 # Relative filename of the data files
 refcount_file = 'data/refcounts.dat'
 stable_abi_file = 'data/stable_abi.dat'
-
-# Sphinx 2 and Sphinx 3 compatibility
-# -----------------------------------
-
-# bpo-40204: Allow Sphinx 2 syntax in the C domain
-c_allow_pre_v3 = True
-
-# bpo-40204: Disable warnings on Sphinx 2 syntax of the C domain since the
-# documentation is built with -W (warnings treated as errors).
-c_warn_on_allowed_pre_v3 = False
index 2e3362b..d9bf4fd 100644 (file)
@@ -157,16 +157,16 @@ since you should be able to tell from the return value.
 
 When a function *f* that calls another function *g* detects that the latter
 fails, *f* should itself return an error value (usually ``NULL`` or ``-1``).  It
-should *not* call one of the :c:func:`PyErr_\*` functions --- one has already
+should *not* call one of the ``PyErr_*`` functions --- one has already
 been called by *g*. *f*'s caller is then supposed to also return an error
-indication to *its* caller, again *without* calling :c:func:`PyErr_\*`, and so on
+indication to *its* caller, again *without* calling ``PyErr_*``, and so on
 --- the most detailed cause of the error was already reported by the function
 that first detected it.  Once the error reaches the Python interpreter's main
 loop, this aborts the currently executing Python code and tries to find an
 exception handler specified by the Python programmer.
 
 (There are situations where a module can actually give a more detailed error
-message by calling another :c:func:`PyErr_\*` function, and in such cases it is
+message by calling another ``PyErr_*`` function, and in such cases it is
 fine to do so.  As a general rule, however, this is not necessary, and can cause
 information about the cause of the error to be lost: most operations can fail
 for a variety of reasons.)
@@ -298,7 +298,7 @@ In this case, it will return an integer object.  (Yes, even integers are objects
 on the heap in Python!)
 
 If you have a C function that returns no useful argument (a function returning
-:c:type:`void`), the corresponding Python function must return ``None``.   You
+:c:expr:`void`), the corresponding Python function must return ``None``.   You
 need this idiom to do so (which is implemented by the :c:macro:`Py_RETURN_NONE`
 macro)::
 
@@ -1171,7 +1171,7 @@ other extension modules must be exported in a different way.
 
 Python provides a special mechanism to pass C-level information (pointers) from
 one extension module to another one: Capsules. A Capsule is a Python data type
-which stores a pointer (:c:type:`void \*`).  Capsules can only be created and
+which stores a pointer (:c:expr:`void \*`).  Capsules can only be created and
 accessed via their C API, but they can be passed around like any other Python
 object. In particular,  they can be assigned to a name in an extension module's
 namespace. Other extension modules can then import this module, retrieve the
@@ -1185,7 +1185,7 @@ different ways between the module providing the code and the client modules.
 
 Whichever method you choose, it's important to name your Capsules properly.
 The function :c:func:`PyCapsule_New` takes a name parameter
-(:c:type:`const char \*`); you're permitted to pass in a ``NULL`` name, but
+(:c:expr:`const char \*`); you're permitted to pass in a ``NULL`` name, but
 we strongly encourage you to specify a name.  Properly named Capsules provide
 a degree of runtime type-safety; there is no feasible way to tell one unnamed
 Capsule from another.
@@ -1203,7 +1203,7 @@ of certainty that the Capsule they load contains the correct C API.
 The following example demonstrates an approach that puts most of the burden on
 the writer of the exporting module, which is appropriate for commonly used
 library modules. It stores all C API pointers (just one in the example!) in an
-array of :c:type:`void` pointers which becomes the value of a Capsule. The header
+array of :c:expr:`void` pointers which becomes the value of a Capsule. The header
 file corresponding to the module provides a macro that takes care of importing
 the module and retrieving its C API pointers; client modules only have to call
 this macro before accessing the C API.
index c7c434e..5ba6383 100644 (file)
@@ -207,8 +207,8 @@ a special case, for which the new value passed to the handler is ``NULL``.
 
 Python supports two pairs of attribute handlers; a type that supports attributes
 only needs to implement the functions for one pair.  The difference is that one
-pair takes the name of the attribute as a :c:type:`char\*`, while the other
-accepts a :c:type:`PyObject\*`.  Each type can use whichever pair makes more
+pair takes the name of the attribute as a :c:expr:`char\*`, while the other
+accepts a :c:expr:`PyObject*`.  Each type can use whichever pair makes more
 sense for the implementation's convenience. ::
 
    getattrfunc  tp_getattr;        /* char * version */
@@ -219,7 +219,7 @@ sense for the implementation's convenience. ::
 
 If accessing attributes of an object is always a simple operation (this will be
 explained shortly), there are generic implementations which can be used to
-provide the :c:type:`PyObject\*` version of the attribute management functions.
+provide the :c:expr:`PyObject*` version of the attribute management functions.
 The actual need for type-specific attribute handlers almost completely
 disappeared starting with Python 2.2, though there are many examples which have
 not been updated to use some of the new generic mechanism that is available.
@@ -339,9 +339,9 @@ of ``NULL`` is required.
 Type-specific Attribute Management
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-For simplicity, only the :c:type:`char\*` version will be demonstrated here; the
-type of the name parameter is the only difference between the :c:type:`char\*`
-and :c:type:`PyObject\*` flavors of the interface. This example effectively does
+For simplicity, only the :c:expr:`char\*` version will be demonstrated here; the
+type of the name parameter is the only difference between the :c:expr:`char\*`
+and :c:expr:`PyObject*` flavors of the interface. This example effectively does
 the same thing as the generic example above, but does not use the generic
 support added in Python 2.2.  It explains how the handler functions are
 called, so that if you do need to extend their functionality, you'll understand
@@ -572,7 +572,7 @@ performance-critical objects (such as numbers).
 
 For an object to be weakly referencable, the extension type must do two things:
 
-#. Include a :c:type:`PyObject\*` field in the C object structure dedicated to
+#. Include a :c:expr:`PyObject*` field in the C object structure dedicated to
    the weak reference mechanism.  The object's constructor should leave it
    ``NULL`` (which is automatic when using the default
    :c:member:`~PyTypeObject.tp_alloc`).
index 34c25d1..5d4a3f0 100644 (file)
@@ -24,7 +24,7 @@ The Basics
 ==========
 
 The :term:`CPython` runtime sees all Python objects as variables of type
-:c:type:`PyObject\*`, which serves as a "base type" for all Python objects.
+:c:expr:`PyObject*`, which serves as a "base type" for all Python objects.
 The :c:type:`PyObject` structure itself only contains the object's
 :term:`reference count` and a pointer to the object's "type object".
 This is where the action is; the type object determines which (C) functions
index 318e355..0728263 100644 (file)
@@ -51,7 +51,7 @@ If you need to interface to some C or C++ library for which no Python extension
 currently exists, you can try wrapping the library's data types and functions
 with a tool such as `SWIG <https://www.swig.org>`_.  `SIP
 <https://riverbankcomputing.com/software/sip/intro>`__, `CXX
-<http://cxx.sourceforge.net/>`_ `Boost
+<https://cxx.sourceforge.net/>`_ `Boost
 <https://www.boost.org/libs/python/doc/index.html>`_, or `Weave
 <https://github.com/scipy/weave>`_ are also
 alternatives for wrapping C++ libraries.
index f77bf7e..7f64d84 100644 (file)
@@ -182,7 +182,7 @@ at https://docs.python.org/3/.  PDF, plain text, and downloadable HTML versions
 also available at https://docs.python.org/3/download.html.
 
 The documentation is written in reStructuredText and processed by `the Sphinx
-documentation tool <http://sphinx-doc.org/>`__.  The reStructuredText source for
+documentation tool <https://www.sphinx-doc.org/>`__.  The reStructuredText source for
 the documentation is part of the Python source distribution.
 
 
@@ -270,7 +270,7 @@ Where in the world is www.python.org located?
 ---------------------------------------------
 
 The Python project's infrastructure is located all over the world and is managed
-by the Python Infrastructure Team. Details `here <http://infra.psf.io>`__.
+by the Python Infrastructure Team. Details `here <https://infra.psf.io>`__.
 
 
 Why is it called Python?
@@ -335,7 +335,7 @@ Consulting the proceedings for `past Python conferences
 different companies and organizations.
 
 High-profile Python projects include `the Mailman mailing list manager
-<http://www.list.org>`_ and `the Zope application server
+<https://www.list.org>`_ and `the Zope application server
 <https://www.zope.dev>`_.  Several Linux distributions, most notably `Red Hat
 <https://www.redhat.com>`_, have written part or all of their installer and
 system administration software in Python.  Companies that use Python internally
index 86c56d9..023ffdf 100644 (file)
@@ -49,7 +49,7 @@ environment variables.
 To get truly stand-alone applications, the Tcl scripts that form the library
 have to be integrated into the application as well. One tool supporting that is
 SAM (stand-alone modules), which is part of the Tix distribution
-(http://tix.sourceforge.net/).
+(https://tix.sourceforge.net/).
 
 Build Tix with SAM enabled, perform the appropriate call to
 :c:func:`Tclsam_init`, etc. inside Python's
index 8167bf2..a9cde45 100644 (file)
@@ -180,8 +180,8 @@ How do I create documentation from doc strings?
 
 The :mod:`pydoc` module can create HTML from the doc strings in your Python
 source code.  An alternative for creating API documentation purely from
-docstrings is `epydoc <http://epydoc.sourceforge.net/>`_.  `Sphinx
-<http://sphinx-doc.org>`_ can also include docstring content.
+docstrings is `epydoc <https://epydoc.sourceforge.net/>`_.  `Sphinx
+<https://www.sphinx-doc.org>`_ can also include docstring content.
 
 
 How do I get a single keypress at a time?
@@ -609,7 +609,7 @@ use ``p.read(n)``.
    substituted for standard input and output.  You will have to use pseudo ttys
    ("ptys") instead of pipes. Or you can use a Python interface to Don Libes'
    "expect" library.  A Python extension that interfaces to expect is called
-   "expy" and available from http://expectpy.sourceforge.net.  A pure Python
+   "expy" and available from https://expectpy.sourceforge.net.  A pure Python
    solution that works like expect is `pexpect
    <https://pypi.org/project/pexpect/>`_.
 
index 79176d0..a33774a 100644 (file)
@@ -35,7 +35,7 @@ debugging non-PythonWin programs.  PythonWin is available as part of
 as a part of the
 `ActivePython <https://www.activestate.com/products/python/>`_ distribution.
 
-`Eric <http://eric-ide.python-projects.org/>`_ is an IDE built on PyQt
+`Eric <https://eric-ide.python-projects.org/>`_ is an IDE built on PyQt
 and the Scintilla editing component.
 
 `trepan3k <https://github.com/rocky/python3-trepan/>`_ is a gdb-like debugger.
@@ -99,7 +99,7 @@ executables:
 * `PyOxidizer <https://pyoxidizer.readthedocs.io/en/stable/>`_ (Cross-platform)
 * `cx_Freeze <https://marcelotduarte.github.io/cx_Freeze/>`_ (Cross-platform)
 * `py2app <https://github.com/ronaldoussoren/py2app>`_ (macOS only)
-* `py2exe <http://www.py2exe.org/>`_ (Windows only)
+* `py2exe <https://www.py2exe.org/>`_ (Windows only)
 
 Are there coding standards or a style guide for Python programs?
 ----------------------------------------------------------------
@@ -735,7 +735,7 @@ Is it possible to write obfuscated one-liners in Python?
 --------------------------------------------------------
 
 Yes.  Usually this is done by nesting :keyword:`lambda` within
-:keyword:`!lambda`.  See the following three examples, due to Ulf Bartelt::
+:keyword:`!lambda`.  See the following three examples, slightly adapted from Ulf Bartelt::
 
    from functools import reduce
 
@@ -748,7 +748,7 @@ Yes.  Usually this is done by nesting :keyword:`lambda` within
    f(x,f), range(10))))
 
    # Mandelbrot set
-   print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,
+   print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+'\n'+y,map(lambda y,
    Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,
    Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
    i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y
@@ -1270,7 +1270,7 @@ use a list comprehension::
    A = [[None] * w for i in range(h)]
 
 Or, you can use an extension that provides a matrix datatype; `NumPy
-<http://www.numpy.org/>`_ is the best known.
+<https://numpy.org/>`_ is the best known.
 
 
 How do I apply a method to a sequence of objects?
index 4f50b3f..e9a573d 100644 (file)
@@ -276,3 +276,11 @@ How do I check for a keypress without blocking?
 Use the :mod:`msvcrt` module.  This is a standard Windows-specific extension module.
 It defines a function ``kbhit()`` which checks whether a keyboard hit is
 present, and ``getch()`` which gets one character without echoing it.
+
+How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?
+-------------------------------------------------------------------
+
+This can occur on Python 3.5 and later when using Windows 8.1 or earlier without all updates having been installed.
+First ensure your operating system is supported and is up to date, and if that does not resolve the issue,
+visit the `Microsoft support page <https://support.microsoft.com/en-us/help/3118401/>`_
+for guidance on manually installing the C Runtime update.
index 24daf19..aa9768f 100644 (file)
@@ -136,10 +136,17 @@ Glossary
       :exc:`StopAsyncIteration` exception.  Introduced by :pep:`492`.
 
    attribute
-      A value associated with an object which is referenced by name using
-      dotted expressions.  For example, if an object *o* has an attribute
+      A value associated with an object which is usually referenced by name
+      using dotted expressions.
+      For example, if an object *o* has an attribute
       *a* it would be referenced as *o.a*.
 
+      It is possible to give an object an attribute whose name is not an
+      identifier as defined by :ref:`identifiers`, for example using
+      :func:`setattr`, if the object allows it.
+      Such an attribute will not be accessible using a dotted expression,
+      and would instead need to be retrieved with :func:`getattr`.
+
    awaitable
       An object that can be used in an :keyword:`await` expression.  Can be
       a :term:`coroutine` or an object with an :meth:`__await__` method.
index 6e7719e..0c6f488 100644 (file)
@@ -847,7 +847,7 @@ afterwards, :meth:`__set_name__` will need to be called manually.
 ORM example
 -----------
 
-The following code is simplified skeleton showing how data descriptors could
+The following code is simplified skeleton showing how data descriptors could
 be used to implement an `object relational mapping
 <https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping>`_.
 
@@ -1533,6 +1533,8 @@ by member descriptors:
         def __get__(self, obj, objtype=None):
             'Emulate member_get() in Objects/descrobject.c'
             # Also see PyMember_GetOne() in Python/structmember.c
+            if obj is None:
+                return self
             value = obj._slotvalues[self.offset]
             if value is null:
                 raise AttributeError(self.name)
@@ -1561,13 +1563,13 @@ variables:
     class Type(type):
         'Simulate how the type metaclass adds member objects for slots'
 
-        def __new__(mcls, clsname, bases, mapping):
+        def __new__(mcls, clsname, bases, mapping, **kwargs):
             'Emulate type_new() in Objects/typeobject.c'
             # type_new() calls PyTypeReady() which calls add_methods()
             slot_names = mapping.get('slot_names', [])
             for offset, name in enumerate(slot_names):
                 mapping[name] = Member(name, clsname, offset)
-            return type.__new__(mcls, clsname, bases, mapping)
+            return type.__new__(mcls, clsname, bases, mapping, **kwargs)
 
 The :meth:`object.__new__` method takes care of creating instances that have
 slots instead of an instance dictionary.  Here is a rough simulation in pure
@@ -1578,7 +1580,7 @@ Python:
     class Object:
         'Simulate how object.__new__() allocates memory for __slots__'
 
-        def __new__(cls, *args):
+        def __new__(cls, *args, **kwargs):
             'Emulate object_new() in Objects/typeobject.c'
             inst = super().__new__(cls)
             if hasattr(cls, 'slot_names'):
@@ -1591,7 +1593,7 @@ Python:
             cls = type(self)
             if hasattr(cls, 'slot_names') and name not in cls.slot_names:
                 raise AttributeError(
-                    f'{type(self).__name__!r} object has no attribute {name!r}'
+                    f'{cls.__name__!r} object has no attribute {name!r}'
                 )
             super().__setattr__(name, value)
 
@@ -1600,7 +1602,7 @@ Python:
             cls = type(self)
             if hasattr(cls, 'slot_names') and name not in cls.slot_names:
                 raise AttributeError(
-                    f'{type(self).__name__!r} object has no attribute {name!r}'
+                    f'{cls.__name__!r} object has no attribute {name!r}'
                 )
             super().__delattr__(name)
 
index 16df3b7..5b07974 100644 (file)
@@ -397,6 +397,14 @@ which, when run, will produce:
 
     MainThread: Look out!
 
+.. note:: Although the earlier discussion wasn't specifically talking about
+   async code, but rather about slow logging handlers, it should be noted that
+   when logging from async code, network and even file handlers could lead to
+   problems (blocking the event loop) because some logging is done from
+   :mod:`asyncio` internals. It might be best, if any async code is used in an
+   application, to use the above approach for logging, so that any blocking code
+   runs only in the ``QueueListener`` thread.
+
 .. versionchanged:: 3.5
    Prior to Python 3.5, the :class:`QueueListener` always passed every message
    received from the queue to every handler it was initialized with. (This was
index 4969d24..ca09aee 100644 (file)
@@ -517,7 +517,7 @@ References
 
 Some good alternative discussions of Python's Unicode support are:
 
-* `Processing Text Files in Python 3 <http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html>`_, by Nick Coghlan.
+* `Processing Text Files in Python 3 <https://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html>`_, by Nick Coghlan.
 * `Pragmatic Unicode <https://nedbatchelder.com/text/unipain.html>`_, a PyCon 2012 presentation by Ned Batchelder.
 
 The :class:`str` type is described in the Python library reference at
index 5ea84e6..8d0b4e6 100644 (file)
@@ -8,8 +8,15 @@ import webbrowser
 from email import policy
 from email.parser import BytesParser
 
-# An imaginary module that would make this work and be safe.
-from imaginary import magic_html_parser
+
+def magic_html_parser(html_text, partfiles):
+    """Return safety-sanitized html linked to partfiles.
+
+    Rewrite the href="cid:...." attributes to point to the filenames in partfiles.
+    Though not trivial, this should be possible using html.parser.
+    """
+    raise NotImplementedError("Add the magic needed")
+
 
 # In a real program you'd get the filename from the arguments.
 with open('outgoing.msg', 'rb') as fp:
@@ -62,9 +69,6 @@ else:
     print("Don't know how to display {}".format(richest.get_content_type()))
     sys.exit()
 with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
-    # The magic_html_parser has to rewrite the href="cid:...." attributes to
-    # point to the filenames in partfiles.  It also has to do a safety-sanitize
-    # of the html.  It could be written using html.parser.
     f.write(magic_html_parser(body.get_content(), partfiles))
 webbrowser.open(f.name)
 os.remove(f.name)
index 9b9e32a..1fa6e61 100644 (file)
@@ -71,7 +71,7 @@ def first_sunday_on_or_after(dt):
 # DST start and end times. For a complete and up-to-date set of DST rules
 # and timezone definitions, visit the Olson Database (or try pytz):
 # http://www.twinsun.com/tz/tz-link.htm
-# http://sourceforge.net/projects/pytz/ (might not be up-to-date)
+# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
 #
 # In the US, since 2007, DST starts at 2am (standard time) on the second
 # Sunday in March, which is the first Sunday on or after Mar 8.
index 1e6452b..9272456 100644 (file)
@@ -155,21 +155,21 @@ This module defines the following constants and functions:
 Lock objects have the following methods:
 
 
-.. method:: lock.acquire(waitflag=1, timeout=-1)
+.. method:: lock.acquire(blocking=True, timeout=-1)
 
    Without any optional argument, this method acquires the lock unconditionally, if
    necessary waiting until it is released by another thread (only one thread at a
    time can acquire a lock --- that's their reason for existence).
 
-   If the integer *waitflag* argument is present, the action depends on its
-   value: if it is zero, the lock is only acquired if it can be acquired
-   immediately without waiting, while if it is nonzero, the lock is acquired
+   If the *blocking* argument is present, the action depends on its
+   value: if it is False, the lock is only acquired if it can be acquired
+   immediately without waiting, while if it is True, the lock is acquired
    unconditionally as above.
 
    If the floating-point *timeout* argument is present and positive, it
    specifies the maximum wait time in seconds before returning.  A negative
    *timeout* argument specifies an unbounded wait.  You cannot specify
-   a *timeout* if *waitflag* is zero.
+   a *timeout* if *blocking* is False.
 
    The return value is ``True`` if the lock is acquired successfully,
    ``False`` if not.
index bbafcee..17ab87f 100644 (file)
@@ -1959,20 +1959,28 @@ and classes for traversing abstract syntax trees:
 
 .. function:: literal_eval(node_or_string)
 
-   Safely evaluate an expression node or a string containing a Python literal or
+   Evaluate an expression node or a string containing only a Python literal or
    container display.  The string or node provided may only consist of the
    following Python literal structures: strings, bytes, numbers, tuples, lists,
    dicts, sets, booleans, ``None`` and ``Ellipsis``.
 
-   This can be used for safely evaluating strings containing Python values from
-   untrusted sources without the need to parse the values oneself.  It is not
-   capable of evaluating arbitrarily complex expressions, for example involving
-   operators or indexing.
+   This can be used for evaluating strings containing Python values without the
+   need to parse the values oneself.  It is not capable of evaluating
+   arbitrarily complex expressions, for example involving operators or
+   indexing.
+
+   This function had been documented as "safe" in the past without defining
+   what that meant. That was misleading. This is specifically designed not to
+   execute Python code, unlike the more general :func:`eval`. There is no
+   namespace, no name lookups, or ability to call out. But it is not free from
+   attack: A relatively small input can lead to memory exhaustion or to C stack
+   exhaustion, crashing the process. There is also the possibility for
+   excessive CPU consumption denial of service on some inputs. Calling it on
+   untrusted data is thus not recommended.
 
    .. warning::
-      It is possible to crash the Python interpreter with a
-      sufficiently large/complex string due to stack depth limitations
-      in Python's AST compiler.
+      It is possible to crash the Python interpreter due to stack depth
+      limitations in Python's AST compiler.
 
       It can raise :exc:`ValueError`, :exc:`TypeError`, :exc:`SyntaxError`,
       :exc:`MemoryError` and :exc:`RecursionError` depending on the malformed
@@ -2237,7 +2245,7 @@ to stdout.  Otherwise, the content is read from stdin.
     code that generated them. This is helpful for tools that make source code
     transformations.
 
-    `leoAst.py <http://leoeditor.com/appendices.html#leoast-py>`_ unifies the
+    `leoAst.py <https://leoeditor.com/appendices.html#leoast-py>`_ unifies the
     token-based and parse-tree-based views of python programs by inserting
     two-way links between tokens and ast nodes.
 
index 02a0003..7ed597a 100644 (file)
@@ -109,7 +109,7 @@ that the event loop runs in.
 
 There is currently no way to schedule coroutines or callbacks directly
 from a different process (such as one started with
-:mod:`multiprocessing`). The :ref:`Event Loop Methods <asyncio-event-loop>`
+:mod:`multiprocessing`). The :ref:`asyncio-event-loop-methods`
 section lists APIs that can read from pipes and watch file descriptors
 without blocking the event loop. In addition, asyncio's
 :ref:`Subprocess <asyncio-subprocess>` APIs provide a way to start a
@@ -148,6 +148,10 @@ adjusted::
    logging.getLogger("asyncio").setLevel(logging.WARNING)
 
 
+Network logging can block the event loop. It is recommended to use
+a separate thread for handling logs or use non-blocking IO.
+
+
 .. _asyncio-coroutine-not-scheduled:
 
 Detect never-awaited coroutines
index 0e66b3e..343672d 100644 (file)
@@ -1,6 +1,8 @@
 .. currentmodule:: asyncio
 
 
+.. _asyncio-event-loop:
+
 ==========
 Event Loop
 ==========
@@ -92,7 +94,7 @@ This documentation page contains the following sections:
   loop APIs.
 
 
-.. _asyncio-event-loop:
+.. _asyncio-event-loop-methods:
 
 Event Loop Methods
 ==================
@@ -448,6 +450,12 @@ Opening network connections
      *happy_eyeballs_delay*, *interleave*
      and *local_addr* should be specified.
 
+     .. note::
+
+        The *sock* argument transfers ownership of the socket to the
+        transport created. To close the socket, call the transport's
+        :meth:`~asyncio.BaseTransport.close` method.
+
    * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used
      to bind the socket locally.  The *local_host* and *local_port*
      are looked up using ``getaddrinfo()``, similarly to *host* and *port*.
@@ -553,6 +561,12 @@ Opening network connections
      transport. If specified, *local_addr* and *remote_addr* should be omitted
      (must be :const:`None`).
 
+     .. note::
+
+        The *sock* argument transfers ownership of the socket to the
+        transport created. To close the socket, call the transport's
+        :meth:`~asyncio.BaseTransport.close` method.
+
    See :ref:`UDP echo client protocol <asyncio-udp-echo-client-protocol>` and
    :ref:`UDP echo server protocol <asyncio-udp-echo-server-protocol>` examples.
 
@@ -642,6 +656,12 @@ Creating network servers
    * *sock* can optionally be specified in order to use a preexisting
      socket object. If specified, *host* and *port* must not be specified.
 
+     .. note::
+
+        The *sock* argument transfers ownership of the socket to the
+        server created. To close the socket, call the server's
+        :meth:`~asyncio.Server.close` method.
+
    * *backlog* is the maximum number of queued connections passed to
      :meth:`~socket.socket.listen` (defaults to 100).
 
@@ -727,6 +747,12 @@ Creating network servers
    * *sock* is a preexisting socket object returned from
      :meth:`socket.accept <socket.socket.accept>`.
 
+     .. note::
+
+        The *sock* argument transfers ownership of the socket to the
+        transport created. To close the socket, call the transport's
+        :meth:`~asyncio.BaseTransport.close` method.
+
    * *ssl* can be set to an :class:`~ssl.SSLContext` to enable SSL over
      the accepted connections.
 
@@ -1498,6 +1524,7 @@ Do not instantiate the class directly.
 
 
 .. _asyncio-event-loops:
+.. _asyncio-event-loop-implementations:
 
 Event Loop Implementations
 ==========================
@@ -1520,9 +1547,12 @@ on Unix and :class:`ProactorEventLoop` on Windows.
       import asyncio
       import selectors
 
-      selector = selectors.SelectSelector()
-      loop = asyncio.SelectorEventLoop(selector)
-      asyncio.set_event_loop(loop)
+      class MyPolicy(asyncio.DefaultEventLoopPolicy):
+         def new_event_loop(self):
+            selector = selectors.SelectSelector()
+            return asyncio.SelectorEventLoop(selector)
+
+      asyncio.set_event_loop_policy(MyPolicy())
 
 
    .. availability:: Unix, Windows.
@@ -1544,7 +1574,7 @@ on Unix and :class:`ProactorEventLoop` on Windows.
 
    Abstract base class for asyncio-compliant event loops.
 
-   The :ref:`Event Loop Methods <asyncio-event-loop>` section lists all
+   The :ref:`asyncio-event-loop-methods` section lists all
    methods that an alternative implementation of ``AbstractEventLoop``
    should have defined.
 
index 7426e82..70cec9b 100644 (file)
@@ -55,7 +55,7 @@ Future Functions
       preferred way for creating new Tasks.
 
       Save a reference to the result of this function, to avoid
-      a task disappearing mid execution.
+      a task disappearing mid-execution.
 
    .. versionchanged:: 3.5.1
       The function accepts any :term:`awaitable` object.
@@ -85,7 +85,8 @@ Future Object
 
    Future is an :term:`awaitable` object.  Coroutines can await on
    Future objects until they either have a result or an exception
-   set, or until they are cancelled.
+   set, or until they are cancelled. A Future can be awaited multiple
+   times and the result is same.
 
    Typically Futures are used to enable low-level
    callback-based code (e.g. in protocols implemented using asyncio
index 0315d2e..63ab148 100644 (file)
@@ -37,7 +37,7 @@ Event Loop Methods
 ==================
 
 See also the main documentation section about the
-:ref:`event loop methods <asyncio-event-loop>`.
+:ref:`asyncio-event-loop-methods`.
 
 .. rubric:: Lifecycle
 .. list-table::
index ef6a058..bfc3e30 100644 (file)
@@ -7,22 +7,29 @@
 Policies
 ========
 
-An event loop policy is a global per-process object that controls
-the management of the event loop. Each event loop has a default
-policy, which can be changed and customized using the policy API.
-
-A policy defines the notion of *context* and manages a
-separate event loop per context. The default policy
-defines *context* to be the current thread.
-
-By using a custom event loop policy, the behavior of
-:func:`get_event_loop`, :func:`set_event_loop`, and
-:func:`new_event_loop` functions can be customized.
+An event loop policy is a global object
+used to get and set the current :ref:`event loop <asyncio-event-loop>`,
+as well as create new event loops.
+The default policy can be :ref:`replaced <asyncio-policy-get-set>` with
+:ref:`built-in alternatives <asyncio-policy-builtin>`
+to use different event loop implementations,
+or substituted by a :ref:`custom policy <asyncio-custom-policies>`
+that can override these behaviors.
+
+The :ref:`policy object <asyncio-policy-objects>`
+gets and sets a separate event loop per *context*.
+This is per-thread by default,
+though custom policies could define *context* differently.
+
+Custom event loop policies can control the behavior of
+:func:`get_event_loop`, :func:`set_event_loop`, and :func:`new_event_loop`.
 
 Policy objects should implement the APIs defined
 in the :class:`AbstractEventLoopPolicy` abstract base class.
 
 
+.. _asyncio-policy-get-set:
+
 Getting and Setting the Policy
 ==============================
 
@@ -40,6 +47,8 @@ for the current process:
    If *policy* is set to ``None``, the default policy is restored.
 
 
+.. _asyncio-policy-objects:
+
 Policy Objects
 ==============
 
@@ -86,6 +95,8 @@ The abstract event loop policy base class is defined as follows:
       This function is Unix specific.
 
 
+.. _asyncio-policy-builtin:
+
 asyncio ships with the following built-in policies:
 
 
@@ -117,6 +128,7 @@ asyncio ships with the following built-in policies:
 
    .. availability:: Windows.
 
+
 .. _asyncio-watchers:
 
 Process Watchers
@@ -270,6 +282,8 @@ implementation used by the asyncio event loop:
    .. versionadded:: 3.9
 
 
+.. _asyncio-custom-policies:
+
 Custom Policies
 ===============
 
index 65f3d53..19210a5 100644 (file)
@@ -67,6 +67,12 @@ and work with streams:
    The rest of the arguments are passed directly to
    :meth:`loop.create_connection`.
 
+   .. note::
+
+      The *sock* argument transfers ownership of the socket to the
+      :class:`StreamWriter` created. To close the socket, call its
+      :meth:`~asyncio.StreamWriter.close` method.
+
    .. versionchanged:: 3.7
       Added the *ssl_handshake_timeout* parameter.
 
@@ -103,6 +109,12 @@ and work with streams:
    The rest of the arguments are passed directly to
    :meth:`loop.create_server`.
 
+   .. note::
+
+      The *sock* argument transfers ownership of the socket to the
+      server created. To close the socket, call the server's
+      :meth:`~asyncio.Server.close` method.
+
    .. versionchanged:: 3.7
       Added the *ssl_handshake_timeout* and *start_serving* parameters.
 
@@ -123,6 +135,12 @@ and work with streams:
 
    See also the documentation of :meth:`loop.create_unix_connection`.
 
+   .. note::
+
+      The *sock* argument transfers ownership of the socket to the
+      :class:`StreamWriter` created. To close the socket, call its
+      :meth:`~asyncio.StreamWriter.close` method.
+
    .. availability:: Unix.
 
    .. versionchanged:: 3.7
@@ -143,6 +161,12 @@ and work with streams:
 
    See also the documentation of :meth:`loop.create_unix_server`.
 
+   .. note::
+
+      The *sock* argument transfers ownership of the socket to the
+      server created. To close the socket, call the server's
+      :meth:`~asyncio.Server.close` method.
+
    .. availability:: Unix.
 
    .. versionchanged:: 3.7
index e535a5b..8f9cef7 100644 (file)
@@ -262,9 +262,9 @@ Creating Tasks
    .. important::
 
       Save a reference to the result of this function, to avoid
-      a task disappearing mid execution. The event loop only keeps
+      a task disappearing mid-execution. The event loop only keeps
       weak references to tasks. A task that isn't referenced elsewhere
-      may get garbage-collected at any time, even before it's done.
+      may get garbage collected at any time, even before it's done.
       For reliable "fire-and-forget" background tasks, gather them in
       a collection::
 
@@ -441,7 +441,8 @@ Shielding From Cancellation
 
    The statement::
 
-       res = await shield(something())
+       task = asyncio.create_task(something())
+       res = await shield(task)
 
    is equivalent to::
 
@@ -460,11 +461,19 @@ Shielding From Cancellation
    the ``shield()`` function should be combined with a try/except
    clause, as follows::
 
+       task = asyncio.create_task(something())
        try:
-           res = await shield(something())
+           res = await shield(task)
        except CancelledError:
            res = None
 
+   .. important::
+
+      Save a reference to tasks passed to this function, to avoid
+      a task disappearing mid-execution. The event loop only keeps
+      weak references to tasks. A task that isn't referenced elsewhere
+      may get garbage collected at any time, even before it's done.
+
    .. versionchanged:: 3.10
       Removed the *loop* parameter.
 
index c2927c1..9b40f80 100644 (file)
@@ -127,7 +127,7 @@ thoughts in mind:
 .. seealso::
 
    * `Sorted Collections
-     <http://www.grantjenks.com/docs/sortedcollections/>`_ is a high performance
+     <https://grantjenks.com/docs/sortedcollections/>`_ is a high performance
      module that uses *bisect* to managed sorted collections of data.
 
    * The `SortedCollection recipe
index dc35965..866b180 100644 (file)
@@ -25,20 +25,17 @@ Such constructors may be factory functions or class instances.
    hence not valid as a constructor), raises :exc:`TypeError`.
 
 
-.. function:: pickle(type, function, constructor=None)
+.. function:: pickle(type, function, constructor_ob=None)
 
    Declares that *function* should be used as a "reduction" function for objects
    of type *type*.  *function* should return either a string or a tuple
-   containing two or three elements.
+   containing two or three elements. See the :attr:`~pickle.Pickler.dispatch_table`
+   for more details on the interface of *function*.
 
-   The optional *constructor* parameter, if provided, is a callable object which
-   can be used to reconstruct the object when called with the tuple of arguments
-   returned by *function* at pickling time.  A :exc:`TypeError` is raised if the
-   *constructor* is not callable.
+   The *constructor_ob* parameter is a legacy feature and is now ignored, but if
+   passed it must be a callable.
 
-   See the :mod:`pickle` module for more details on the interface
-   expected of *function* and *constructor*.  Note that the
-   :attr:`~pickle.Pickler.dispatch_table` attribute of a pickler
+   Note that the :attr:`~pickle.Pickler.dispatch_table` attribute of a pickler
    object or subclass of :class:`pickle.Pickler` can also be used for
    declaring reduction functions.
 
index 899ce02..3a41ae2 100644 (file)
@@ -412,7 +412,7 @@ Dialects support the following attributes:
 
 .. attribute:: Dialect.skipinitialspace
 
-   When :const:`True`, whitespace immediately following the *delimiter* is ignored.
+   When :const:`True`, spaces immediately following the *delimiter* are ignored.
    The default is :const:`False`.
 
 
index 19ce19b..822a9b0 100644 (file)
@@ -197,9 +197,9 @@ calls).
 ``None``, integers, bytes objects and (unicode) strings are the only native
 Python objects that can directly be used as parameters in these function calls.
 ``None`` is passed as a C ``NULL`` pointer, bytes objects and strings are passed
-as pointer to the memory block that contains their data (:c:type:`char *` or
-:c:type:`wchar_t *`).  Python integers are passed as the platforms default C
-:c:type:`int` type, their value is masked to fit into the C type.
+as pointer to the memory block that contains their data (:c:expr:`char *` or
+:c:expr:`wchar_t *`).  Python integers are passed as the platforms default C
+:c:expr:`int` type, their value is masked to fit into the C type.
 
 Before we move on calling functions with other parameter types, we have to learn
 more about :mod:`ctypes` data types.
@@ -215,49 +215,49 @@ Fundamental data types
 +----------------------+------------------------------------------+----------------------------+
 | ctypes type          | C type                                   | Python type                |
 +======================+==========================================+============================+
-| :class:`c_bool`      | :c:type:`_Bool`                          | bool (1)                   |
+| :class:`c_bool`      | :c:expr:`_Bool`                          | bool (1)                   |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_char`      | :c:type:`char`                           | 1-character bytes object   |
+| :class:`c_char`      | :c:expr:`char`                           | 1-character bytes object   |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_wchar`     | :c:type:`wchar_t`                        | 1-character string         |
+| :class:`c_wchar`     | :c:expr:`wchar_t`                        | 1-character string         |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_byte`      | :c:type:`char`                           | int                        |
+| :class:`c_byte`      | :c:expr:`char`                           | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_ubyte`     | :c:type:`unsigned char`                  | int                        |
+| :class:`c_ubyte`     | :c:expr:`unsigned char`                  | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_short`     | :c:type:`short`                          | int                        |
+| :class:`c_short`     | :c:expr:`short`                          | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_ushort`    | :c:type:`unsigned short`                 | int                        |
+| :class:`c_ushort`    | :c:expr:`unsigned short`                 | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_int`       | :c:type:`int`                            | int                        |
+| :class:`c_int`       | :c:expr:`int`                            | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_uint`      | :c:type:`unsigned int`                   | int                        |
+| :class:`c_uint`      | :c:expr:`unsigned int`                   | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_long`      | :c:type:`long`                           | int                        |
+| :class:`c_long`      | :c:expr:`long`                           | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_ulong`     | :c:type:`unsigned long`                  | int                        |
+| :class:`c_ulong`     | :c:expr:`unsigned long`                  | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_longlong`  | :c:type:`__int64` or :c:type:`long long` | int                        |
+| :class:`c_longlong`  | :c:expr:`__int64` or :c:expr:`long long` | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_ulonglong` | :c:type:`unsigned __int64` or            | int                        |
-|                      | :c:type:`unsigned long long`             |                            |
+| :class:`c_ulonglong` | :c:expr:`unsigned __int64` or            | int                        |
+|                      | :c:expr:`unsigned long long`             |                            |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_size_t`    | :c:type:`size_t`                         | int                        |
+| :class:`c_size_t`    | :c:expr:`size_t`                         | int                        |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_ssize_t`   | :c:type:`ssize_t` or                     | int                        |
-|                      | :c:type:`Py_ssize_t`                     |                            |
+| :class:`c_ssize_t`   | :c:expr:`ssize_t` or                     | int                        |
+|                      | :c:expr:`Py_ssize_t`                     |                            |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_float`     | :c:type:`float`                          | float                      |
+| :class:`c_float`     | :c:expr:`float`                          | float                      |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_double`    | :c:type:`double`                         | float                      |
+| :class:`c_double`    | :c:expr:`double`                         | float                      |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_longdouble`| :c:type:`long double`                    | float                      |
+| :class:`c_longdouble`| :c:expr:`long double`                    | float                      |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_char_p`    | :c:type:`char *` (NUL terminated)        | bytes object or ``None``   |
+| :class:`c_char_p`    | :c:expr:`char *` (NUL terminated)        | bytes object or ``None``   |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_wchar_p`   | :c:type:`wchar_t *` (NUL terminated)     | string or ``None``         |
+| :class:`c_wchar_p`   | :c:expr:`wchar_t *` (NUL terminated)     | string or ``None``         |
 +----------------------+------------------------------------------+----------------------------+
-| :class:`c_void_p`    | :c:type:`void *`                         | int or ``None``            |
+| :class:`c_void_p`    | :c:expr:`void *`                         | int or ``None``            |
 +----------------------+------------------------------------------+----------------------------+
 
 (1)
@@ -333,7 +333,7 @@ property::
 The :func:`create_string_buffer` function replaces the :func:`c_buffer` function
 (which is still available as an alias), as well as the :func:`c_string` function
 from earlier ctypes releases.  To create a mutable memory block containing
-unicode characters of the C type :c:type:`wchar_t` use the
+unicode characters of the C type :c:expr:`wchar_t` use the
 :func:`create_unicode_buffer` function.
 
 
@@ -444,7 +444,7 @@ integer, string, bytes, a :mod:`ctypes` instance, or an object with an
 Return types
 ^^^^^^^^^^^^
 
-By default functions are assumed to return the C :c:type:`int` type.  Other
+By default functions are assumed to return the C :c:expr:`int` type.  Other
 return types can be specified by setting the :attr:`restype` attribute of the
 function object.
 
@@ -1075,7 +1075,7 @@ An extended example which also demonstrates the use of pointers accesses the
 
 Quoting the docs for that value:
 
-   This pointer is initialized to point to an array of :c:type:`struct _frozen`
+   This pointer is initialized to point to an array of :c:struct:`_frozen`
    records, terminated by one whose members are all ``NULL`` or zero.  When a frozen
    module is imported, it is searched in this table.  Third-party code could play
    tricks with this to provide a dynamically created collection of frozen modules.
@@ -1092,7 +1092,7 @@ size, we show only how this table can be read with :mod:`ctypes`::
    ...
    >>>
 
-We have defined the :c:type:`struct _frozen` data type, so we can get the pointer
+We have defined the :c:struct:`_frozen` data type, so we can get the pointer
 to the table::
 
    >>> FrozenTable = POINTER(struct_frozen)
@@ -1324,7 +1324,7 @@ way is to instantiate one of the following classes:
 
    Instances of this class represent loaded shared libraries. Functions in these
    libraries use the standard C calling convention, and are assumed to return
-   :c:type:`int`.
+   :c:expr:`int`.
 
    On Windows creating a :class:`CDLL` instance may fail even if the DLL name
    exists. When a dependent DLL of the loaded DLL is not found, a
@@ -1359,7 +1359,7 @@ way is to instantiate one of the following classes:
 
    Windows only: Instances of this class represent loaded shared libraries,
    functions in these libraries use the ``stdcall`` calling convention, and are
-   assumed to return :c:type:`int` by default.
+   assumed to return :c:expr:`int` by default.
 
 The Python :term:`global interpreter lock` is released before calling any
 function exported by these libraries, and reacquired afterwards.
@@ -1515,7 +1515,7 @@ object is available:
 
    An instance of :class:`PyDLL` that exposes Python C API functions as
    attributes.  Note that all these functions are assumed to return C
-   :c:type:`int`, which is of course not always the truth, so you have to assign
+   :c:expr:`int`, which is of course not always the truth, so you have to assign
    the correct :attr:`restype` attribute to use these functions.
 
 .. audit-event:: ctypes.dlopen name ctypes.LibraryLoader
@@ -1561,10 +1561,10 @@ They are instances of a private class:
    .. attribute:: restype
 
       Assign a ctypes type to specify the result type of the foreign function.
-      Use ``None`` for :c:type:`void`, a function not returning anything.
+      Use ``None`` for :c:expr:`void`, a function not returning anything.
 
       It is possible to assign a callable Python object that is not a ctypes
-      type, in this case the function is assumed to return a C :c:type:`int`, and
+      type, in this case the function is assumed to return a C :c:expr:`int`, and
       the callable will be called with this integer, allowing further
       processing or error checking.  Using this is deprecated, for more flexible
       post processing or error checking use a ctypes data type as
@@ -2177,21 +2177,21 @@ These are the fundamental ctypes data types:
 
 .. class:: c_byte
 
-   Represents the C :c:type:`signed char` datatype, and interprets the value as
+   Represents the C :c:expr:`signed char` datatype, and interprets the value as
    small integer.  The constructor accepts an optional integer initializer; no
    overflow checking is done.
 
 
 .. class:: c_char
 
-   Represents the C :c:type:`char` datatype, and interprets the value as a single
+   Represents the C :c:expr:`char` datatype, and interprets the value as a single
    character.  The constructor accepts an optional string initializer, the
    length of the string must be exactly one character.
 
 
 .. class:: c_char_p
 
-   Represents the C :c:type:`char *` datatype when it points to a zero-terminated
+   Represents the C :c:expr:`char *` datatype when it points to a zero-terminated
    string.  For a general character pointer that may also point to binary data,
    ``POINTER(c_char)`` must be used.  The constructor accepts an integer
    address, or a bytes object.
@@ -2199,68 +2199,68 @@ These are the fundamental ctypes data types:
 
 .. class:: c_double
 
-   Represents the C :c:type:`double` datatype.  The constructor accepts an
+   Represents the C :c:expr:`double` datatype.  The constructor accepts an
    optional float initializer.
 
 
 .. class:: c_longdouble
 
-   Represents the C :c:type:`long double` datatype.  The constructor accepts an
+   Represents the C :c:expr:`long double` datatype.  The constructor accepts an
    optional float initializer.  On platforms where ``sizeof(long double) ==
    sizeof(double)`` it is an alias to :class:`c_double`.
 
 .. class:: c_float
 
-   Represents the C :c:type:`float` datatype.  The constructor accepts an
+   Represents the C :c:expr:`float` datatype.  The constructor accepts an
    optional float initializer.
 
 
 .. class:: c_int
 
-   Represents the C :c:type:`signed int` datatype.  The constructor accepts an
+   Represents the C :c:expr:`signed int` datatype.  The constructor accepts an
    optional integer initializer; no overflow checking is done.  On platforms
    where ``sizeof(int) == sizeof(long)`` it is an alias to :class:`c_long`.
 
 
 .. class:: c_int8
 
-   Represents the C 8-bit :c:type:`signed int` datatype.  Usually an alias for
+   Represents the C 8-bit :c:expr:`signed int` datatype.  Usually an alias for
    :class:`c_byte`.
 
 
 .. class:: c_int16
 
-   Represents the C 16-bit :c:type:`signed int` datatype.  Usually an alias for
+   Represents the C 16-bit :c:expr:`signed int` datatype.  Usually an alias for
    :class:`c_short`.
 
 
 .. class:: c_int32
 
-   Represents the C 32-bit :c:type:`signed int` datatype.  Usually an alias for
+   Represents the C 32-bit :c:expr:`signed int` datatype.  Usually an alias for
    :class:`c_int`.
 
 
 .. class:: c_int64
 
-   Represents the C 64-bit :c:type:`signed int` datatype.  Usually an alias for
+   Represents the C 64-bit :c:expr:`signed int` datatype.  Usually an alias for
    :class:`c_longlong`.
 
 
 .. class:: c_long
 
-   Represents the C :c:type:`signed long` datatype.  The constructor accepts an
+   Represents the C :c:expr:`signed long` datatype.  The constructor accepts an
    optional integer initializer; no overflow checking is done.
 
 
 .. class:: c_longlong
 
-   Represents the C :c:type:`signed long long` datatype.  The constructor accepts
+   Represents the C :c:expr:`signed long long` datatype.  The constructor accepts
    an optional integer initializer; no overflow checking is done.
 
 
 .. class:: c_short
 
-   Represents the C :c:type:`signed short` datatype.  The constructor accepts an
+   Represents the C :c:expr:`signed short` datatype.  The constructor accepts an
    optional integer initializer; no overflow checking is done.
 
 
@@ -2278,83 +2278,83 @@ These are the fundamental ctypes data types:
 
 .. class:: c_ubyte
 
-   Represents the C :c:type:`unsigned char` datatype, it interprets the value as
+   Represents the C :c:expr:`unsigned char` datatype, it interprets the value as
    small integer.  The constructor accepts an optional integer initializer; no
    overflow checking is done.
 
 
 .. class:: c_uint
 
-   Represents the C :c:type:`unsigned int` datatype.  The constructor accepts an
+   Represents the C :c:expr:`unsigned int` datatype.  The constructor accepts an
    optional integer initializer; no overflow checking is done.  On platforms
    where ``sizeof(int) == sizeof(long)`` it is an alias for :class:`c_ulong`.
 
 
 .. class:: c_uint8
 
-   Represents the C 8-bit :c:type:`unsigned int` datatype.  Usually an alias for
+   Represents the C 8-bit :c:expr:`unsigned int` datatype.  Usually an alias for
    :class:`c_ubyte`.
 
 
 .. class:: c_uint16
 
-   Represents the C 16-bit :c:type:`unsigned int` datatype.  Usually an alias for
+   Represents the C 16-bit :c:expr:`unsigned int` datatype.  Usually an alias for
    :class:`c_ushort`.
 
 
 .. class:: c_uint32
 
-   Represents the C 32-bit :c:type:`unsigned int` datatype.  Usually an alias for
+   Represents the C 32-bit :c:expr:`unsigned int` datatype.  Usually an alias for
    :class:`c_uint`.
 
 
 .. class:: c_uint64
 
-   Represents the C 64-bit :c:type:`unsigned int` datatype.  Usually an alias for
+   Represents the C 64-bit :c:expr:`unsigned int` datatype.  Usually an alias for
    :class:`c_ulonglong`.
 
 
 .. class:: c_ulong
 
-   Represents the C :c:type:`unsigned long` datatype.  The constructor accepts an
+   Represents the C :c:expr:`unsigned long` datatype.  The constructor accepts an
    optional integer initializer; no overflow checking is done.
 
 
 .. class:: c_ulonglong
 
-   Represents the C :c:type:`unsigned long long` datatype.  The constructor
+   Represents the C :c:expr:`unsigned long long` datatype.  The constructor
    accepts an optional integer initializer; no overflow checking is done.
 
 
 .. class:: c_ushort
 
-   Represents the C :c:type:`unsigned short` datatype.  The constructor accepts
+   Represents the C :c:expr:`unsigned short` datatype.  The constructor accepts
    an optional integer initializer; no overflow checking is done.
 
 
 .. class:: c_void_p
 
-   Represents the C :c:type:`void *` type.  The value is represented as integer.
+   Represents the C :c:expr:`void *` type.  The value is represented as integer.
    The constructor accepts an optional integer initializer.
 
 
 .. class:: c_wchar
 
-   Represents the C :c:type:`wchar_t` datatype, and interprets the value as a
+   Represents the C :c:expr:`wchar_t` datatype, and interprets the value as a
    single character unicode string.  The constructor accepts an optional string
    initializer, the length of the string must be exactly one character.
 
 
 .. class:: c_wchar_p
 
-   Represents the C :c:type:`wchar_t *` datatype, which must be a pointer to a
+   Represents the C :c:expr:`wchar_t *` datatype, which must be a pointer to a
    zero-terminated wide character string.  The constructor accepts an integer
    address, or a string.
 
 
 .. class:: c_bool
 
-   Represent the C :c:type:`bool` datatype (more accurately, :c:type:`_Bool` from
+   Represent the C :c:expr:`bool` datatype (more accurately, :c:expr:`_Bool` from
    C99).  Its value can be ``True`` or ``False``, and the constructor accepts any object
    that has a truth value.
 
@@ -2367,8 +2367,8 @@ These are the fundamental ctypes data types:
 
 .. class:: py_object
 
-   Represents the C :c:type:`PyObject *` datatype.  Calling this without an
-   argument creates a ``NULL`` :c:type:`PyObject *` pointer.
+   Represents the C :c:expr:`PyObject *` datatype.  Calling this without an
+   argument creates a ``NULL`` :c:expr:`PyObject *` pointer.
 
 The :mod:`ctypes.wintypes` module provides quite some other Windows specific
 data types, for example :c:type:`HWND`, :c:type:`WPARAM`, or :c:type:`DWORD`.  Some
index c1bc624..ab3d3b8 100644 (file)
@@ -114,7 +114,7 @@ reset them before monitoring a calculation.
 .. seealso::
 
    * IBM's General Decimal Arithmetic Specification, `The General Decimal Arithmetic
-     Specification <http://speleotrove.com/decimal/decarith.html>`_.
+     Specification <https://speleotrove.com/decimal/decarith.html>`_.
 
 .. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
index 1df281a..9ed0e20 100644 (file)
@@ -24,6 +24,10 @@ interpreter.
       Use 2 bytes for each instruction. Previously the number of bytes varied
       by instruction.
 
+   .. versionchanged:: 3.10
+      The argument of jump, exception handling and loop instructions is now
+      the instruction offset rather than the byte offset.
+
 
 Example: Given the function :func:`myfunc`::
 
index c68e773..4eaa9d5 100644 (file)
@@ -83,7 +83,7 @@ Here are the methods of the :class:`Message` class:
       Note that this method is provided as a convenience and may not always
       format the message the way you want.  For example, by default it does
       not do the mangling of lines that begin with ``From`` that is
-      required by the unix mbox format.  For more flexibility, instantiate a
+      required by the Unix mbox format.  For more flexibility, instantiate a
       :class:`~email.generator.Generator` instance and use its
       :meth:`~email.generator.Generator.flatten` method directly.  For example::
 
@@ -125,7 +125,7 @@ Here are the methods of the :class:`Message` class:
       Note that this method is provided as a convenience and may not always
       format the message the way you want.  For example, by default it does
       not do the mangling of lines that begin with ``From`` that is
-      required by the unix mbox format.  For more flexibility, instantiate a
+      required by the Unix mbox format.  For more flexibility, instantiate a
       :class:`~email.generator.BytesGenerator` instance and use its
       :meth:`~email.generator.BytesGenerator.flatten` method directly.
       For example::
index 2d9bae6..34ad7b7 100644 (file)
@@ -55,7 +55,7 @@ To accommodate reproducible processing of SMIME-signed messages
    defaults to the value of the :attr:`~email.policy.Policy.mangle_from_`
    setting of the *policy* (which is ``True`` for the
    :data:`~email.policy.compat32` policy and ``False`` for all others).
-   *mangle_from_* is intended for use when messages are stored in unix mbox
+   *mangle_from_* is intended for use when messages are stored in Unix mbox
    format (see :mod:`mailbox` and `WHY THE CONTENT-LENGTH FORMAT IS BAD
    <https://www.jwz.org/doc/content-length.html>`_).
 
@@ -156,7 +156,7 @@ to be using :class:`BytesGenerator`, and not :class:`Generator`.
    defaults to the value of the :attr:`~email.policy.Policy.mangle_from_`
    setting of the *policy* (which is ``True`` for the
    :data:`~email.policy.compat32` policy and ``False`` for all others).
-   *mangle_from_* is intended for use when messages are stored in unix mbox
+   *mangle_from_* is intended for use when messages are stored in Unix mbox
    format (see :mod:`mailbox` and `WHY THE CONTENT-LENGTH FORMAT IS BAD
    <https://www.jwz.org/doc/content-length.html>`_).
 
index e4c40cf..86b88c0 100644 (file)
@@ -392,6 +392,7 @@ are always available.  They are listed here in alphabetical order.
    string.  The string must be the name of one of the object's attributes.  The
    function deletes the named attribute, provided the object allows it.  For
    example, ``delattr(x, 'foobar')`` is equivalent to ``del x.foobar``.
+   *name* need not be a Python identifier (see :func:`setattr`).
 
 
 .. _func-dict:
@@ -724,6 +725,7 @@ are always available.  They are listed here in alphabetical order.
    value of that attribute.  For example, ``getattr(x, 'foobar')`` is equivalent to
    ``x.foobar``.  If the named attribute does not exist, *default* is returned if
    provided, otherwise :exc:`AttributeError` is raised.
+   *name* need not be a Python identifier (see :func:`setattr`).
 
    .. note::
 
@@ -1242,8 +1244,8 @@ are always available.  They are listed here in alphabetical order.
 
    .. _open-newline-parameter:
 
-   *newline* controls how :term:`universal newlines` mode works (it only
-   applies to text mode).  It can be ``None``, ``''``, ``'\n'``, ``'\r'``, and
+   *newline* determines how to parse newline characters from the stream.
+   It can be ``None``, ``''``, ``'\n'``, ``'\r'``, and
    ``'\r\n'``.  It works as follows:
 
    * When reading input from the stream, if *newline* is ``None``, universal
@@ -1577,6 +1579,12 @@ are always available.  They are listed here in alphabetical order.
    object allows it.  For example, ``setattr(x, 'foobar', 123)`` is equivalent to
    ``x.foobar = 123``.
 
+   *name* need not be a Python identifier as defined in :ref:`identifiers`
+   unless the object chooses to enforce that, for example in a custom
+   :meth:`~object.__getattribute__` or via :attr:`~object.__slots__`.
+   An attribute whose name is not an identifier will not be accessible using
+   the dot notation, but is accessible through :func:`getattr` etc..
+
    .. note::
 
       Since :ref:`private name mangling <private-name-mangling>` happens at
index 380f52b..dd7a0c4 100644 (file)
@@ -14,7 +14,7 @@
 
 --------------
 
-This module defines classes which implement the client side of the HTTP and
+This module defines classes that implement the client side of the HTTP and
 HTTPS protocols.  It is normally not used directly --- the module
 :mod:`urllib.request` uses it to handle URLs that use HTTP and HTTPS.
 
@@ -35,7 +35,7 @@ The module provides the following classes:
                           blocksize=8192)
 
    An :class:`HTTPConnection` instance represents one transaction with an HTTP
-   server.  It should be instantiated passing it a host and optional port
+   server.  It should be instantiated by passing it a host and optional port
    number.  If no port number is passed, the port is extracted from the host
    string if it has the form ``host:port``, else the default HTTP port (80) is
    used.  If the optional *timeout* parameter is given, blocking
@@ -59,7 +59,7 @@ The module provides the following classes:
 
    .. versionchanged:: 3.4
       The  *strict* parameter was removed. HTTP 0.9-style "Simple Responses" are
-      not longer supported.
+      no longer supported.
 
    .. versionchanged:: 3.7
       *blocksize* parameter was added.
@@ -472,7 +472,7 @@ statement.
 
    Return the value of the header *name*, or *default* if there is no header
    matching *name*.  If there is more than one  header with the name *name*,
-   return all of the values joined by ', '.  If 'default' is any iterable other
+   return all of the values joined by ', '.  If *default* is any iterable other
    than a single string, its elements are similarly returned joined by commas.
 
 .. method:: HTTPResponse.getheaders()
@@ -576,7 +576,7 @@ Here is an example session that uses the ``HEAD`` method.  Note that the
    >>> data == b''
    True
 
-Here is an example session that shows how to ``POST`` requests::
+Here is an example session that uses the ``POST`` method::
 
    >>> import http.client, urllib.parse
    >>> params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
@@ -592,14 +592,13 @@ Here is an example session that shows how to ``POST`` requests::
    b'Redirecting to <a href="https://bugs.python.org/issue12524">https://bugs.python.org/issue12524</a>'
    >>> conn.close()
 
-Client side ``HTTP PUT`` requests are very similar to ``POST`` requests. The
-difference lies only the server side where HTTP server will allow resources to
-be created via ``PUT`` request. It should be noted that custom HTTP methods
+Client side HTTP ``PUT`` requests are very similar to ``POST`` requests. The
+difference lies only on the server side where HTTP servers will allow resources to
+be created via ``PUT`` requests. It should be noted that custom HTTP methods
 are also handled in :class:`urllib.request.Request` by setting the appropriate
-method attribute. Here is an example session that shows how to send a ``PUT``
-request using http.client::
+method attribute. Here is an example session that uses the ``PUT`` method::
 
-    >>> # This creates an HTTP message
+    >>> # This creates an HTTP request
     >>> # with the content of BODY as the enclosed representation
     >>> # for the resource http://localhost:8080/file
     ...
index ba2fa01..3bdf9b5 100644 (file)
@@ -61,7 +61,7 @@ The following classes are provided:
    responsible for storing and retrieving cookies from a file or database.
 
 
-.. class:: FileCookieJar(filename, delayload=None, policy=None)
+.. class:: FileCookieJar(filename=None, delayload=None, policy=None)
 
    *policy* is an object implementing the :class:`CookiePolicy` interface.  For the
    other arguments, see the documentation for the corresponding attributes.
@@ -71,6 +71,8 @@ The following classes are provided:
    :meth:`load` or :meth:`revert` method is called.  Subclasses of this class are
    documented in section :ref:`file-cookie-jar-classes`.
 
+   This should not be initialized directly â€“ use its subclasses below instead.
+
    .. versionchanged:: 3.8
 
       The filename parameter supports a :term:`path-like object`.
@@ -317,11 +319,11 @@ FileCookieJar subclasses and co-operation with web browsers
 The following :class:`CookieJar` subclasses are provided for reading and
 writing.
 
-.. class:: MozillaCookieJar(filename, delayload=None, policy=None)
+.. class:: MozillaCookieJar(filename=None, delayload=None, policy=None)
 
    A :class:`FileCookieJar` that can load from and save cookies to disk in the
-   Mozilla ``cookies.txt`` file format (which is also used by the Lynx and Netscape
-   browsers).
+   Mozilla ``cookies.txt`` file format (which is also used by curl and the Lynx
+   and Netscape browsers).
 
    .. note::
 
@@ -338,7 +340,7 @@ writing.
    Mozilla.
 
 
-.. class:: LWPCookieJar(filename, delayload=None, policy=None)
+.. class:: LWPCookieJar(filename=None, delayload=None, policy=None)
 
    A :class:`FileCookieJar` that can load from and save cookies to disk in format
    compatible with the libwww-perl library's ``Set-Cookie3`` file format.  This is
index 8584f99..89a25b8 100644 (file)
@@ -388,8 +388,8 @@ provides three different variants:
       contents of the file are output. If the file's MIME type starts with
       ``text/`` the file is opened in text mode; otherwise binary mode is used.
 
-      For example usage, see the implementation of the :func:`test` function
-      invocation in the :mod:`http.server` module.
+      For example usage, see the implementation of the ``test`` function
+      in :source:`Lib/http/server.py`.
 
       .. versionchanged:: 3.7
          Support of the ``'If-Modified-Since'`` header.
index 3981cc6..1addba3 100644 (file)
@@ -854,6 +854,8 @@ ABC hierarchy::
 
        Read contents of self as text.
 
+    Note: In Python 3.11 and later, this class is found in ``importlib.resources.abc``.
+
 
 .. class:: TraversableResources
 
@@ -868,6 +870,8 @@ ABC hierarchy::
 
     .. versionadded:: 3.9
 
+    Note: In Python 3.11 and later, this class is found in ``importlib.resources.abc``.
+
 
 :mod:`importlib.resources` -- Resources
 ---------------------------------------
@@ -930,7 +934,7 @@ The following functions are available.
 
 .. function:: files(package)
 
-    Returns an :class:`importlib.resources.abc.Traversable` object
+    Returns an :class:`importlib.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).
@@ -942,7 +946,7 @@ The following functions are available.
 
 .. function:: as_file(traversable)
 
-    Given a :class:`importlib.resources.abc.Traversable` object representing
+    Given a :class:`importlib.abc.Traversable` object representing
     a file, typically from :func:`importlib.resources.files`, return
     a context manager for use in a :keyword:`with` statement.
     The context manager provides a :class:`pathlib.Path` object.
index df812d6..5cf692e 100644 (file)
@@ -265,7 +265,7 @@ to provide an interface to files in the machine's file system.
 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,
+buffer raw binary streams that are writable, readable, 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.
index dc1799c..fe7a4a4 100644 (file)
@@ -120,7 +120,7 @@ See :ref:`json-commandline` for detailed documentation.
 
 .. note::
 
-   JSON is a subset of `YAML <http://yaml.org/>`_ 1.2.  The JSON produced by
+   JSON is a subset of `YAML <https://yaml.org/>`_ 1.2.  The JSON produced by
    this module's default settings (in particular, the default *separators*
    value) is also a subset of YAML 1.0 and 1.1.  This module can thus also be
    used as a YAML serializer.
index 824076f..13683c0 100644 (file)
@@ -522,6 +522,22 @@ subclasses. However, the :meth:`__init__` method in subclasses needs to call
       is intended to be implemented by subclasses and so raises a
       :exc:`NotImplementedError`.
 
+      .. warning:: This method is called after a handler-level lock is acquired, which
+         is released after this method returns. When you override this method, note
+         that you should be careful when calling anything that invokes other parts of
+         the logging API which might do locking, because that might result in a
+         deadlock. Specifically:
+
+         * Logging configuration APIs acquire the module-level lock, and then
+           individual handler-level locks as those handlers are configured.
+
+         * Many logging APIs lock the module-level lock. If such an API is called
+           from this method, it could cause a deadlock if a configuration call is
+           made on another thread, because that thread will try to acquire the
+           module-level lock *before* the handler-level lock, whereas this thread
+           tries to acquire the module-level lock *after* the handler-level lock
+           (because in this method, the handler-level lock has already been acquired).
+
 For a list of handlers included as standard, see :mod:`logging.handlers`.
 
 .. _formatter-objects:
@@ -652,6 +668,35 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on
       :func:`traceback.print_stack`, but with the last newline removed) as a
       string. This default implementation just returns the input value.
 
+.. class:: BufferingFormatter(linefmt=None)
+
+   A base formatter class suitable for subclassing when you want to format a
+   number of records. You can pass a :class:`Formatter` instance which you want
+   to use to format each line (that corresponds to a single record). If not
+   specified, the default formatter (which just outputs the event message) is
+   used as the line formatter.
+
+   .. method:: formatHeader(records)
+
+      Return a header for a list of *records*. The base implementation just
+      returns the empty string. You will need to override this method if you
+      want specific behaviour, e.g. to show the count of records, a title or a
+      separator line.
+
+   .. method:: formatFooter(records)
+
+      Return a footer for a list of *records*. The base implementation just
+      returns the empty string. You will need to override this method if you
+      want specific behaviour, e.g. to show the count of records or a separator
+      line.
+
+   .. method:: format(records)
+
+      Return formatted text for a list of *records*. The base implementation
+      just returns the empty string if there are no records; otherwise, it
+      returns the concatenation of the header, each record formatted with the
+      line formatter, and the footer.
+
 .. _filter:
 
 Filter Objects
index d74fc80..56908de 100644 (file)
@@ -426,7 +426,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
 
 .. seealso::
 
-   `maildir man page from Courier <http://www.courier-mta.org/maildir.html>`_
+   `maildir man page from Courier <https://www.courier-mta.org/maildir.html>`_
       A specification of the format. Describes a common extension for
       supporting folders.
 
@@ -614,7 +614,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
 
 .. seealso::
 
-   `nmh - Message Handling System <http://www.nongnu.org/nmh/>`_
+   `nmh - Message Handling System <https://www.nongnu.org/nmh/>`_
       Home page of :program:`nmh`, an updated version of the original :program:`mh`.
 
    `MH & nmh: Email for Users & Programmers <https://rand-mh.sourceforge.io/book/>`_
index e2e5bb3..5a433d9 100644 (file)
@@ -60,6 +60,18 @@ standard.  However, mailcap files are supported on most Unix systems.
    use) to determine whether or not the mailcap line applies.  :func:`findmatch`
    will automatically check such conditions and skip the entry if the check fails.
 
+   .. versionchanged:: 3.10.8
+
+      To prevent security issues with shell metacharacters (symbols that have
+      special effects in a shell command line), ``findmatch`` will refuse
+      to inject ASCII characters other than alphanumerics and ``@+=:,./-_``
+      into the returned command line.
+
+      If a disallowed character appears in *filename*, ``findmatch`` will always
+      return ``(None, None)`` as if no entry was found.
+      If such a character appears elsewhere (a value in *plist* or in *MIMEtype*),
+      ``findmatch`` will ignore all mailcap entries which use that value.
+      A :mod:`warning <warnings>` will be raised in either case.
 
 .. function:: getcaps()
 
index 18e9b1e..95e74b9 100644 (file)
@@ -142,8 +142,8 @@ to start a process.  These *start methods* are
    subprocess. See :issue:`33725`.
 
 .. versionchanged:: 3.4
-   *spawn* added on all unix platforms, and *forkserver* added for
-   some unix platforms.
+   *spawn* added on all Unix platforms, and *forkserver* added for
+   some Unix platforms.
    Child processes no longer inherit all of the parents inheritable
    handles on Windows.
 
@@ -657,7 +657,6 @@ The :mod:`multiprocessing` package mostly replicates the API of the
    Example usage of some of the methods of :class:`Process`:
 
    .. doctest::
-      :options: +ELLIPSIS
 
        >>> import multiprocessing, time, signal
        >>> p = multiprocessing.Process(target=time.sleep, args=(1000,))
@@ -2596,9 +2595,9 @@ Address Formats
   filesystem.
 
 * An ``'AF_PIPE'`` address is a string of the form
-  :samp:`r'\\\\.\\pipe\\{PipeName}'`.  To use :func:`Client` to connect to a named
+  :samp:`r'\\\\\\.\\pipe\\\\{PipeName}'`.  To use :func:`Client` to connect to a named
   pipe on a remote computer called *ServerName* one should use an address of the
-  form :samp:`r'\\\\{ServerName}\\pipe\\{PipeName}'` instead.
+  form :samp:`r'\\\\\\\\{ServerName}\\pipe\\\\{PipeName}'` instead.
 
 Note that any string beginning with two backslashes is assumed by default to be
 an ``'AF_PIPE'`` address rather than an ``'AF_UNIX'`` address.
index 127a82d..76046b3 100644 (file)
@@ -125,7 +125,7 @@ instances::
 
 
 The following example demonstrates a practical use of the :class:`SharedMemory`
-class with `NumPy arrays <https://www.numpy.org/>`_, accessing the
+class with `NumPy arrays <https://numpy.org/>`_, accessing the
 same ``numpy.ndarray`` from two distinct Python shells:
 
 .. doctest::
index f02877e..0becb59 100644 (file)
@@ -16,7 +16,7 @@ files see :func:`open`, and for accessing the filesystem see the :mod:`os`
 module. The path parameters can be passed as strings, or bytes, or any object
 implementing the :class:`os.PathLike` protocol.
 
-Unlike a unix shell, Python does not do any *automatic* path expansions.
+Unlike a Unix shell, Python does not do any *automatic* path expansions.
 Functions such as :func:`expanduser` and :func:`expandvars` can be invoked
 explicitly when an application desires shell-like path expansion.  (See also
 the :mod:`glob` module.)
index c8bb5a9..8753132 100644 (file)
@@ -291,8 +291,8 @@ process and user.
 
 .. function:: getenv(key, default=None)
 
-   Return the value of the environment variable *key* if it exists, or
-   *default* if it doesn't. *key*, *default* and the result are str. Note that
+   Return the value of the environment variable *key* as a string if it exists, or
+   *default* if it doesn't. *key* is a string. Note that
    since :func:`getenv` uses :data:`os.environ`, the mapping of :func:`getenv` is
    similarly also captured on import, and the function may not reflect
    future environment changes.
@@ -306,8 +306,8 @@ process and user.
 
 .. function:: getenvb(key, default=None)
 
-   Return the value of the environment variable *key* if it exists, or
-   *default* if it doesn't. *key*, *default* and the result are bytes. Note that
+   Return the value of the environment variable *key* as bytes if it exists, or
+   *default* if it doesn't. *key* must be bytes. Note that
    since :func:`getenvb` uses :data:`os.environb`, the mapping of :func:`getenvb` is
    similarly also captured on import, and the function may not reflect
    future environment changes.
@@ -3135,7 +3135,8 @@ features:
    filenames)``.
 
    *dirpath* is a string, the path to the directory.  *dirnames* is a list of the
-   names of the subdirectories in *dirpath* (excluding ``'.'`` and ``'..'``).
+   names of the subdirectories in *dirpath* (including symlinks to directories,
+   and excluding ``'.'`` and ``'..'``).
    *filenames* is a list of the names of the non-directory files in *dirpath*.
    Note that the names in the lists contain no path components.  To get a full path
    (which begins with *top*) to a file or directory in *dirpath*, do
index 920df71..7a4906b 100644 (file)
@@ -90,7 +90,7 @@ Comparison with ``json``
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
 There are fundamental differences between the pickle protocols and
-`JSON (JavaScript Object Notation) <http://json.org>`_:
+`JSON (JavaScript Object Notation) <https://json.org>`_:
 
 * JSON is a text serialization format (it outputs unicode text, although
   most of the time it is then encoded to ``utf-8``), while pickle is
index 90be191..ec04b0d 100644 (file)
@@ -39,12 +39,12 @@ Large File Support
 
 Several operating systems (including AIX and Solaris) provide
 support for files that are larger than 2 GiB from a C programming model where
-:c:type:`int` and :c:type:`long` are 32-bit values. This is typically accomplished
+:c:expr:`int` and :c:expr:`long` are 32-bit values. This is typically accomplished
 by defining the relevant size and offset types as 64-bit values. Such files are
 sometimes referred to as :dfn:`large files`.
 
 Large file support is enabled in Python when the size of an :c:type:`off_t` is
-larger than a :c:type:`long` and the :c:type:`long long` is at least as large
+larger than a :c:expr:`long` and the :c:expr:`long long` is at least as large
 as an :c:type:`off_t`.
 It may be necessary to configure and compile Python with certain compiler flags
 to enable this mode. For example, with Solaris 2.6 and 2.7 you need to do
index 7cfa275..c2a4df4 100644 (file)
@@ -546,15 +546,15 @@ Simulation of arrival times and service deliveries for a multiserver queue::
    including simulation, sampling, shuffling, and cross-validation.
 
    `Economics Simulation
-   <http://nbviewer.jupyter.org/url/norvig.com/ipython/Economics.ipynb>`_
+   <https://nbviewer.jupyter.org/url/norvig.com/ipython/Economics.ipynb>`_
    a simulation of a marketplace by
-   `Peter Norvig <http://norvig.com/bio.html>`_ that shows effective
+   `Peter Norvig <https://norvig.com/bio.html>`_ that shows effective
    use of many of the tools and distributions provided by this module
    (gauss, uniform, sample, betavariate, choice, triangular, and randrange).
 
    `A Concrete Introduction to Probability (using Python)
-   <http://nbviewer.jupyter.org/url/norvig.com/ipython/Probability.ipynb>`_
-   a tutorial by `Peter Norvig <http://norvig.com/bio.html>`_ covering
+   <https://nbviewer.jupyter.org/url/norvig.com/ipython/Probability.ipynb>`_
+   a tutorial by `Peter Norvig <https://norvig.com/bio.html>`_ covering
    the basics of probability theory, how to write simulations, and
    how to perform data analysis using Python.
 
index fd12241..e7d1f05 100644 (file)
@@ -702,7 +702,8 @@ Flags
    more readable by allowing you to visually separate logical sections of the
    pattern and add comments. Whitespace within the pattern is ignored, except
    when in a character class, or when preceded by an unescaped backslash,
-   or within tokens like ``*?``, ``(?:`` or ``(?P<...>``.
+   or within tokens like ``*?``, ``(?:`` or ``(?P<...>``. For example, ``(? :``
+   and ``* ?`` are not allowed.
    When a line contains a ``#`` that is not in a character class and is not
    preceded by an unescaped backslash, all characters from the leftmost such
    ``#`` through the end of the line are ignored.
index 9c94b86..205d08b 100644 (file)
@@ -948,7 +948,7 @@ The :mod:`socket` module also offers various network-related services:
    Convert an IPv4 address from dotted-quad string format (for example,
    '123.45.67.89') to 32-bit packed binary format, as a bytes object four characters in
    length.  This is useful when conversing with a program that uses the standard C
-   library and needs objects of type :c:type:`struct in_addr`, which is the C type
+   library and needs objects of type :c:struct:`in_addr`, which is the C type
    for the 32-bit packed binary this function returns.
 
    :func:`inet_aton` also accepts strings with less than three dots; see the
@@ -967,7 +967,7 @@ The :mod:`socket` module also offers various network-related services:
    Convert a 32-bit packed IPv4 address (a :term:`bytes-like object` four
    bytes in length) to its standard dotted-quad string representation (for example,
    '123.45.67.89').  This is useful when conversing with a program that uses the
-   standard C library and needs objects of type :c:type:`struct in_addr`, which
+   standard C library and needs objects of type :c:struct:`in_addr`, which
    is the C type for the 32-bit packed binary data this function takes as an
    argument.
 
@@ -984,8 +984,8 @@ The :mod:`socket` module also offers various network-related services:
 
    Convert an IP address from its family-specific string format to a packed,
    binary format. :func:`inet_pton` is useful when a library or network protocol
-   calls for an object of type :c:type:`struct in_addr` (similar to
-   :func:`inet_aton`) or :c:type:`struct in6_addr`.
+   calls for an object of type :c:struct:`in_addr` (similar to
+   :func:`inet_aton`) or :c:struct:`in6_addr`.
 
    Supported values for *address_family* are currently :const:`AF_INET` and
    :const:`AF_INET6`. If the IP address string *ip_string* is invalid,
@@ -1005,8 +1005,8 @@ The :mod:`socket` module also offers various network-related services:
    bytes) to its standard, family-specific string representation (for
    example, ``'7.10.0.5'`` or ``'5aef:2b::8'``).
    :func:`inet_ntop` is useful when a library or network protocol returns an
-   object of type :c:type:`struct in_addr` (similar to :func:`inet_ntoa`) or
-   :c:type:`struct in6_addr`.
+   object of type :c:struct:`in_addr` (similar to :func:`inet_ntoa`) or
+   :c:struct:`in6_addr`.
 
    Supported values for *address_family* are currently :const:`AF_INET` and
    :const:`AF_INET6`. If the bytes object *packed_ip* is not the correct
@@ -1477,7 +1477,7 @@ to sockets.
    ancillary data, items of the form ``(socket.SOL_SOCKET,
    socket.SCM_RIGHTS, fds)``, where *fds* is a :class:`bytes` object
    representing the new file descriptors as a binary array of the
-   native C :c:type:`int` type.  If :meth:`recvmsg` raises an
+   native C :c:expr:`int` type.  If :meth:`recvmsg` raises an
    exception after the system call returns, it will first attempt to
    close any file descriptors received via this mechanism.
 
index cf78bd2..5f276c8 100644 (file)
@@ -257,7 +257,7 @@ Module functions
 
 .. function:: connect(database, timeout=5.0, detect_types=0, \
                       isolation_level="DEFERRED", check_same_thread=True, \
-                      factory=sqlite3.Connection, cached_statements=128, \
+                      factory=sqlite3.Connection, cached_statements=100, \
                       uri=False)
 
    Open a connection to an SQLite database.
@@ -515,103 +515,6 @@ Connection objects
 
    An SQLite database connection has the following attributes and methods:
 
-   .. attribute:: isolation_level
-
-      This attribute controls the :ref:`transaction handling
-      <sqlite3-controlling-transactions>` performed by :mod:`!sqlite3`.
-      If set to ``None``, transactions are never implicitly opened.
-      If set to one of ``"DEFERRED"``, ``"IMMEDIATE"``, or ``"EXCLUSIVE"``,
-      corresponding to the underlying `SQLite transaction behaviour`_,
-      implicit :ref:`transaction management
-      <sqlite3-controlling-transactions>` is performed.
-
-      If not overridden by the *isolation_level* parameter of :func:`connect`,
-      the default is ``""``, which is an alias for ``"DEFERRED"``.
-
-   .. attribute:: in_transaction
-
-      This read-only attribute corresponds to the low-level SQLite
-      `autocommit mode`_.
-
-      ``True`` if a transaction is active (there are uncommitted changes),
-      ``False`` otherwise.
-
-      .. versionadded:: 3.2
-
-   .. attribute:: row_factory
-
-      A callable that accepts two arguments,
-      a :class:`Cursor` object and the raw row results as a :class:`tuple`,
-      and returns a custom object representing an SQLite row.
-
-      Example:
-
-      .. doctest::
-
-         >>> def dict_factory(cursor, row):
-         ...     col_names = [col[0] for col in cursor.description]
-         ...     return {key: value for key, value in zip(col_names, row)}
-         >>> con = sqlite3.connect(":memory:")
-         >>> con.row_factory = dict_factory
-         >>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
-         ...     print(row)
-         {'a': 1, 'b': 2}
-
-      If returning a tuple doesn't suffice and you want name-based access to
-      columns, you should consider setting :attr:`row_factory` to the
-      highly optimized :class:`sqlite3.Row` type. :class:`Row` provides both
-      index-based and case-insensitive name-based access to columns with almost no
-      memory overhead. It will probably be better than your own custom
-      dictionary-based approach or even a db_row based solution.
-
-      .. XXX what's a db_row-based solution?
-
-   .. attribute:: text_factory
-
-      A callable that accepts a :class:`bytes` parameter and returns a text
-      representation of it.
-      The callable is invoked for SQLite values with the ``TEXT`` data type.
-      By default, this attribute is set to :class:`str`.
-      If you want to return ``bytes`` instead, set *text_factory* to ``bytes``.
-
-      Example:
-
-      .. testcode::
-
-         con = sqlite3.connect(":memory:")
-         cur = con.cursor()
-
-         AUSTRIA = "Österreich"
-
-         # by default, rows are returned as str
-         cur.execute("SELECT ?", (AUSTRIA,))
-         row = cur.fetchone()
-         assert row[0] == AUSTRIA
-
-         # but we can make sqlite3 always return bytestrings ...
-         con.text_factory = bytes
-         cur.execute("SELECT ?", (AUSTRIA,))
-         row = cur.fetchone()
-         assert type(row[0]) is bytes
-         # the bytestrings will be encoded in UTF-8, unless you stored garbage in the
-         # database ...
-         assert row[0] == AUSTRIA.encode("utf-8")
-
-         # we can also implement a custom text_factory ...
-         # here we implement one that appends "foo" to all strings
-         con.text_factory = lambda x: x.decode("utf-8") + "foo"
-         cur.execute("SELECT ?", ("bar",))
-         row = cur.fetchone()
-         assert row[0] == "barfoo"
-
-         con.close()
-
-   .. attribute:: total_changes
-
-      Return the total number of database rows that have been modified, inserted, or
-      deleted since the database connection was opened.
-
-
    .. method:: cursor(factory=Cursor)
 
       Create and return a :class:`Cursor` object.
@@ -1017,6 +920,101 @@ Connection objects
 
       .. versionadded:: 3.7
 
+   .. attribute:: in_transaction
+
+      This read-only attribute corresponds to the low-level SQLite
+      `autocommit mode`_.
+
+      ``True`` if a transaction is active (there are uncommitted changes),
+      ``False`` otherwise.
+
+      .. versionadded:: 3.2
+
+   .. attribute:: isolation_level
+
+      This attribute controls the :ref:`transaction handling
+      <sqlite3-controlling-transactions>` performed by :mod:`!sqlite3`.
+      If set to ``None``, transactions are never implicitly opened.
+      If set to one of ``"DEFERRED"``, ``"IMMEDIATE"``, or ``"EXCLUSIVE"``,
+      corresponding to the underlying `SQLite transaction behaviour`_,
+      implicit :ref:`transaction management
+      <sqlite3-controlling-transactions>` is performed.
+
+      If not overridden by the *isolation_level* parameter of :func:`connect`,
+      the default is ``""``, which is an alias for ``"DEFERRED"``.
+
+   .. attribute:: row_factory
+
+      A callable that accepts two arguments,
+      a :class:`Cursor` object and the raw row results as a :class:`tuple`,
+      and returns a custom object representing an SQLite row.
+
+      Example:
+
+      .. doctest::
+
+         >>> def dict_factory(cursor, row):
+         ...     col_names = [col[0] for col in cursor.description]
+         ...     return {key: value for key, value in zip(col_names, row)}
+         >>> con = sqlite3.connect(":memory:")
+         >>> con.row_factory = dict_factory
+         >>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
+         ...     print(row)
+         {'a': 1, 'b': 2}
+
+      If returning a tuple doesn't suffice and you want name-based access to
+      columns, you should consider setting :attr:`row_factory` to the
+      highly optimized :class:`sqlite3.Row` type. :class:`Row` provides both
+      index-based and case-insensitive name-based access to columns with almost no
+      memory overhead. It will probably be better than your own custom
+      dictionary-based approach or even a db_row based solution.
+
+      .. XXX what's a db_row-based solution?
+
+   .. attribute:: text_factory
+
+      A callable that accepts a :class:`bytes` parameter and returns a text
+      representation of it.
+      The callable is invoked for SQLite values with the ``TEXT`` data type.
+      By default, this attribute is set to :class:`str`.
+      If you want to return ``bytes`` instead, set *text_factory* to ``bytes``.
+
+      Example:
+
+      .. testcode::
+
+         con = sqlite3.connect(":memory:")
+         cur = con.cursor()
+
+         AUSTRIA = "Österreich"
+
+         # by default, rows are returned as str
+         cur.execute("SELECT ?", (AUSTRIA,))
+         row = cur.fetchone()
+         assert row[0] == AUSTRIA
+
+         # but we can make sqlite3 always return bytestrings ...
+         con.text_factory = bytes
+         cur.execute("SELECT ?", (AUSTRIA,))
+         row = cur.fetchone()
+         assert type(row[0]) is bytes
+         # the bytestrings will be encoded in UTF-8, unless you stored garbage in the
+         # database ...
+         assert row[0] == AUSTRIA.encode("utf-8")
+
+         # we can also implement a custom text_factory ...
+         # here we implement one that appends "foo" to all strings
+         con.text_factory = lambda x: x.decode("utf-8") + "foo"
+         cur.execute("SELECT ?", ("bar",))
+         row = cur.fetchone()
+         assert row[0] == "barfoo"
+
+         con.close()
+
+   .. attribute:: total_changes
+
+      Return the total number of database rows that have been modified, inserted, or
+      deleted since the database connection was opened.
 
 .. _sqlite3-cursor-objects:
 
@@ -1123,7 +1121,9 @@ Cursor objects
 
    .. method:: fetchone()
 
-      Return the next row of a query result set as a :class:`tuple`.
+      If :attr:`~Connection.row_factory` is ``None``,
+      return the next row query result set as a :class:`tuple`.
+      Else, pass it to the row factory and return its result.
       Return ``None`` if no more data is available.
 
 
@@ -1852,7 +1852,8 @@ If the connection attribute :attr:`~Connection.isolation_level`
 is not ``None``,
 new transactions are implicitly opened before
 :meth:`~Cursor.execute` and :meth:`~Cursor.executemany` executes
-``INSERT``, ``UPDATE``, ``DELETE``, or ``REPLACE`` statements.
+``INSERT``, ``UPDATE``, ``DELETE``, or ``REPLACE`` statements;
+for other statements, no implicit transaction handling is performed.
 Use the :meth:`~Connection.commit` and :meth:`~Connection.rollback` methods
 to respectively commit and roll back pending transactions.
 You can choose the underlying `SQLite transaction behaviour`_ â€”
index c82a6ad..868d7bb 100644 (file)
@@ -215,7 +215,7 @@ Numeric Types --- :class:`int`, :class:`float`, :class:`complex`
 There are three distinct numeric types: :dfn:`integers`, :dfn:`floating
 point numbers`, and :dfn:`complex numbers`.  In addition, Booleans are a
 subtype of integers.  Integers have unlimited precision.  Floating point
-numbers are usually implemented using :c:type:`double` in C; information
+numbers are usually implemented using :c:expr:`double` in C; information
 about the precision and internal representation of floating point
 numbers for the machine on which your program is running is available
 in :data:`sys.float_info`.  Complex numbers have a real and imaginary
@@ -5440,7 +5440,7 @@ When an operation would exceed the limit, a :exc:`ValueError` is raised:
    >>> _ = int('2' * 5432)
    Traceback (most recent call last):
    ...
-   ValueError: Exceeds the limit (4300) for integer string conversion: value has 5432 digits.
+   ValueError: Exceeds the limit (4300) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit.
    >>> i = int('2' * 4300)
    >>> len(str(i))
    4300
@@ -5448,7 +5448,7 @@ When an operation would exceed the limit, a :exc:`ValueError` is raised:
    >>> len(str(i_squared))
    Traceback (most recent call last):
    ...
-   ValueError: Exceeds the limit (4300) for integer string conversion: value has 8599 digits.
+   ValueError: Exceeds the limit (4300) for integer string conversion: value has 8599 digits; use sys.set_int_max_str_digits() to increase the limit.
    >>> len(hex(i_squared))
    7144
    >>> assert int(hex(i_squared), base=16) == i*i  # Hexadecimal is unlimited.
index c1888d4..d12a573 100644 (file)
@@ -196,46 +196,46 @@ platform-dependent.
 +========+==========================+====================+================+============+
 | ``x``  | pad byte                 | no value           |                |            |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``c``  | :c:type:`char`           | bytes of length 1  | 1              |            |
+| ``c``  | :c:expr:`char`           | bytes of length 1  | 1              |            |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``b``  | :c:type:`signed char`    | integer            | 1              | \(1), \(2) |
+| ``b``  | :c:expr:`signed char`    | integer            | 1              | \(1), \(2) |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``B``  | :c:type:`unsigned char`  | integer            | 1              | \(2)       |
+| ``B``  | :c:expr:`unsigned char`  | integer            | 1              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``?``  | :c:type:`_Bool`          | bool               | 1              | \(1)       |
+| ``?``  | :c:expr:`_Bool`          | bool               | 1              | \(1)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``h``  | :c:type:`short`          | integer            | 2              | \(2)       |
+| ``h``  | :c:expr:`short`          | integer            | 2              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``H``  | :c:type:`unsigned short` | integer            | 2              | \(2)       |
+| ``H``  | :c:expr:`unsigned short` | integer            | 2              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``i``  | :c:type:`int`            | integer            | 4              | \(2)       |
+| ``i``  | :c:expr:`int`            | integer            | 4              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``I``  | :c:type:`unsigned int`   | integer            | 4              | \(2)       |
+| ``I``  | :c:expr:`unsigned int`   | integer            | 4              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``l``  | :c:type:`long`           | integer            | 4              | \(2)       |
+| ``l``  | :c:expr:`long`           | integer            | 4              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``L``  | :c:type:`unsigned long`  | integer            | 4              | \(2)       |
+| ``L``  | :c:expr:`unsigned long`  | integer            | 4              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``q``  | :c:type:`long long`      | integer            | 8              | \(2)       |
+| ``q``  | :c:expr:`long long`      | integer            | 8              | \(2)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``Q``  | :c:type:`unsigned long   | integer            | 8              | \(2)       |
+| ``Q``  | :c:expr:`unsigned long   | integer            | 8              | \(2)       |
 |        | long`                    |                    |                |            |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``n``  | :c:type:`ssize_t`        | integer            |                | \(3)       |
+| ``n``  | :c:expr:`ssize_t`        | integer            |                | \(3)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``N``  | :c:type:`size_t`         | integer            |                | \(3)       |
+| ``N``  | :c:expr:`size_t`         | integer            |                | \(3)       |
 +--------+--------------------------+--------------------+----------------+------------+
 | ``e``  | \(6)                     | float              | 2              | \(4)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``f``  | :c:type:`float`          | float              | 4              | \(4)       |
+| ``f``  | :c:expr:`float`          | float              | 4              | \(4)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``d``  | :c:type:`double`         | float              | 8              | \(4)       |
+| ``d``  | :c:expr:`double`         | float              | 8              | \(4)       |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``s``  | :c:type:`char[]`         | bytes              |                |            |
+| ``s``  | :c:expr:`char[]`         | bytes              |                |            |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``p``  | :c:type:`char[]`         | bytes              |                |            |
+| ``p``  | :c:expr:`char[]`         | bytes              |                |            |
 +--------+--------------------------+--------------------+----------------+------------+
-| ``P``  | :c:type:`void \*`        | integer            |                | \(5)       |
+| ``P``  | :c:expr:`void \*`        | integer            |                | \(5)       |
 +--------+--------------------------+--------------------+----------------+------------+
 
 .. versionchanged:: 3.3
@@ -250,8 +250,8 @@ Notes:
 (1)
    .. index:: single: ? (question mark); in struct format strings
 
-   The ``'?'`` conversion code corresponds to the :c:type:`_Bool` type defined by
-   C99. If this type is not available, it is simulated using a :c:type:`char`. In
+   The ``'?'`` conversion code corresponds to the :c:expr:`_Bool` type defined by
+   C99. If this type is not available, it is simulated using a :c:expr:`char`. In
    standard mode, it is always represented by one byte.
 
 (2)
index 45fcfc7..f35a820 100644 (file)
@@ -192,7 +192,10 @@ underlying :class:`Popen` interface can be used directly.
     .. attribute:: output
 
         Output of the child process if it was captured by :func:`run` or
-        :func:`check_output`.  Otherwise, ``None``.
+        :func:`check_output`.  Otherwise, ``None``.  This is always
+        :class:`bytes` when any output was captured regardless of the
+        ``text=True`` setting.  It may remain ``None`` instead of ``b''``
+        when no output was observed.
 
     .. attribute:: stdout
 
@@ -201,7 +204,9 @@ underlying :class:`Popen` interface can be used directly.
     .. attribute:: stderr
 
         Stderr output of the child process if it was captured by :func:`run`.
-        Otherwise, ``None``.
+        Otherwise, ``None``.  This is always :class:`bytes` when stderr output
+        was captured regardless of the ``text=True`` setting.  It may remain
+        ``None`` instead of ``b''`` when no stderr output was observed.
 
     .. versionadded:: 3.3
 
index 55214cf..b39ba5f 100644 (file)
@@ -1278,7 +1278,7 @@ always available.
 
    .. availability:: Unix.
 
-.. function:: set_int_max_str_digits(n)
+.. function:: set_int_max_str_digits(maxdigits)
 
    Set the :ref:`integer string conversion length limitation
    <int_max_str_digits>` used by this interpreter. See also
index 5944052..922a8f0 100644 (file)
@@ -1066,7 +1066,7 @@ The :mod:`test.support.socket_helper` module provides support for socket tests.
 
 .. function:: bind_unix_socket(sock, addr)
 
-   Bind a unix socket, raising :exc:`unittest.SkipTest` if
+   Bind a Unix socket, raising :exc:`unittest.SkipTest` if
    :exc:`PermissionError` is raised.
 
 
index 0d2b344..c8e4317 100644 (file)
@@ -38,7 +38,7 @@ details that are unchanged.
 
 .. seealso::
 
-   * `TkDocs <http://tkdocs.com/>`_
+   * `TkDocs <https://tkdocs.com/>`_
       Extensive tutorial on creating user interfaces with Tkinter.  Explains key concepts,
       and illustrates recommended approaches using the modern API.
 
index 88b936c..c86fcfa 100644 (file)
@@ -33,17 +33,17 @@ special needs of your application and users.
 
 .. seealso::
 
-   `Tix Homepage <http://tix.sourceforge.net/>`_
+   `Tix Homepage <https://tix.sourceforge.net/>`_
       The home page for :mod:`Tix`.  This includes links to additional documentation
       and downloads.
 
-   `Tix Man Pages <http://tix.sourceforge.net/dist/current/man/>`_
+   `Tix Man Pages <https://tix.sourceforge.net/dist/current/man/>`_
       On-line version of the man pages and reference material.
 
-   `Tix Programming Guide <http://tix.sourceforge.net/dist/current/docs/tix-book/tix.book.html>`_
+   `Tix Programming Guide <https://tix.sourceforge.net/dist/current/docs/tix-book/tix.book.html>`_
       On-line version of the programmer's reference material.
 
-   `Tix Development Applications <http://tix.sourceforge.net/Tixapps/src/Tide.html>`_
+   `Tix Development Applications <https://tix.sourceforge.net/Tixapps/src/Tide.html>`_
       Tix applications for development of Tix and Tkinter programs. Tide applications
       work under Tk or Tkinter, and include :program:`TixInspect`, an inspector to
       remotely modify and debug Tix/Tk/Tkinter applications.
@@ -80,7 +80,7 @@ the following::
 Tix Widgets
 -----------
 
-`Tix <http://tix.sourceforge.net/dist/current/man/html/TixCmd/TixIntro.htm>`_
+`Tix <https://tix.sourceforge.net/dist/current/man/html/TixCmd/TixIntro.htm>`_
 introduces over 40 widget classes to the :mod:`tkinter` repertoire.
 
 
@@ -91,125 +91,125 @@ Basic Widgets
 .. class:: Balloon()
 
    A `Balloon
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixBalloon.htm>`_ that
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixBalloon.htm>`_ that
    pops up over a widget to provide help.  When the user moves the cursor inside a
    widget to which a Balloon widget has been bound, a small pop-up window with a
    descriptive message will be shown on the screen.
 
 .. Python Demo of:
-.. \ulink{Balloon}{http://tix.sourceforge.net/dist/current/demos/samples/Balloon.tcl}
+.. \ulink{Balloon}{https://tix.sourceforge.net/dist/current/demos/samples/Balloon.tcl}
 
 
 .. class:: ButtonBox()
 
    The `ButtonBox
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixButtonBox.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixButtonBox.htm>`_
    widget creates a box of buttons, such as is commonly used for ``Ok Cancel``.
 
 .. Python Demo of:
-.. \ulink{ButtonBox}{http://tix.sourceforge.net/dist/current/demos/samples/BtnBox.tcl}
+.. \ulink{ButtonBox}{https://tix.sourceforge.net/dist/current/demos/samples/BtnBox.tcl}
 
 
 .. class:: ComboBox()
 
    The `ComboBox
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixComboBox.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixComboBox.htm>`_
    widget is similar to the combo box control in MS Windows. The user can select a
    choice by either typing in the entry subwidget or selecting from the listbox
    subwidget.
 
 .. Python Demo of:
-.. \ulink{ComboBox}{http://tix.sourceforge.net/dist/current/demos/samples/ComboBox.tcl}
+.. \ulink{ComboBox}{https://tix.sourceforge.net/dist/current/demos/samples/ComboBox.tcl}
 
 
 .. class:: Control()
 
    The `Control
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixControl.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixControl.htm>`_
    widget is also known as the :class:`SpinBox` widget. The user can adjust the
    value by pressing the two arrow buttons or by entering the value directly into
    the entry. The new value will be checked against the user-defined upper and
    lower limits.
 
 .. Python Demo of:
-.. \ulink{Control}{http://tix.sourceforge.net/dist/current/demos/samples/Control.tcl}
+.. \ulink{Control}{https://tix.sourceforge.net/dist/current/demos/samples/Control.tcl}
 
 
 .. class:: LabelEntry()
 
    The `LabelEntry
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixLabelEntry.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixLabelEntry.htm>`_
    widget packages an entry widget and a label into one mega widget. It can
    be used to simplify the creation of "entry-form" type of interface.
 
 .. Python Demo of:
-.. \ulink{LabelEntry}{http://tix.sourceforge.net/dist/current/demos/samples/LabEntry.tcl}
+.. \ulink{LabelEntry}{https://tix.sourceforge.net/dist/current/demos/samples/LabEntry.tcl}
 
 
 .. class:: LabelFrame()
 
    The `LabelFrame
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixLabelFrame.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixLabelFrame.htm>`_
    widget packages a frame widget and a label into one mega widget.  To create
    widgets inside a LabelFrame widget, one creates the new widgets relative to the
    :attr:`frame` subwidget and manage them inside the :attr:`frame` subwidget.
 
 .. Python Demo of:
-.. \ulink{LabelFrame}{http://tix.sourceforge.net/dist/current/demos/samples/LabFrame.tcl}
+.. \ulink{LabelFrame}{https://tix.sourceforge.net/dist/current/demos/samples/LabFrame.tcl}
 
 
 .. class:: Meter()
 
    The `Meter
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixMeter.htm>`_ widget
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixMeter.htm>`_ widget
    can be used to show the progress of a background job which may take a long time
    to execute.
 
 .. Python Demo of:
-.. \ulink{Meter}{http://tix.sourceforge.net/dist/current/demos/samples/Meter.tcl}
+.. \ulink{Meter}{https://tix.sourceforge.net/dist/current/demos/samples/Meter.tcl}
 
 
 .. class:: OptionMenu()
 
    The `OptionMenu
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixOptionMenu.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixOptionMenu.htm>`_
    creates a menu button of options.
 
 .. Python Demo of:
-.. \ulink{OptionMenu}{http://tix.sourceforge.net/dist/current/demos/samples/OptMenu.tcl}
+.. \ulink{OptionMenu}{https://tix.sourceforge.net/dist/current/demos/samples/OptMenu.tcl}
 
 
 .. class:: PopupMenu()
 
    The `PopupMenu
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixPopupMenu.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixPopupMenu.htm>`_
    widget can be used as a replacement of the ``tk_popup`` command. The advantage
    of the :mod:`Tix` :class:`PopupMenu` widget is it requires less application code
    to manipulate.
 
 .. Python Demo of:
-.. \ulink{PopupMenu}{http://tix.sourceforge.net/dist/current/demos/samples/PopMenu.tcl}
+.. \ulink{PopupMenu}{https://tix.sourceforge.net/dist/current/demos/samples/PopMenu.tcl}
 
 
 .. class:: Select()
 
    The `Select
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixSelect.htm>`_ widget
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixSelect.htm>`_ widget
    is a container of button subwidgets. It can be used to provide radio-box or
    check-box style of selection options for the user.
 
 .. Python Demo of:
-.. \ulink{Select}{http://tix.sourceforge.net/dist/current/demos/samples/Select.tcl}
+.. \ulink{Select}{https://tix.sourceforge.net/dist/current/demos/samples/Select.tcl}
 
 
 .. class:: StdButtonBox()
 
    The `StdButtonBox
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixStdButtonBox.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixStdButtonBox.htm>`_
    widget is a group of standard buttons for Motif-like dialog boxes.
 
 .. Python Demo of:
-.. \ulink{StdButtonBox}{http://tix.sourceforge.net/dist/current/demos/samples/StdBBox.tcl}
+.. \ulink{StdButtonBox}{https://tix.sourceforge.net/dist/current/demos/samples/StdBBox.tcl}
 
 
 File Selectors
@@ -219,37 +219,37 @@ File Selectors
 .. class:: DirList()
 
    The `DirList
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirList.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirList.htm>`_
    widget displays a list view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed in the
    list or change to another directory.
 
 .. Python Demo of:
-.. \ulink{DirList}{http://tix.sourceforge.net/dist/current/demos/samples/DirList.tcl}
+.. \ulink{DirList}{https://tix.sourceforge.net/dist/current/demos/samples/DirList.tcl}
 
 
 .. class:: DirTree()
 
    The `DirTree
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirTree.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirTree.htm>`_
    widget displays a tree view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed in the
    list or change to another directory.
 
 .. Python Demo of:
-.. \ulink{DirTree}{http://tix.sourceforge.net/dist/current/demos/samples/DirTree.tcl}
+.. \ulink{DirTree}{https://tix.sourceforge.net/dist/current/demos/samples/DirTree.tcl}
 
 
 .. class:: DirSelectDialog()
 
    The `DirSelectDialog
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirSelectDialog.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirSelectDialog.htm>`_
    widget presents the directories in the file system in a dialog window.  The user
    can use this dialog window to navigate through the file system to select the
    desired directory.
 
 .. Python Demo of:
-.. \ulink{DirSelectDialog}{http://tix.sourceforge.net/dist/current/demos/samples/DirDlg.tcl}
+.. \ulink{DirSelectDialog}{https://tix.sourceforge.net/dist/current/demos/samples/DirDlg.tcl}
 
 
 .. class:: DirSelectBox()
@@ -263,39 +263,39 @@ File Selectors
 .. class:: ExFileSelectBox()
 
    The `ExFileSelectBox
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixExFileSelectBox.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixExFileSelectBox.htm>`_
    widget is usually embedded in a tixExFileSelectDialog widget. It provides a
    convenient method for the user to select files. The style of the
    :class:`ExFileSelectBox` widget is very similar to the standard file dialog on
    MS Windows 3.1.
 
 .. Python Demo of:
-.. \ulink{ExFileSelectDialog}{http://tix.sourceforge.net/dist/current/demos/samples/EFileDlg.tcl}
+.. \ulink{ExFileSelectDialog}{https://tix.sourceforge.net/dist/current/demos/samples/EFileDlg.tcl}
 
 
 .. class:: FileSelectBox()
 
    The `FileSelectBox
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixFileSelectBox.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixFileSelectBox.htm>`_
    is similar to the standard Motif(TM) file-selection box. It is generally used
    for the user to choose a file. FileSelectBox stores the files mostly recently
    selected into a :class:`ComboBox` widget so that they can be quickly selected
    again.
 
 .. Python Demo of:
-.. \ulink{FileSelectDialog}{http://tix.sourceforge.net/dist/current/demos/samples/FileDlg.tcl}
+.. \ulink{FileSelectDialog}{https://tix.sourceforge.net/dist/current/demos/samples/FileDlg.tcl}
 
 
 .. class:: FileEntry()
 
    The `FileEntry
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixFileEntry.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixFileEntry.htm>`_
    widget can be used to input a filename. The user can type in the filename
    manually. Alternatively, the user can press the button widget that sits next to
    the entry, which will bring up a file selection dialog.
 
 .. Python Demo of:
-.. \ulink{FileEntry}{http://tix.sourceforge.net/dist/current/demos/samples/FileEnt.tcl}
+.. \ulink{FileEntry}{https://tix.sourceforge.net/dist/current/demos/samples/FileEnt.tcl}
 
 
 Hierarchical ListBox
@@ -305,42 +305,42 @@ Hierarchical ListBox
 .. class:: HList()
 
    The `HList
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixHList.htm>`_ widget
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixHList.htm>`_ widget
    can be used to display any data that have a hierarchical structure, for example,
    file system directory trees. The list entries are indented and connected by
    branch lines according to their places in the hierarchy.
 
 .. Python Demo of:
-.. \ulink{HList}{http://tix.sourceforge.net/dist/current/demos/samples/HList1.tcl}
+.. \ulink{HList}{https://tix.sourceforge.net/dist/current/demos/samples/HList1.tcl}
 
 
 .. class:: CheckList()
 
    The `CheckList
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixCheckList.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixCheckList.htm>`_
    widget displays a list of items to be selected by the user. CheckList acts
    similarly to the Tk checkbutton or radiobutton widgets, except it is capable of
    handling many more items than checkbuttons or radiobuttons.
 
 .. Python Demo of:
-.. \ulink{ CheckList}{http://tix.sourceforge.net/dist/current/demos/samples/ChkList.tcl}
+.. \ulink{ CheckList}{https://tix.sourceforge.net/dist/current/demos/samples/ChkList.tcl}
 .. Python Demo of:
-.. \ulink{ScrolledHList (1)}{http://tix.sourceforge.net/dist/current/demos/samples/SHList.tcl}
+.. \ulink{ScrolledHList (1)}{https://tix.sourceforge.net/dist/current/demos/samples/SHList.tcl}
 .. Python Demo of:
-.. \ulink{ScrolledHList (2)}{http://tix.sourceforge.net/dist/current/demos/samples/SHList2.tcl}
+.. \ulink{ScrolledHList (2)}{https://tix.sourceforge.net/dist/current/demos/samples/SHList2.tcl}
 
 
 .. class:: Tree()
 
    The `Tree
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixTree.htm>`_ widget
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixTree.htm>`_ widget
    can be used to display hierarchical data in a tree form. The user can adjust the
    view of the tree by opening or closing parts of the tree.
 
 .. Python Demo of:
-.. \ulink{Tree}{http://tix.sourceforge.net/dist/current/demos/samples/Tree.tcl}
+.. \ulink{Tree}{https://tix.sourceforge.net/dist/current/demos/samples/Tree.tcl}
 .. Python Demo of:
-.. \ulink{Tree (Dynamic)}{http://tix.sourceforge.net/dist/current/demos/samples/DynTree.tcl}
+.. \ulink{Tree (Dynamic)}{https://tix.sourceforge.net/dist/current/demos/samples/DynTree.tcl}
 
 
 Tabular ListBox
@@ -350,7 +350,7 @@ Tabular ListBox
 .. class:: TList()
 
    The `TList
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixTList.htm>`_ widget
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixTList.htm>`_ widget
    can be used to display data in a tabular format. The list entries of a
    :class:`TList` widget are similar to the entries in the Tk listbox widget.  The
    main differences are (1) the :class:`TList` widget can display the list entries
@@ -358,17 +358,17 @@ Tabular ListBox
    multiple colors and fonts for the list entries.
 
 .. Python Demo of:
-.. \ulink{ScrolledTList (1)}{http://tix.sourceforge.net/dist/current/demos/samples/STList1.tcl}
+.. \ulink{ScrolledTList (1)}{https://tix.sourceforge.net/dist/current/demos/samples/STList1.tcl}
 .. Python Demo of:
-.. \ulink{ScrolledTList (2)}{http://tix.sourceforge.net/dist/current/demos/samples/STList2.tcl}
+.. \ulink{ScrolledTList (2)}{https://tix.sourceforge.net/dist/current/demos/samples/STList2.tcl}
 .. Grid has yet to be added to Python
 .. \subsubsection{Grid Widget}
 .. Python Demo of:
-.. \ulink{Simple Grid}{http://tix.sourceforge.net/dist/current/demos/samples/SGrid0.tcl}
+.. \ulink{Simple Grid}{https://tix.sourceforge.net/dist/current/demos/samples/SGrid0.tcl}
 .. Python Demo of:
-.. \ulink{ScrolledGrid}{http://tix.sourceforge.net/dist/current/demos/samples/SGrid1.tcl}
+.. \ulink{ScrolledGrid}{https://tix.sourceforge.net/dist/current/demos/samples/SGrid1.tcl}
 .. Python Demo of:
-.. \ulink{Editable Grid}{http://tix.sourceforge.net/dist/current/demos/samples/EditGrid.tcl}
+.. \ulink{Editable Grid}{https://tix.sourceforge.net/dist/current/demos/samples/EditGrid.tcl}
 
 
 Manager Widgets
@@ -378,19 +378,19 @@ Manager Widgets
 .. class:: PanedWindow()
 
    The `PanedWindow
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixPanedWindow.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixPanedWindow.htm>`_
    widget allows the user to interactively manipulate the sizes of several panes.
    The panes can be arranged either vertically or horizontally.  The user changes
    the sizes of the panes by dragging the resize handle between two panes.
 
 .. Python Demo of:
-.. \ulink{PanedWindow}{http://tix.sourceforge.net/dist/current/demos/samples/PanedWin.tcl}
+.. \ulink{PanedWindow}{https://tix.sourceforge.net/dist/current/demos/samples/PanedWin.tcl}
 
 
 .. class:: ListNoteBook()
 
    The `ListNoteBook
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixListNoteBook.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixListNoteBook.htm>`_
    widget is very similar to the :class:`TixNoteBook` widget: it can be used to
    display many windows in a limited space using a notebook metaphor. The notebook
    is divided into a stack of pages (windows). At one time only one of these pages
@@ -398,30 +398,30 @@ Manager Widgets
    the desired page in the :attr:`hlist` subwidget.
 
 .. Python Demo of:
-.. \ulink{ListNoteBook}{http://tix.sourceforge.net/dist/current/demos/samples/ListNBK.tcl}
+.. \ulink{ListNoteBook}{https://tix.sourceforge.net/dist/current/demos/samples/ListNBK.tcl}
 
 
 .. class:: NoteBook()
 
    The `NoteBook
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixNoteBook.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixNoteBook.htm>`_
    widget can be used to display many windows in a limited space using a notebook
    metaphor. The notebook is divided into a stack of pages. At one time only one of
    these pages can be shown. The user can navigate through these pages by choosing
    the visual "tabs" at the top of the NoteBook widget.
 
 .. Python Demo of:
-.. \ulink{NoteBook}{http://tix.sourceforge.net/dist/current/demos/samples/NoteBook.tcl}
+.. \ulink{NoteBook}{https://tix.sourceforge.net/dist/current/demos/samples/NoteBook.tcl}
 
 .. \subsubsection{Scrolled Widgets}
 .. Python Demo of:
-.. \ulink{ScrolledListBox}{http://tix.sourceforge.net/dist/current/demos/samples/SListBox.tcl}
+.. \ulink{ScrolledListBox}{https://tix.sourceforge.net/dist/current/demos/samples/SListBox.tcl}
 .. Python Demo of:
-.. \ulink{ScrolledText}{http://tix.sourceforge.net/dist/current/demos/samples/SText.tcl}
+.. \ulink{ScrolledText}{https://tix.sourceforge.net/dist/current/demos/samples/SText.tcl}
 .. Python Demo of:
-.. \ulink{ScrolledWindow}{http://tix.sourceforge.net/dist/current/demos/samples/SWindow.tcl}
+.. \ulink{ScrolledWindow}{https://tix.sourceforge.net/dist/current/demos/samples/SWindow.tcl}
 .. Python Demo of:
-.. \ulink{Canvas Object View}{http://tix.sourceforge.net/dist/current/demos/samples/CObjView.tcl}
+.. \ulink{Canvas Object View}{https://tix.sourceforge.net/dist/current/demos/samples/CObjView.tcl}
 
 
 Image Types
@@ -429,17 +429,17 @@ Image Types
 
 The :mod:`tkinter.tix` module adds:
 
-* `pixmap <http://tix.sourceforge.net/dist/current/man/html/TixCmd/pixmap.htm>`_
+* `pixmap <https://tix.sourceforge.net/dist/current/man/html/TixCmd/pixmap.htm>`_
   capabilities to all :mod:`tkinter.tix` and :mod:`tkinter` widgets to create
   color images from XPM files.
 
   .. Python Demo of:
-  .. \ulink{XPM Image In Button}{http://tix.sourceforge.net/dist/current/demos/samples/Xpm.tcl}
+  .. \ulink{XPM Image In Button}{https://tix.sourceforge.net/dist/current/demos/samples/Xpm.tcl}
   .. Python Demo of:
-  .. \ulink{XPM Image In Menu}{http://tix.sourceforge.net/dist/current/demos/samples/Xpm1.tcl}
+  .. \ulink{XPM Image In Menu}{https://tix.sourceforge.net/dist/current/demos/samples/Xpm1.tcl}
 
 * `Compound
-  <http://tix.sourceforge.net/dist/current/man/html/TixCmd/compound.htm>`_ image
+  <https://tix.sourceforge.net/dist/current/man/html/TixCmd/compound.htm>`_ image
   types can be used to create images that consists of multiple horizontal lines;
   each line is composed of a series of items (texts, bitmaps, images or spaces)
   arranged from left to right. For example, a compound image can be used to
@@ -447,13 +447,13 @@ The :mod:`tkinter.tix` module adds:
   widget.
 
   .. Python Demo of:
-  .. \ulink{Compound Image In Buttons}{http://tix.sourceforge.net/dist/current/demos/samples/CmpImg.tcl}
+  .. \ulink{Compound Image In Buttons}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg.tcl}
   .. Python Demo of:
-  .. \ulink{Compound Image In NoteBook}{http://tix.sourceforge.net/dist/current/demos/samples/CmpImg2.tcl}
+  .. \ulink{Compound Image In NoteBook}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg2.tcl}
   .. Python Demo of:
-  .. \ulink{Compound Image Notebook Color Tabs}{http://tix.sourceforge.net/dist/current/demos/samples/CmpImg4.tcl}
+  .. \ulink{Compound Image Notebook Color Tabs}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg4.tcl}
   .. Python Demo of:
-  .. \ulink{Compound Image Icons}{http://tix.sourceforge.net/dist/current/demos/samples/CmpImg3.tcl}
+  .. \ulink{Compound Image Icons}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg3.tcl}
 
 
 Miscellaneous Widgets
@@ -463,7 +463,7 @@ Miscellaneous Widgets
 .. class:: InputOnly()
 
    The `InputOnly
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixInputOnly.htm>`_
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixInputOnly.htm>`_
    widgets are to accept inputs from the user, which can be done with the ``bind``
    command (Unix only).
 
@@ -477,7 +477,7 @@ In addition, :mod:`tkinter.tix` augments :mod:`tkinter` by providing:
 .. class:: Form()
 
    The `Form
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixForm.htm>`_ geometry
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixForm.htm>`_ geometry
    manager based on attachment rules for all Tk widgets.
 
 
@@ -488,7 +488,7 @@ Tix Commands
 .. class:: tixCommand()
 
    The `tix commands
-   <http://tix.sourceforge.net/dist/current/man/html/TixCmd/tix.htm>`_ provide
+   <https://tix.sourceforge.net/dist/current/man/html/TixCmd/tix.htm>`_ provide
    access to miscellaneous elements of :mod:`Tix`'s internal state and the
    :mod:`Tix` application context.  Most of the information manipulated by these
    methods pertains to the application as a whole, or to a screen or display,
index 3e31fbf..be00915 100644 (file)
@@ -58,7 +58,7 @@ for improved styling effects.
 
 .. seealso::
 
-   `Converting existing applications to use Tile widgets <http://tktable.sourceforge.net/tile/doc/converting.txt>`_
+   `Converting existing applications to use Tile widgets <https://tktable.sourceforge.net/tile/doc/converting.txt>`_
      A monograph (using Tcl terminology) about differences typically
      encountered when moving applications to use the new widgets.
 
@@ -1274,7 +1274,7 @@ option. If you don't know the class name of a widget, use the method
 
 .. seealso::
 
-   `Tcl'2004 conference presentation <http://tktable.sourceforge.net/tile/tile-tcl2004.pdf>`_
+   `Tcl'2004 conference presentation <https://tktable.sourceforge.net/tile/tile-tcl2004.pdf>`_
       This document explains how the theme engine works
 
 
index e938dd5..c93e7f4 100644 (file)
@@ -401,9 +401,9 @@ exception and traceback:
    import sys, traceback
 
    def lumberjack():
-       bright_side_of_death()
+       bright_side_of_life()
 
-   def bright_side_of_death():
+   def bright_side_of_life():
        return tuple()[0]
 
    try:
@@ -413,9 +413,7 @@ exception and traceback:
        print("*** print_tb:")
        traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
        print("*** print_exception:")
-       # exc_type below is ignored on 3.5 and later
-       traceback.print_exception(exc_type, exc_value, exc_traceback,
-                                 limit=2, file=sys.stdout)
+       traceback.print_exception(exc_value, limit=2, file=sys.stdout)
        print("*** print_exc:")
        traceback.print_exc(limit=2, file=sys.stdout)
        print("*** format_exc, first and last line:")
@@ -423,9 +421,7 @@ exception and traceback:
        print(formatted_lines[0])
        print(formatted_lines[-1])
        print("*** format_exception:")
-       # exc_type below is ignored on 3.5 and later
-       print(repr(traceback.format_exception(exc_type, exc_value,
-                                             exc_traceback)))
+       print(repr(traceback.format_exception(exc_value)))
        print("*** extract_tb:")
        print(repr(traceback.extract_tb(exc_traceback)))
        print("*** format_tb:")
@@ -445,14 +441,14 @@ The output for the example would look similar to this:
      File "<doctest...>", line 10, in <module>
        lumberjack()
      File "<doctest...>", line 4, in lumberjack
-       bright_side_of_death()
+       bright_side_of_life()
    IndexError: tuple index out of range
    *** print_exc:
    Traceback (most recent call last):
      File "<doctest...>", line 10, in <module>
        lumberjack()
      File "<doctest...>", line 4, in lumberjack
-       bright_side_of_death()
+       bright_side_of_life()
    IndexError: tuple index out of range
    *** format_exc, first and last line:
    Traceback (most recent call last):
@@ -460,17 +456,17 @@ The output for the example would look similar to this:
    *** format_exception:
    ['Traceback (most recent call last):\n',
     '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
-    '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
-    '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',
+    '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_life()\n',
+    '  File "<doctest...>", line 7, in bright_side_of_life\n    return tuple()[0]\n',
     'IndexError: tuple index out of range\n']
    *** extract_tb:
    [<FrameSummary file <doctest...>, line 10 in <module>>,
     <FrameSummary file <doctest...>, line 4 in lumberjack>,
-    <FrameSummary file <doctest...>, line 7 in bright_side_of_death>]
+    <FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
    *** format_tb:
    ['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
-    '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
-    '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']
+    '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_life()\n',
+    '  File "<doctest...>", line 7, in bright_side_of_life\n    return tuple()[0]\n']
    *** tb_lineno: 10
 
 
index f0a85d6..2600ac3 100644 (file)
@@ -36,6 +36,11 @@ New features are frequently added to the ``typing`` module.
 The `typing_extensions <https://pypi.org/project/typing-extensions/>`_ package
 provides backports of these new features to older versions of Python.
 
+.. seealso::
+
+   The documentation at https://typing.readthedocs.io/ serves as useful reference
+   for type system features, useful typing related tools and typing best practices.
+
 .. _relevant-peps:
 
 Relevant PEPs
index 0c3fc31..fa4383b 100644 (file)
@@ -1738,7 +1738,7 @@ Loading and running tests
 
       A list of the non-fatal errors encountered while loading tests. Not reset
       by the loader at any point. Fatal errors are signalled by the relevant
-      method raising an exception to the caller. Non-fatal errors are also
+      method raising an exception to the caller. Non-fatal errors are also
       indicated by a synthetic test that will raise the original error when
       run.
 
index 1478b34..96b3965 100644 (file)
@@ -113,7 +113,8 @@ or on combining URL components into a URL string.
    +------------------+-------+-------------------------+------------------------+
    | :attr:`path`     | 2     | Hierarchical path       | empty string           |
    +------------------+-------+-------------------------+------------------------+
-   | :attr:`params`   | 3     | No longer used          | always an empty string |
+   | :attr:`params`   | 3     | Parameters for last     | empty string           |
+   |                  |       | path element            |                        |
    +------------------+-------+-------------------------+------------------------+
    | :attr:`query`    | 4     | Query component         | empty string           |
    +------------------+-------+-------------------------+------------------------+
index 127a871..fe5e4c0 100644 (file)
@@ -84,6 +84,19 @@ Creating virtual environments
    without there needing to be any reference to its virtual environment in
    ``PATH``.
 
+.. warning:: Because scripts installed in environments should not expect the
+   environment to be activated, their shebang lines contain the absolute paths
+   to their environment's interpreters. Because of this, environments are
+   inherently non-portable, in the general case. You should always have a
+   simple means of recreating an environment (for example, if you have a
+   requirements file ``requirements.txt``, you can invoke ``pip install -r
+   requirements.txt`` using the environment's ``pip`` to install all of the
+   packages needed by the environment). If for any reason you need to move the
+   environment to a new location, you should recreate it at the desired
+   location and delete the one at the old location. If you move an environment
+   because you moved a parent directory of it, you should recreate the
+   environment in its new location. Otherwise, software installed into the
+   environment may not work as expected.
 
 .. _venv-api:
 
index f63e0d3..d50aabd 100644 (file)
@@ -12,7 +12,8 @@
 --------------
 
 The :mod:`wave` module provides a convenient interface to the WAV sound format.
-It does not support compression/decompression, but it does support mono/stereo.
+Only files using ``WAVE_FORMAT_PCM`` are supported. Note that this does not
+include files using ``WAVE_FORMAT_EXTENSIBLE`` even if the subformat is PCM.
 
 The :mod:`wave` module defines the following function and exception:
 
index 247509d..f4a7a4c 100644 (file)
@@ -163,7 +163,7 @@ between conformable Python objects and XML on the wire.
       A good description of XML-RPC operation and client software in several languages.
       Contains pretty much everything an XML-RPC client developer needs to know.
 
-   `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
+   `XML-RPC Introspection <https://xmlrpc-c.sourceforge.net/introspection.html>`_
       Describes the XML-RPC protocol extension for introspection.
 
    `XML-RPC Specification <http://xmlrpc.scripting.com/spec.html>`_
index ea9192b..e92b9a2 100644 (file)
@@ -316,7 +316,7 @@ Sequences
 
          A string is a sequence of values that represent Unicode code points.
          All the code points in the range ``U+0000 - U+10FFFF`` can be
-         represented in a string.  Python doesn't have a :c:type:`char` type;
+         represented in a string.  Python doesn't have a :c:expr:`char` type;
          instead, every code point in the string is represented as a string
          object with length ``1``.  The built-in function :func:`ord`
          converts a code point from its string form to an integer in the
index b8c8d5f..31cdc5c 100644 (file)
@@ -1049,10 +1049,20 @@ used in the same call, so in practice this confusion does not arise.
 
 If the syntax ``**expression`` appears in the function call, ``expression`` must
 evaluate to a :term:`mapping`, the contents of which are treated as
-additional keyword arguments.  If a keyword is already present
-(as an explicit keyword argument, or from another unpacking),
+additional keyword arguments. If a parameter matching a key has already been
+given a value (by an explicit keyword argument, or from another unpacking),
 a :exc:`TypeError` exception is raised.
 
+When ``**expression`` is used, each key in this mapping must be
+a string.
+Each value from the mapping is assigned to the first formal parameter
+eligible for keyword assignment whose name is equal to the key.
+A key need not be a Python identifier (e.g. ``"max-temp Â°F"`` is acceptable,
+although it will not match any formal parameter that could be declared).
+If there is no match to a formal parameter
+the key-value pair is collected by the ``**`` parameter, if there is one,
+or if there is not, a :exc:`TypeError` exception is raised.
+
 Formal parameters using the syntax ``*identifier`` or ``**identifier`` cannot be
 used as positional argument slots or as keyword argument names.
 
@@ -1713,6 +1723,12 @@ returns a boolean value regardless of the type of its argument
 (for example, ``not 'foo'`` produces ``False`` rather than ``''``.)
 
 
+.. index::
+   single: := (colon equals)
+   single: assignment expression
+   single: walrus operator
+   single: named expression
+
 Assignment expressions
 ======================
 
@@ -1738,6 +1754,13 @@ Or, when processing a file stream in chunks:
    while chunk := file.read(9000):
        process(chunk)
 
+Assignment expressions must be surrounded by parentheses when used
+as sub-expressions in slicing, conditional, lambda,
+keyword-argument, and comprehension-if expressions
+and in ``assert`` and ``with`` statements.
+In all other places where they can be used, parentheses are not required,
+including in ``if`` and ``while`` statements.
+
 .. versionadded:: 3.8
    See :pep:`572` for more details about assignment expressions.
 
index 92ae9fd..3837975 100644 (file)
@@ -1015,25 +1015,6 @@ and ``__main__.__spec__`` is set accordingly, they're still considered
 to populate the ``__main__`` namespace, and not during normal import.
 
 
-Open issues
-===========
-
-XXX It would be really nice to have a diagram.
-
-XXX * (import_machinery.rst) how about a section devoted just to the
-attributes of modules and packages, perhaps expanding upon or supplanting the
-related entries in the data model reference page?
-
-XXX runpy, pkgutil, et al in the library manual should all get "See Also"
-links at the top pointing to the new import system section.
-
-XXX Add more explanation regarding the different ways in which
-``__main__`` is initialized?
-
-XXX Add more info on ``__main__`` quirks/pitfalls (i.e. copy from
-:pep:`395`).
-
-
 References
 ==========
 
index 915b28a..9abdde0 100644 (file)
@@ -101,33 +101,24 @@ def source_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
 class ImplementationDetail(Directive):
 
     has_content = True
-    required_arguments = 0
-    optional_arguments = 1
     final_argument_whitespace = True
 
     # This text is copied to templates/dummy.html
     label_text = 'CPython implementation detail:'
 
     def run(self):
+        self.assert_has_content()
         pnode = nodes.compound(classes=['impl-detail'])
         label = translators['sphinx'].gettext(self.label_text)
         content = self.content
         add_text = nodes.strong(label, label)
-        if self.arguments:
-            n, m = self.state.inline_text(self.arguments[0], self.lineno)
-            pnode.append(nodes.paragraph('', '', *(n + m)))
         self.state.nested_parse(content, self.content_offset, pnode)
-        if pnode.children and isinstance(pnode[0], nodes.paragraph):
-            content = nodes.inline(pnode[0].rawsource, translatable=True)
-            content.source = pnode[0].source
-            content.line = pnode[0].line
-            content += pnode[0].children
-            pnode[0].replace_self(nodes.paragraph('', '', content,
-                                                  translatable=False))
-            pnode[0].insert(0, add_text)
-            pnode[0].insert(1, nodes.Text(' '))
-        else:
-            pnode.insert(0, nodes.paragraph('', '', add_text))
+        content = nodes.inline(pnode[0].rawsource, translatable=True)
+        content.source = pnode[0].source
+        content.line = pnode[0].line
+        content += pnode[0].children
+        pnode[0].replace_self(nodes.paragraph(
+            '', '', add_text, nodes.Text(' '), content, translatable=False))
         return [pnode]
 
 
index 7504978..c1b2724 100644 (file)
@@ -12,7 +12,7 @@ extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);"
 extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)) {"
 extending/newtypes,,:call,"if (!PyArg_ParseTuple(args, ""sss:call"", &arg1, &arg2, &arg3)) {"
 faq/programming,,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr("
-faq/programming,,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,"
+faq/programming,,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+'\n'+y,map(lambda y,"
 faq/programming,,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,"
 faq/windows,,:d48eceb,"Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32"
 howto/curses,,:black,"colors when it activates color mode.  They are: 0:black, 1:red,"
index 3f09db2..ecfb612 100644 (file)
@@ -275,8 +275,27 @@ re-raise the exception::
 Exception Chaining
 ==================
 
-The :keyword:`raise` statement allows an optional :keyword:`from<raise>` which enables
-chaining exceptions. For example::
+If an unhandled exception occurs inside an :keyword:`except` section, it will
+have the exception being handled attached to it and included in the error
+message::
+
+    >>> try:
+    ...     open("database.sqlite")
+    ... except OSError:
+    ...     raise RuntimeError("unable to handle error")
+    ...
+    Traceback (most recent call last):
+      File "<stdin>", line 2, in <module>
+    FileNotFoundError: [Errno 2] No such file or directory: 'database.sqlite'
+    <BLANKLINE>
+    During handling of the above exception, another exception occurred:
+    <BLANKLINE>
+    Traceback (most recent call last):
+      File "<stdin>", line 4, in <module>
+    RuntimeError: unable to handle error
+
+To indicate that an exception is a direct consequence of another, the
+:keyword:`raise` statement allows an optional :keyword:`from<raise>` clause::
 
     # exc must be exception instance or None.
     raise RuntimeError from exc
@@ -302,9 +321,8 @@ This can be useful when you are transforming exceptions. For example::
       File "<stdin>", line 4, in <module>
     RuntimeError: Failed to open database
 
-Exception chaining happens automatically when an exception is raised inside an
-:keyword:`except` or :keyword:`finally` section. This can be
-disabled by using ``from None`` idiom:
+It also allows disabling automatic exception chaining using the ``from None``
+idiom::
 
     >>> try:
     ...     open('database.sqlite')
index d341400..3581b37 100644 (file)
@@ -133,7 +133,17 @@ applies :func:`repr`::
    >>> print(f'My hovercraft is full of {animals!r}.')
    My hovercraft is full of 'eels'.
 
-For a reference on these format specifications, see
+The ``=`` specifier can be used to expand an expression to the text of the
+expression, an equal sign, then the representation of the evaluated expression:
+
+   >>> bugs = 'roaches'
+   >>> count = 13
+   >>> area = 'living room'
+   >>> print(f'Debugging {bugs=} {count=} {area=}')
+   Debugging bugs='roaches' count=13 area='living room'
+
+See :ref:`self-documenting expressions <bpo-36817-whatsnew>` for more information
+on the ``=`` specifier. For a reference on these format specifications, see
 the reference guide for the :ref:`formatspec`.
 
 .. _tut-string-format:
@@ -468,7 +478,7 @@ becomes complicated.
 Rather than having users constantly writing and debugging code to save
 complicated data types to files, Python allows you to use the popular data
 interchange format called `JSON (JavaScript Object Notation)
-<http://json.org>`_.  The standard module called :mod:`json` can take Python
+<https://json.org>`_.  The standard module called :mod:`json` can take Python
 data hierarchies, and convert them to string representations; this process is
 called :dfn:`serializing`.  Reconstructing the data from the string representation
 is called :dfn:`deserializing`.  Between serializing and deserializing, the
index 33678f5..558b1c3 100644 (file)
@@ -70,8 +70,8 @@ the ones with a fractional part (e.g. ``5.0``, ``1.6``) have type
 :class:`float`.  We will see more about numeric types later in the tutorial.
 
 Division (``/``) always returns a float.  To do :term:`floor division` and
-get an integer result (discarding any fractional result) you can use the ``//``
-operator; to calculate the remainder you can use ``%``::
+get an integer result you can use the ``//`` operator; to calculate
+the remainder you can use ``%``::
 
    >>> 17 / 3  # classic division returns a float
    5.666666666666667
@@ -234,12 +234,12 @@ This only works with two literals though, not with variables or expressions::
    >>> prefix 'thon'  # can't concatenate a variable and a string literal
      File "<stdin>", line 1
        prefix 'thon'
-                   ^
+              ^^^^^^
    SyntaxError: invalid syntax
    >>> ('un' * 3) 'ium'
      File "<stdin>", line 1
        ('un' * 3) 'ium'
-                      ^
+                  ^^^^^
    SyntaxError: invalid syntax
 
 If you want to concatenate variables or a variable and a literal, use ``+``::
index 3f9f136..061cfa5 100644 (file)
@@ -158,16 +158,16 @@ Custom OpenSSL
    .. code-block:: shell-session
 
       $ curl -O https://www.openssl.org/source/openssl-VERSION.tar.gz
-         $ tar xzf openssl-VERSION
-         $ pushd openssl-VERSION
-         $ ./config \
-              --prefix=/usr/local/custom-openssl \
-              --libdir=lib \
-              --openssldir=/etc/ssl
-         $ make -j1 depend
-         $ make -j8
-         $ make install_sw
-         $ popd
+      $ tar xzf openssl-VERSION
+      $ pushd openssl-VERSION
+      $ ./config \
+          --prefix=/usr/local/custom-openssl \
+          --libdir=lib \
+          --openssldir=/etc/ssl
+      $ make -j1 depend
+      $ make -j8
+      $ make install_sw
+      $ popd
 
 3. Build Python with custom OpenSSL
    (see the configure `--with-openssl` and `--with-openssl-rpath` options)
index e0da5d2..35e26eb 100644 (file)
@@ -150,11 +150,14 @@ of available options is shown below.
 |                           |                                      | Python X.Y`              |
 +---------------------------+--------------------------------------+--------------------------+
 | DefaultJustForMeTargetDir | The default install directory for    | :file:`%LocalAppData%\\\ |
-|                           | just-for-me installs                 | Programs\\PythonXY` or   |
+|                           | just-for-me installs                 | Programs\\Python\\\      |
+|                           |                                      | PythonXY` or             |
 |                           |                                      | :file:`%LocalAppData%\\\ |
-|                           |                                      | Programs\\PythonXY-32` or|
+|                           |                                      | Programs\\Python\\\      |
+|                           |                                      | PythonXY-32` or          |
 |                           |                                      | :file:`%LocalAppData%\\\ |
-|                           |                                      | Programs\\PythonXY-64`   |
+|                           |                                      | Programs\\Python\\\      |
+|                           |                                      | PythonXY-64`             |
 +---------------------------+--------------------------------------+--------------------------+
 | DefaultCustomTargetDir    | The default custom install directory | (empty)                  |
 |                           | displayed in the UI                  |                          |
@@ -1165,7 +1168,7 @@ With ongoing development of Python, some platforms that used to be supported
 earlier are no longer supported (due to the lack of users or developers).
 Check :pep:`11` for details on all unsupported platforms.
 
-* `Windows CE <http://pythonce.sourceforge.net/>`_ is
+* `Windows CE <https://pythonce.sourceforge.net/>`_ is
   `no longer supported <https://github.com/python/cpython/issues/71542>`__
   since Python 3 (if it ever was).
 * The `Cygwin <https://cygwin.com/>`_ installer offers to install the
index e40218e..6a382a4 100644 (file)
@@ -572,7 +572,7 @@ Work has been done on porting Python to 64-bit Windows on the Itanium processor,
 mostly by Trent Mick of ActiveState.  (Confusingly, ``sys.platform`` is still
 ``'win32'`` on Win64 because it seems that for ease of porting, MS Visual C++
 treats code as 32 bit on Itanium.) PythonWin also supports Windows CE; see the
-Python CE page at http://pythonce.sourceforge.net/ for more information.
+Python CE page at https://pythonce.sourceforge.net/ for more information.
 
 Another new platform is Darwin/MacOS X; initial support for it is in Python 2.0.
 Dynamic loading works, if you specify "configure --with-dyld --with-suffix=.x".
index 9355c1b..3999766 100644 (file)
@@ -983,7 +983,7 @@ New and Improved Modules
   Jun-ichiro "itojun" Hagino.)
 
 * Two new format characters were added to the :mod:`struct` module for 64-bit
-  integers on platforms that support the C :c:type:`long long` type.  ``q`` is for
+  integers on platforms that support the C :c:expr:`long long` type.  ``q`` is for
   a signed 64-bit integer, and ``Q`` is for an unsigned one.  The value is
   returned in Python's long integer type.  (Contributed by Tim Peters.)
 
@@ -1102,7 +1102,7 @@ code, none of the changes described here will affect you very much.
 * A different argument parsing function, :c:func:`PyArg_UnpackTuple`, has been
   added that's simpler and presumably faster.  Instead of specifying a format
   string, the caller simply gives the minimum and maximum number of arguments
-  expected, and a set of pointers to :c:type:`PyObject\*` variables that will be
+  expected, and a set of pointers to :c:expr:`PyObject*` variables that will be
   filled in with argument values.
 
 * Two new flags :const:`METH_NOARGS` and :const:`METH_O` are available in method
index 55061d2..c6e2003 100644 (file)
@@ -1231,7 +1231,7 @@ complete list of changes, or look through the CVS logs for all the details.
   repeat an array. (Contributed by Jason Orendorff.)
 
 * The :mod:`bsddb` module has been replaced by version 4.1.6 of the `PyBSDDB
-  <http://pybsddb.sourceforge.net>`_ package, providing a more complete interface
+  <https://pybsddb.sourceforge.net>`_ package, providing a more complete interface
   to the transactional features of the BerkeleyDB library.
 
   The old version of the module has been renamed to  :mod:`bsddb185` and is no
@@ -1905,8 +1905,8 @@ Changes to Python's build process and to the C API include:
   "")`` instead, but this will be slower than using :const:`METH_NOARGS`.
 
 * :c:func:`PyArg_ParseTuple` accepts new format characters for various sizes of
-  unsigned integers: ``B`` for :c:type:`unsigned char`, ``H`` for :c:type:`unsigned
-  short int`,  ``I`` for :c:type:`unsigned int`,  and ``K`` for :c:type:`unsigned
+  unsigned integers: ``B`` for :c:expr:`unsigned char`, ``H`` for :c:expr:`unsigned
+  short int`,  ``I`` for :c:expr:`unsigned int`,  and ``K`` for :c:expr:`unsigned
   long long`.
 
 * A new function, ``PyObject_DelItemString(mapping, char *key)`` was added
index ddfac1a..63e8198 100644 (file)
@@ -472,7 +472,7 @@ PEP 327: Decimal Data Type
 ==========================
 
 Python has always supported floating-point (FP) numbers, based on the underlying
-C :c:type:`double` type, as a data type.  However, while most programming
+C :c:expr:`double` type, as a data type.  However, while most programming
 languages provide a floating-point type, many people (even programmers) are
 unaware that floating-point numbers don't represent certain decimal fractions
 accurately.  The new :class:`Decimal` type can represent these fractions
@@ -501,7 +501,7 @@ mantissa is multiplied by 4 (2 to the power of the exponent 2); 1.25 \* 4 equals
 5.
 
 Modern systems usually provide floating-point support that conforms to a
-standard called IEEE 754.  C's :c:type:`double` type is usually implemented as a
+standard called IEEE 754.  C's :c:expr:`double` type is usually implemented as a
 64-bit IEEE 754 number, which uses 52 bits of space for the mantissa.  This
 means that numbers can only be specified to 52 bits of precision.  If you're
 trying to represent numbers whose expansion repeats endlessly, the expansion is
@@ -750,10 +750,10 @@ The solution described in the PEP is to add three new functions to the Python
 API that perform ASCII-only conversions, ignoring the locale setting:
 
 * ``PyOS_ascii_strtod(str, ptr)``  and ``PyOS_ascii_atof(str, ptr)``
-  both convert a string to a C :c:type:`double`.
+  both convert a string to a C :c:expr:`double`.
 
 * ``PyOS_ascii_formatd(buffer, buf_len, format, d)`` converts a
-  :c:type:`double` to an ASCII string.
+  :c:expr:`double` to an ASCII string.
 
 The code for these functions came from the GLib library
 (https://developer.gnome.org/glib/stable/), whose developers kindly
@@ -1453,7 +1453,7 @@ Some of the changes to Python's build process and to the C API are:
   extension functions: :c:macro:`Py_RETURN_NONE`, :c:macro:`Py_RETURN_TRUE`, and
   :c:macro:`Py_RETURN_FALSE`. (Contributed by Brett Cannon.)
 
-* Another new macro, :c:macro:`Py_CLEAR(obj)`,  decreases the reference count of
+* Another new macro, :c:macro:`Py_CLEAR`,  decreases the reference count of
   *obj* and sets *obj* to the null pointer.  (Contributed by Jim Fulton.)
 
 * A new function, ``PyTuple_Pack(N, obj1, obj2, ..., objN)``, constructs
@@ -1464,7 +1464,7 @@ Some of the changes to Python's build process and to the C API are:
   lookups without masking exceptions raised during the look-up process.
   (Contributed by Raymond Hettinger.)
 
-* The :c:macro:`Py_IS_NAN(X)` macro returns 1 if  its float or double argument
+* The :c:expr:`Py_IS_NAN(X)` macro returns 1 if  its float or double argument
   *X* is a NaN.   (Contributed by Tim Peters.)
 
 * C code can avoid unnecessary locking by using the new
index 6c21682..dcfaef6 100644 (file)
@@ -872,18 +872,18 @@ PEP 353: Using ssize_t as the index type
 ========================================
 
 A wide-ranging change to Python's C API, using a new  :c:type:`Py_ssize_t` type
-definition instead of :c:type:`int`,  will permit the interpreter to handle more
+definition instead of :c:expr:`int`,  will permit the interpreter to handle more
 data on 64-bit platforms. This change doesn't affect Python's capacity on 32-bit
 platforms.
 
-Various pieces of the Python interpreter used C's :c:type:`int` type to store
+Various pieces of the Python interpreter used C's :c:expr:`int` type to store
 sizes or counts; for example, the number of items in a list or tuple were stored
-in an :c:type:`int`.  The C compilers for most 64-bit platforms still define
-:c:type:`int` as a 32-bit type, so that meant that lists could only hold up to
+in an :c:expr:`int`.  The C compilers for most 64-bit platforms still define
+:c:expr:`int` as a 32-bit type, so that meant that lists could only hold up to
 ``2**31 - 1`` = 2147483647 items. (There are actually a few different
 programming models that 64-bit C compilers can use -- see
 https://unix.org/version2/whatsnew/lp64_wp.html for a discussion -- but the
-most commonly available model leaves :c:type:`int` as 32 bits.)
+most commonly available model leaves :c:expr:`int` as 32 bits.)
 
 A limit of 2147483647 items doesn't really matter on a 32-bit platform because
 you'll run out of memory before hitting the length limit. Each list item
@@ -895,7 +895,7 @@ It's possible to address that much memory on a 64-bit platform, however.  The
 pointers for a list that size would only require 16 GiB of space, so it's not
 unreasonable that Python programmers might construct lists that large.
 Therefore, the Python interpreter had to be changed to use some type other than
-:c:type:`int`, and this will be a 64-bit type on 64-bit platforms.  The change
+:c:expr:`int`, and this will be a 64-bit type on 64-bit platforms.  The change
 will cause incompatibilities on 64-bit machines, so it was deemed worth making
 the transition now, while the number of 64-bit users is still relatively small.
 (In 5 or 10 years, we may *all* be on 64-bit machines, and the transition would
@@ -909,7 +909,7 @@ may therefore need to have some variables changed to :c:type:`Py_ssize_t`.
 
 The :c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue` functions have a new
 conversion code, ``n``, for :c:type:`Py_ssize_t`.   :c:func:`PyArg_ParseTuple`'s
-``s#`` and ``t#`` still output :c:type:`int` by default, but you can define the
+``s#`` and ``t#`` still output :c:expr:`int` by default, but you can define the
 macro  :c:macro:`PY_SSIZE_T_CLEAN` before including :file:`Python.h`  to make
 them return :c:type:`Py_ssize_t`.
 
@@ -1695,7 +1695,7 @@ attributes of the :class:`CDLL` object.   ::
    result = libc.printf("Line of output\n")
 
 Type constructors for the various C types are provided: :func:`c_int`,
-:func:`c_float`, :func:`c_double`, :func:`c_char_p` (equivalent to :c:type:`char
+:func:`c_float`, :func:`c_double`, :func:`c_char_p` (equivalent to :c:expr:`char
 \*`), and so forth.  Unlike Python's types, the C versions are all mutable; you
 can assign to their :attr:`value` attribute to change the wrapped value.  Python
 integers and strings will be automatically converted to the corresponding C
@@ -1725,7 +1725,7 @@ attribute of the function object to  change this::
 ``ctypes.pythonapi`` object.  This object does *not*  release the global
 interpreter lock before calling a function, because the lock must be held when
 calling into the interpreter's code.   There's a :class:`py_object()` type
-constructor that will create a  :c:type:`PyObject \*` pointer.  A simple usage::
+constructor that will create a  :c:expr:`PyObject *` pointer.  A simple usage::
 
    import ctypes
 
@@ -2093,7 +2093,7 @@ Changes to Python's build process and to the C API include:
 
 * The largest change to the C API came from :pep:`353`, which modifies the
   interpreter to use a :c:type:`Py_ssize_t` type definition instead of
-  :c:type:`int`.  See the earlier section :ref:`pep-353` for a discussion of this
+  :c:expr:`int`.  See the earlier section :ref:`pep-353` for a discussion of this
   change.
 
 * The design of the bytecode compiler has changed a great deal,  no longer
@@ -2264,15 +2264,15 @@ code:
   Setting  :attr:`rpc_paths` to ``None`` or an empty tuple disables  this path
   checking.
 
-* C API: Many functions now use :c:type:`Py_ssize_t`  instead of :c:type:`int` to
+* C API: Many functions now use :c:type:`Py_ssize_t`  instead of :c:expr:`int` to
   allow processing more data on 64-bit machines.  Extension code may need to make
   the same change to avoid warnings and to support 64-bit machines.  See the
   earlier section :ref:`pep-353` for a discussion of this change.
 
 * C API:  The obmalloc changes mean that  you must be careful to not mix usage
-  of the :c:func:`PyMem_\*` and :c:func:`PyObject_\*` families of functions. Memory
-  allocated with  one family's :c:func:`\*_Malloc` must be  freed with the
-  corresponding family's :c:func:`\*_Free` function.
+  of the ``PyMem_*`` and ``PyObject_*`` families of functions. Memory
+  allocated with  one family's ``*_Malloc`` must be  freed with the
+  corresponding family's ``*_Free`` function.
 
 .. ======================================================================
 
index 3d0d187..731ce6a 100644 (file)
@@ -217,7 +217,7 @@ the time required to finish the job.
 During the 2.6 development cycle, Georg Brandl put a lot of effort
 into building a new toolchain for processing the documentation.  The
 resulting package is called Sphinx, and is available from
-http://sphinx-doc.org/.
+https://www.sphinx-doc.org/.
 
 Sphinx concentrates on HTML output, producing attractively styled and
 modern HTML; printed output is still supported through conversion to
@@ -235,7 +235,7 @@ have adopted Sphinx as their documentation tool.
    `Documenting Python <https://devguide.python.org/documenting/>`__
        Describes how to write for Python's documentation.
 
-   `Sphinx <http://sphinx-doc.org/>`__
+   `Sphinx <https://www.sphinx-doc.org/>`__
      Documentation and code for the Sphinx toolchain.
 
    `Docutils <https://docutils.sourceforge.io>`__
@@ -1926,7 +1926,7 @@ changes, or look through the Subversion logs for all the details.
   the left to six places.  (Contributed by Skip Montanaro; :issue:`1158`.)
 
 * The :mod:`decimal` module was updated to version 1.66 of
-  `the General Decimal Specification <http://speleotrove.com/decimal/decarith.html>`__.  New features
+  `the General Decimal Specification <https://speleotrove.com/decimal/decarith.html>`__.  New features
   include some methods for some basic mathematical functions such as
   :meth:`exp` and :meth:`log10`::
 
@@ -2389,7 +2389,7 @@ changes, or look through the Subversion logs for all the details.
   has been updated from version 2.3.2 in Python 2.5 to
   version 2.4.1.
 
-* The :mod:`struct` module now supports the C99 :c:type:`_Bool` type,
+* The :mod:`struct` module now supports the C99 :c:expr:`_Bool` type,
   using the format character ``'?'``.
   (Contributed by David Remahl.)
 
index f79dcdc..fbfcc5d 100644 (file)
@@ -2144,7 +2144,7 @@ Changes to Python's build process and to the C API include:
 
 * New functions: :c:func:`PyLong_AsLongAndOverflow` and
   :c:func:`PyLong_AsLongLongAndOverflow`  approximates a Python long
-  integer as a C :c:type:`long` or :c:type:`long long`.
+  integer as a C :c:expr:`long` or :c:expr:`long long`.
   If the number is too large to fit into
   the output type, an *overflow* flag is set and returned to the caller.
   (Contributed by Case Van Horsen; :issue:`7528` and :issue:`7767`.)
@@ -2202,7 +2202,7 @@ Changes to Python's build process and to the C API include:
 * New format codes: the :c:func:`PyFormat_FromString`,
   :c:func:`PyFormat_FromStringV`, and :c:func:`PyErr_Format` functions now
   accept ``%lld`` and ``%llu`` format codes for displaying
-  C's :c:type:`long long` types.
+  C's :c:expr:`long long` types.
   (Contributed by Mark Dickinson; :issue:`7228`.)
 
 * The complicated interaction between threads and process forking has
index 6ce6358..fba8816 100644 (file)
@@ -451,7 +451,7 @@ Major performance enhancements have been added:
 * The :mod:`json` module now has a C extension to substantially improve
   its performance.  In addition, the API was modified so that json works
   only with :class:`str`, not with :class:`bytes`.  That change makes the
-  module closely match the `JSON specification <http://json.org/>`_
+  module closely match the `JSON specification <https://json.org/>`_
   which is defined in terms of Unicode.
 
   (Contributed by Bob Ippolito and converted to Py3.1 by Antoine Pitrou
index 16855c1..67eaeff 100644 (file)
@@ -2338,3 +2338,11 @@ line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion
 length limitation <int_max_str_digits>` documentation.  The default limit
 is 4300 digits in string form.
 
+Notable security feature in 3.10.8
+==================================
+
+The deprecated :mod:`mailcap` module now refuses to inject unsafe text
+(filenames, MIME types, parameters) into shell commands. Instead of using such
+text, it will warn and act as if a match was not found (or for test commands,
+as if the test failed).
+(Contributed by Petr Viktorin in :gh:`98966`.)
index e53955e..9b5bbd3 100644 (file)
@@ -972,7 +972,7 @@ sites do not finish before midnight, the barrier times-out and the ballots are
 sealed and deposited in a queue for later handling.
 
 See `Barrier Synchronization Patterns
-<http://osl.cs.illinois.edu/media/papers/karmani-2009-barrier_synchronization_pattern.pdf>`_
+<https://osl.cs.illinois.edu/media/papers/karmani-2009-barrier_synchronization_pattern.pdf>`_
 for more examples of how barriers can be used in parallel computing.  Also, there is
 a simple but thorough explanation of barriers in `The Little Book of Semaphores
 <https://greenteapress.com/semaphores/LittleBookOfSemaphores.pdf>`_, *section 3.6*.
@@ -2418,7 +2418,7 @@ Unicode
 =======
 
 Python has been updated to `Unicode 6.0.0
-<http://unicode.org/versions/Unicode6.0.0/>`_.  The update to the standard adds
+<https://unicode.org/versions/Unicode6.0.0/>`_.  The update to the standard adds
 over 2,000 new characters including `emoji <https://en.wikipedia.org/wiki/Emoji>`_
 symbols which are important for mobile phones.
 
@@ -2426,7 +2426,7 @@ In addition, the updated standard has altered the character properties for two
 Kannada characters (U+0CF1, U+0CF2) and one New Tai Lue numeric character
 (U+19DA), making the former eligible for use in identifiers while disqualifying
 the latter.  For more information, see `Unicode Character Database Changes
-<http://www.unicode.org/versions/Unicode6.0.0/#Database_Changes>`_.
+<https://www.unicode.org/versions/Unicode6.0.0/#Database_Changes>`_.
 
 
 Codecs
index 1b5b683..fef1a8a 100644 (file)
@@ -932,7 +932,7 @@ it can now be used as a class decorator (:issue:`10868`).
 array
 -----
 
-The :mod:`array` module supports the :c:type:`long long` type using ``q`` and
+The :mod:`array` module supports the :c:expr:`long long` type using ``q`` and
 ``Q`` type codes.
 
 (Contributed by Oren Tirosh and Hirokazu Yamamoto in :issue:`1172711`.)
@@ -1898,7 +1898,7 @@ socket
   family on OS X.  (Contributed by Michael Goderbauer in :issue:`13777`.)
 
 * New function :func:`~socket.sethostname` allows the hostname to be set
-  on unix systems if the calling process has sufficient privileges.
+  on Unix systems if the calling process has sufficient privileges.
   (Contributed by Ross Lagerwall in :issue:`10866`.)
 
 
@@ -2267,7 +2267,7 @@ The :c:type:`Py_UNICODE` has been deprecated by :pep:`393` and will be
 removed in Python 4. All functions using this type are deprecated:
 
 Unicode functions and methods using :c:type:`Py_UNICODE` and
-:c:type:`Py_UNICODE*` types:
+:c:expr:`Py_UNICODE*` types:
 
 * :c:macro:`PyUnicode_FromUnicode`: use :c:func:`PyUnicode_FromWideChar` or
   :c:func:`PyUnicode_FromKindAndData`
index e179bb9..dc2ec17 100644 (file)
@@ -1963,7 +1963,7 @@ Other Improvements
   <https://devguide.python.org/coverage/#measuring-coverage-of-c-code-with-gcov-and-lcov>`_
   will build python, run the test suite, and generate an HTML coverage report
   for the C codebase using ``gcov`` and `lcov
-  <http://ltp.sourceforge.net/coverage/lcov.php>`_.
+  <https://ltp.sourceforge.net/coverage/lcov.php>`_.
 
 * The ``-R`` option to the :ref:`python regression test suite <regrtest>` now
   also checks for memory allocation leaks, using
index 89b8eef..625373d 100644 (file)
@@ -1977,7 +1977,7 @@ unicodedata
 -----------
 
 The :mod:`unicodedata` module now uses data from `Unicode 8.0.0
-<http://unicode.org/versions/Unicode8.0.0/>`_.
+<https://unicode.org/versions/Unicode8.0.0/>`_.
 
 
 unittest
index 33c4ed3..d1a9aa7 100644 (file)
@@ -1644,7 +1644,7 @@ unicodedata
 -----------
 
 The :mod:`unicodedata` module now uses data from `Unicode 9.0.0
-<http://unicode.org/versions/Unicode9.0.0/>`_.
+<https://unicode.org/versions/Unicode9.0.0/>`_.
 (Contributed by Benjamin Peterson.)
 
 
index 98ed72c..ece4069 100644 (file)
@@ -290,21 +290,21 @@ PEP 539: New C API for Thread-Local Storage
 
 While Python provides a C API for thread-local storage support; the existing
 :ref:`Thread Local Storage (TLS) API <thread-local-storage-api>` has used
-:c:type:`int` to represent TLS keys across all platforms.  This has not
+:c:expr:`int` to represent TLS keys across all platforms.  This has not
 generally been a problem for officially support platforms, but that is neither
 POSIX-compliant, nor portable in any practical sense.
 
 :pep:`539` changes this by providing a new :ref:`Thread Specific Storage (TSS)
 API <thread-specific-storage-api>` to CPython which supersedes use of the
 existing TLS API within the CPython interpreter, while deprecating the existing
-API.  The TSS API uses a new type :c:type:`Py_tss_t` instead of :c:type:`int`
+API.  The TSS API uses a new type :c:type:`Py_tss_t` instead of :c:expr:`int`
 to represent TSS keys--an opaque type the definition of which may depend on
 the underlying TLS implementation.  Therefore, this will allow to build CPython
 on platforms where the native TLS key is defined in a way that cannot be safely
-cast to :c:type:`int`.
+cast to :c:expr:`int`.
 
 Note that on platforms where the native TLS key is defined in a way that cannot
-be safely cast to :c:type:`int`, all functions of the existing TLS API will be
+be safely cast to :c:expr:`int`, all functions of the existing TLS API will be
 no-op and immediately return failure. This indicates clearly that the old API
 is not supported on platforms where it cannot be used reliably, and that no
 effort will be made to add such support.
@@ -1507,7 +1507,7 @@ unicodedata
 -----------
 
 The internal :mod:`unicodedata` database has been upgraded to use `Unicode 11
-<http://www.unicode.org/versions/Unicode11.0.0/>`_. (Contributed by Benjamin
+<https://www.unicode.org/versions/Unicode11.0.0/>`_. (Contributed by Benjamin
 Peterson.)
 
 
@@ -1708,12 +1708,12 @@ Contributed by Paul Ganssle in :issue:`10381`.
 
 The type of results of :c:func:`PyThread_start_new_thread` and
 :c:func:`PyThread_get_thread_ident`, and the *id* parameter of
-:c:func:`PyThreadState_SetAsyncExc` changed from :c:type:`long` to
-:c:type:`unsigned long`.
+:c:func:`PyThreadState_SetAsyncExc` changed from :c:expr:`long` to
+:c:expr:`unsigned long`.
 (Contributed by Serhiy Storchaka in :issue:`6532`.)
 
 :c:func:`PyUnicode_AsWideCharString` now raises a :exc:`ValueError` if the
-second argument is ``NULL`` and the :c:type:`wchar_t*` string contains null
+second argument is ``NULL`` and the :c:expr:`wchar_t*` string contains null
 characters.  (Contributed by Serhiy Storchaka in :issue:`30708`.)
 
 Changes to the startup sequence and the management of dynamic memory
index 51e1f9a..7f85ff3 100644 (file)
@@ -250,6 +250,7 @@ Android and Cygwin, whose cases are handled by the script);
 this change is backward incompatible on purpose.
 (Contributed by Victor Stinner in :issue:`36721`.)
 
+.. _bpo-36817-whatsnew:
 
 f-strings support ``=`` for self-documenting expressions and debugging
 ----------------------------------------------------------------------
@@ -1347,7 +1348,7 @@ unicodedata
 -----------
 
 The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.1.0
-<http://blog.unicode.org/2019/05/unicode-12-1-en.html>`_ release.
+<https://blog.unicode.org/2019/05/unicode-12-1-en.html>`_ release.
 
 New function :func:`~unicodedata.is_normalized` can be used to verify a string
 is in a specific normal form, often much faster than by actually normalizing
@@ -2011,7 +2012,7 @@ Changes in the Python API
 Changes in the C API
 --------------------
 
-* The :c:type:`PyCompilerFlags` structure got a new *cf_feature_version*
+* The :c:struct:`PyCompilerFlags` structure got a new *cf_feature_version*
   field. It should be initialized to ``PY_MINOR_VERSION``. The field is ignored
   by default, and is used if and only if ``PyCF_ONLY_AST`` flag is set in
   *cf_flags*.
index 9408e36..20d79de 100644 (file)
@@ -773,7 +773,7 @@ Optimizations
   Stinner in :issue:`38061`.)
 
 * :c:func:`PyLong_FromDouble` is now up to 1.87x faster for values that
-  fit into :c:type:`long`.
+  fit into :c:expr:`long`.
   (Contributed by Sergey Fedoseev in :issue:`37986`.)
 
 * A number of Python builtins (:class:`range`, :class:`tuple`, :class:`set`,
index 0bd1a83..4d4def9 100644 (file)
@@ -44,7 +44,7 @@
    Actual implementation of these macros may differ depending on the
    dynamic analysis tool being used.
 
-   See http://code.google.com/p/data-race-test/  for more information.
+   See https://code.google.com/p/data-race-test/  for more information.
 
    This file supports the following dynamic analysis tools:
    - None (DYNAMIC_ANNOTATIONS_ENABLED is not defined or zero).
      of the mutex's critical sections individually using the annotations above.
      This annotation makes sense only for hybrid race detectors. For pure
      happens-before detectors this is a no-op. For more details see
-     http://code.google.com/p/data-race-test/wiki/PureHappensBeforeVsHybrid . */
+     https://code.google.com/p/data-race-test/wiki/PureHappensBeforeVsHybrid . */
 #define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) \
     AnnotateMutexIsUsedAsCondVar(__FILE__, __LINE__, mu)
 
index 1714f85..273caa9 100644 (file)
 /*--start constants--*/
 #define PY_MAJOR_VERSION        3
 #define PY_MINOR_VERSION        10
-#define PY_MICRO_VERSION        7
+#define PY_MICRO_VERSION        8
 #define PY_RELEASE_LEVEL        PY_RELEASE_LEVEL_FINAL
 #define PY_RELEASE_SERIAL       0
 
 /* Version as a string */
-#define PY_VERSION              "3.10.7"
+#define PY_VERSION              "3.10.8"
 /*--end constants--*/
 
 /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
diff --git a/LICENSE b/LICENSE
index 02a5145..9838d44 100644 (file)
--- a/LICENSE
+++ b/LICENSE
@@ -2,12 +2,12 @@ A. HISTORY OF THE SOFTWARE
 ==========================
 
 Python was created in the early 1990s by Guido van Rossum at Stichting
-Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands
 as a successor of a language called ABC.  Guido remains Python's
 principal author, although it includes many contributions from others.
 
 In 1995, Guido continued his work on Python at the Corporation for
-National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+National Research Initiatives (CNRI, see https://www.cnri.reston.va.us)
 in Reston, Virginia where he released several versions of the
 software.
 
@@ -19,7 +19,7 @@ https://www.python.org/psf/) was formed, a non-profit organization
 created specifically to own Python-related Intellectual Property.
 Zope Corporation was a sponsoring member of the PSF.
 
-All Python releases are Open Source (see http://www.opensource.org for
+All Python releases are Open Source (see https://opensource.org for
 the Open Source Definition).  Historically, most, but not all, Python
 releases have also been GPL-compatible; the table below summarizes
 the various releases.
index f4d2f6e..6f235c2 100644 (file)
@@ -53,10 +53,12 @@ def parse(source, filename='<unknown>', mode='exec', *,
 
 def literal_eval(node_or_string):
     """
-    Safely evaluate an expression node or a string containing a Python
+    Evaluate an expression node or a string containing only a Python
     expression.  The string or node provided may only consist of the following
     Python literal structures: strings, bytes, numbers, tuples, lists, dicts,
     sets, booleans, and None.
+
+    Caution: A complex expression can overflow the C stack and cause a crash.
     """
     if isinstance(node_or_string, str):
         node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval')
@@ -849,7 +851,7 @@ class _Unparser(NodeVisitor):
 
     def visit_ImportFrom(self, node):
         self.fill("from ")
-        self.write("." * node.level)
+        self.write("." * (node.level or 0))
         if node.module:
             self.write(node.module)
         self.write(" import ")
index ea10399..2384985 100644 (file)
@@ -573,9 +573,11 @@ class BaseEventLoop(events.AbstractEventLoop):
     def _do_shutdown(self, future):
         try:
             self._default_executor.shutdown(wait=True)
-            self.call_soon_threadsafe(future.set_result, None)
+            if not self.is_closed():
+                self.call_soon_threadsafe(future.set_result, None)
         except Exception as ex:
-            self.call_soon_threadsafe(future.set_exception, ex)
+            if not self.is_closed():
+                self.call_soon_threadsafe(future.set_exception, ex)
 
     def _check_running(self):
         if self.is_running():
@@ -589,12 +591,13 @@ class BaseEventLoop(events.AbstractEventLoop):
         self._check_closed()
         self._check_running()
         self._set_coroutine_origin_tracking(self._debug)
-        self._thread_id = threading.get_ident()
 
         old_agen_hooks = sys.get_asyncgen_hooks()
-        sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter_hook,
-                               finalizer=self._asyncgen_finalizer_hook)
         try:
+            self._thread_id = threading.get_ident()
+            sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter_hook,
+                                   finalizer=self._asyncgen_finalizer_hook)
+
             events._set_running_loop(self)
             while True:
                 self._run_once()
index 48a32f8..5d00ab4 100644 (file)
@@ -396,6 +396,8 @@ def _chain_future(source, destination):
         if dest_loop is None or dest_loop is source_loop:
             _set_state(destination, source)
         else:
+            if dest_loop.is_closed():
+                return
             dest_loop.call_soon_threadsafe(_set_state, destination, source)
 
     destination.add_done_callback(_call_check_cancel)
index 7b81c25..e192159 100644 (file)
@@ -349,9 +349,8 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin):
         super().__init__(loop=loop)
         if value < 0:
             raise ValueError("Semaphore initial value must be >= 0")
+        self._waiters = None
         self._value = value
-        self._waiters = collections.deque()
-        self._wakeup_scheduled = False
 
     def __repr__(self):
         res = super().__repr__()
@@ -360,17 +359,10 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin):
             extra = f'{extra}, waiters:{len(self._waiters)}'
         return f'<{res[1:-1]} [{extra}]>'
 
-    def _wake_up_next(self):
-        while self._waiters:
-            waiter = self._waiters.popleft()
-            if not waiter.done():
-                waiter.set_result(None)
-                self._wakeup_scheduled = True
-                return
-
     def locked(self):
-        """Returns True if semaphore can not be acquired immediately."""
-        return self._value == 0
+        """Returns True if semaphore cannot be acquired immediately."""
+        return self._value == 0 or (
+            any(not w.cancelled() for w in (self._waiters or ())))
 
     async def acquire(self):
         """Acquire a semaphore.
@@ -381,29 +373,53 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin):
         called release() to make it larger than 0, and then return
         True.
         """
-        # _wakeup_scheduled is set if *another* task is scheduled to wakeup
-        # but its acquire() is not resumed yet
-        while self._wakeup_scheduled or self._value <= 0:
-            fut = self._get_loop().create_future()
-            self._waiters.append(fut)
+        if not self.locked():
+            self._value -= 1
+            return True
+
+        if self._waiters is None:
+            self._waiters = collections.deque()
+        fut = self._get_loop().create_future()
+        self._waiters.append(fut)
+
+        # Finally block should be called before the CancelledError
+        # handling as we don't want CancelledError to call
+        # _wake_up_first() and attempt to wake up itself.
+        try:
             try:
                 await fut
-                # reset _wakeup_scheduled *after* waiting for a future
-                self._wakeup_scheduled = False
-            except exceptions.CancelledError:
+            finally:
+                self._waiters.remove(fut)
+        except exceptions.CancelledError:
+            if not fut.cancelled():
+                self._value += 1
                 self._wake_up_next()
-                raise
-        self._value -= 1
+            raise
+
+        if self._value > 0:
+            self._wake_up_next()
         return True
 
     def release(self):
         """Release a semaphore, incrementing the internal counter by one.
+
         When it was zero on entry and another coroutine is waiting for it to
         become larger than zero again, wake up that coroutine.
         """
         self._value += 1
         self._wake_up_next()
 
+    def _wake_up_next(self):
+        """Wake up the first waiter that isn't done."""
+        if not self._waiters:
+            return
+
+        for fut in self._waiters:
+            if not fut.done():
+                self._value -= 1
+                fut.set_result(True)
+                return
+
 
 class BoundedSemaphore(Semaphore):
     """A bounded semaphore implementation.
index 080d8a6..4f3ee94 100644 (file)
@@ -2,6 +2,7 @@ __all__ = (
     'StreamReader', 'StreamWriter', 'StreamReaderProtocol',
     'open_connection', 'start_server')
 
+import collections
 import socket
 import sys
 import warnings
@@ -129,7 +130,7 @@ class FlowControlMixin(protocols.Protocol):
         else:
             self._loop = loop
         self._paused = False
-        self._drain_waiter = None
+        self._drain_waiters = collections.deque()
         self._connection_lost = False
 
     def pause_writing(self):
@@ -144,38 +145,34 @@ class FlowControlMixin(protocols.Protocol):
         if self._loop.get_debug():
             logger.debug("%r resumes writing", self)
 
-        waiter = self._drain_waiter
-        if waiter is not None:
-            self._drain_waiter = None
+        for waiter in self._drain_waiters:
             if not waiter.done():
                 waiter.set_result(None)
 
     def connection_lost(self, exc):
         self._connection_lost = True
-        # Wake up the writer if currently paused.
+        # Wake up the writer(s) if currently paused.
         if not self._paused:
             return
-        waiter = self._drain_waiter
-        if waiter is None:
-            return
-        self._drain_waiter = None
-        if waiter.done():
-            return
-        if exc is None:
-            waiter.set_result(None)
-        else:
-            waiter.set_exception(exc)
+
+        for waiter in self._drain_waiters:
+            if not waiter.done():
+                if exc is None:
+                    waiter.set_result(None)
+                else:
+                    waiter.set_exception(exc)
 
     async def _drain_helper(self):
         if self._connection_lost:
             raise ConnectionResetError('Connection lost')
         if not self._paused:
             return
-        waiter = self._drain_waiter
-        assert waiter is None or waiter.cancelled()
         waiter = self._loop.create_future()
-        self._drain_waiter = waiter
-        await waiter
+        self._drain_waiters.append(waiter)
+        try:
+            await waiter
+        finally:
+            self._drain_waiters.remove(waiter)
 
     def _get_close_waiter(self, stream):
         raise NotImplementedError
@@ -206,6 +203,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
             self._strong_reader = stream_reader
         self._reject_connection = False
         self._stream_writer = None
+        self._task = None
         self._transport = None
         self._client_connected_cb = client_connected_cb
         self._over_ssl = False
@@ -241,7 +239,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
             res = self._client_connected_cb(reader,
                                             self._stream_writer)
             if coroutines.iscoroutine(res):
-                self._loop.create_task(res)
+                self._task = self._loop.create_task(res)
             self._strong_reader = None
 
     def connection_lost(self, exc):
@@ -259,6 +257,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
         super().connection_lost(exc)
         self._stream_reader_wr = None
         self._stream_writer = None
+        self._task = None
         self._transport = None
 
     def data_received(self, data):
index c4bedb5..f391586 100644 (file)
@@ -809,7 +809,8 @@ def shield(arg):
 
     The statement
 
-        res = await shield(something())
+        task = asyncio.create_task(something())
+        res = await shield(task)
 
     is exactly equivalent to the statement
 
@@ -825,10 +826,16 @@ def shield(arg):
     If you want to completely ignore cancellation (not recommended)
     you can combine shield() with a try/except clause, as follows:
 
+        task = asyncio.create_task(something())
         try:
-            res = await shield(something())
+            res = await shield(task)
         except CancelledError:
             res = None
+
+    Save a reference to tasks passed to this function, to avoid
+    a task disappearing mid-execution. The event loop only keeps
+    weak references to tasks. A task that isn't referenced elsewhere
+    may get garbage collected at any time, even before it's done.
     """
     inner = _ensure_future(arg)
     if inner.done():
index c88b818..39b5e83 100644 (file)
@@ -223,7 +223,8 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
         return transp
 
     def _child_watcher_callback(self, pid, returncode, transp):
-        self.call_soon_threadsafe(transp._process_exited, returncode)
+        # Skip one iteration for callbacks to be executed
+        self.call_soon_threadsafe(self.call_soon, transp._process_exited, returncode)
 
     async def create_unix_connection(
             self, protocol_factory, path=None, *,
index 568e9bb..fe8713e 100644 (file)
@@ -56,22 +56,22 @@ def _maybe_compile(compiler, source, filename, symbol):
         if symbol != "eval":
             source = "pass"     # Replace it with a 'pass' statement
 
-    try:
-        return compiler(source, filename, symbol)
-    except SyntaxError:  # Let other compile() errors propagate.
-        pass
-
-    # Catch syntax warnings after the first compile
-    # to emit warnings (SyntaxWarning, DeprecationWarning) at most once.
+    # Disable compiler warnings when checking for incomplete input.
     with warnings.catch_warnings():
-        warnings.simplefilter("error")
-
+        warnings.simplefilter("ignore", (SyntaxWarning, DeprecationWarning))
         try:
-            compiler(source + "\n", filename, symbol)
-        except SyntaxError as e:
-            if "incomplete input" in str(e):
+            compiler(source, filename, symbol)
+        except SyntaxError:  # Let other compile() errors propagate.
+            try:
+                compiler(source + "\n", filename, symbol)
                 return None
-            raise
+            except SyntaxError as e:
+                if "incomplete input" in str(e):
+                    return None
+                # fallthrough
+
+    return compiler(source, filename, symbol)
+
 
 def _is_syntax_error(err1, err2):
     rep1 = repr(err1)
index eaa76c2..0380d9f 100644 (file)
@@ -1990,7 +1990,7 @@ class MozillaCookieJar(FileCookieJar):
 
     This class differs from CookieJar only in the format it uses to save and
     load cookies to and from a file.  This class uses the Mozilla/Netscape
-    `cookies.txt' format.  lynx uses this file format, too.
+    `cookies.txt' format.  curl and lynx use this file format, too.
 
     Don't expect cookies saved while the browser is running to be noticed by
     the browser (in fact, Mozilla on unix will overwrite your saved cookies if
index 9ca3a15..bb07231 100644 (file)
@@ -41,32 +41,22 @@ def translate_key(key, modifiers):
     return f'Key-{key}'
 
 
-class GetKeysDialog(Toplevel):
+class GetKeysFrame(Frame):
 
     # Dialog title for invalid key sequence
     keyerror_title = 'Key Sequence Error'
 
-    def __init__(self, parent, title, action, current_key_sequences,
-                 *, _htest=False, _utest=False):
+    def __init__(self, parent, action, current_key_sequences):
         """
         parent - parent of this dialog
-        title - string which is the title of the popup dialog
-        action - string, the name of the virtual event these keys will be
+        action - the name of the virtual event these keys will be
                  mapped to
-        current_key_sequences - list, a list of all key sequence lists
+        current_key_sequences - a list of all key sequence lists
                  currently mapped to virtual events, for overlap checking
-        _htest - bool, change box location when running htest
-        _utest - bool, do not wait when running unittest
         """
-        Toplevel.__init__(self, parent)
-        self.withdraw()  # Hide while setting geometry.
-        self.configure(borderwidth=5)
-        self.resizable(height=False, width=False)
-        self.title(title)
-        self.transient(parent)
-        _setup_dialog(self)
-        self.grab_set()
-        self.protocol("WM_DELETE_WINDOW", self.cancel)
+        super().__init__(parent)
+        self['borderwidth'] = 2
+        self['relief'] = 'sunken'
         self.parent = parent
         self.action = action
         self.current_key_sequences = current_key_sequences
@@ -82,39 +72,14 @@ class GetKeysDialog(Toplevel):
             self.modifier_vars.append(variable)
         self.advanced = False
         self.create_widgets()
-        self.update_idletasks()
-        self.geometry(
-                "+%d+%d" % (
-                    parent.winfo_rootx() +
-                    (parent.winfo_width()/2 - self.winfo_reqwidth()/2),
-                    parent.winfo_rooty() +
-                    ((parent.winfo_height()/2 - self.winfo_reqheight()/2)
-                    if not _htest else 150)
-                ) )  # Center dialog over parent (or below htest box).
-        if not _utest:
-            self.deiconify()  # Geometry set, unhide.
-            self.wait_window()
 
     def showerror(self, *args, **kwargs):
         # Make testing easier.  Replace in #30751.
         messagebox.showerror(*args, **kwargs)
 
     def create_widgets(self):
-        self.frame = frame = Frame(self, borderwidth=2, relief='sunken')
-        frame.pack(side='top', expand=True, fill='both')
-
-        frame_buttons = Frame(self)
-        frame_buttons.pack(side='bottom', fill='x')
-
-        self.button_ok = Button(frame_buttons, text='OK',
-                                width=8, command=self.ok)
-        self.button_ok.grid(row=0, column=0, padx=5, pady=5)
-        self.button_cancel = Button(frame_buttons, text='Cancel',
-                                   width=8, command=self.cancel)
-        self.button_cancel.grid(row=0, column=1, padx=5, pady=5)
-
         # Basic entry key sequence.
-        self.frame_keyseq_basic = Frame(frame, name='keyseq_basic')
+        self.frame_keyseq_basic = Frame(self, name='keyseq_basic')
         self.frame_keyseq_basic.grid(row=0, column=0, sticky='nsew',
                                       padx=5, pady=5)
         basic_title = Label(self.frame_keyseq_basic,
@@ -127,7 +92,7 @@ class GetKeysDialog(Toplevel):
         basic_keys.pack(ipadx=5, ipady=5, fill='x')
 
         # Basic entry controls.
-        self.frame_controls_basic = Frame(frame)
+        self.frame_controls_basic = Frame(self)
         self.frame_controls_basic.grid(row=1, column=0, sticky='nsew', padx=5)
 
         # Basic entry modifiers.
@@ -169,7 +134,7 @@ class GetKeysDialog(Toplevel):
         self.button_clear.grid(row=2, column=0, columnspan=4)
 
         # Advanced entry key sequence.
-        self.frame_keyseq_advanced = Frame(frame, name='keyseq_advanced')
+        self.frame_keyseq_advanced = Frame(self, name='keyseq_advanced')
         self.frame_keyseq_advanced.grid(row=0, column=0, sticky='nsew',
                                          padx=5, pady=5)
         advanced_title = Label(self.frame_keyseq_advanced, justify='left',
@@ -181,7 +146,7 @@ class GetKeysDialog(Toplevel):
         self.advanced_keys.pack(fill='x')
 
         # Advanced entry help text.
-        self.frame_help_advanced = Frame(frame)
+        self.frame_help_advanced = Frame(self)
         self.frame_help_advanced.grid(row=1, column=0, sticky='nsew', padx=5)
         help_advanced = Label(self.frame_help_advanced, justify='left',
             text="Key bindings are specified using Tkinter keysyms as\n"+
@@ -196,7 +161,7 @@ class GetKeysDialog(Toplevel):
         help_advanced.grid(row=0, column=0, sticky='nsew')
 
         # Switch between basic and advanced.
-        self.button_level = Button(frame, command=self.toggle_level,
+        self.button_level = Button(self, command=self.toggle_level,
                                   text='<< Basic Key Binding Entry')
         self.button_level.grid(row=2, column=0, stick='ew', padx=5, pady=5)
         self.toggle_level()
@@ -257,7 +222,8 @@ class GetKeysDialog(Toplevel):
             variable.set('')
         self.key_string.set('')
 
-    def ok(self, event=None):
+    def ok(self):
+        self.result = ''
         keys = self.key_string.get().strip()
         if not keys:
             self.showerror(title=self.keyerror_title, parent=self,
@@ -265,13 +231,7 @@ class GetKeysDialog(Toplevel):
             return
         if (self.advanced or self.keys_ok(keys)) and self.bind_ok(keys):
             self.result = keys
-        self.grab_release()
-        self.destroy()
-
-    def cancel(self, event=None):
-        self.result = ''
-        self.grab_release()
-        self.destroy()
+        return
 
     def keys_ok(self, keys):
         """Validity check on user's 'basic' keybinding selection.
@@ -319,6 +279,73 @@ class GetKeysDialog(Toplevel):
             return True
 
 
+class GetKeysWindow(Toplevel):
+
+    def __init__(self, parent, title, action, current_key_sequences,
+                 *, _htest=False, _utest=False):
+        """
+        parent - parent of this dialog
+        title - string which is the title of the popup dialog
+        action - string, the name of the virtual event these keys will be
+                 mapped to
+        current_key_sequences - list, a list of all key sequence lists
+                 currently mapped to virtual events, for overlap checking
+        _htest - bool, change box location when running htest
+        _utest - bool, do not wait when running unittest
+        """
+        super().__init__(parent)
+        self.withdraw()  # Hide while setting geometry.
+        self['borderwidth'] = 5
+        self.resizable(height=False, width=False)
+        # Needed for winfo_reqwidth().
+        self.update_idletasks()
+        # Center dialog over parent (or below htest box).
+        x = (parent.winfo_rootx() +
+             (parent.winfo_width()//2 - self.winfo_reqwidth()//2))
+        y = (parent.winfo_rooty() +
+             ((parent.winfo_height()//2 - self.winfo_reqheight()//2)
+              if not _htest else 150))
+        self.geometry(f"+{x}+{y}")
+
+        self.title(title)
+        self.frame = frame = GetKeysFrame(self, action, current_key_sequences)
+        self.protocol("WM_DELETE_WINDOW", self.cancel)
+        frame_buttons = Frame(self)
+        self.button_ok = Button(frame_buttons, text='OK',
+                                width=8, command=self.ok)
+        self.button_cancel = Button(frame_buttons, text='Cancel',
+                                   width=8, command=self.cancel)
+        self.button_ok.grid(row=0, column=0, padx=5, pady=5)
+        self.button_cancel.grid(row=0, column=1, padx=5, pady=5)
+        frame.pack(side='top', expand=True, fill='both')
+        frame_buttons.pack(side='bottom', fill='x')
+
+        self.transient(parent)
+        _setup_dialog(self)
+        self.grab_set()
+        if not _utest:
+            self.deiconify()  # Geometry set, unhide.
+            self.wait_window()
+
+    @property
+    def result(self):
+        return self.frame.result
+
+    @result.setter
+    def result(self, value):
+        self.frame.result = value
+
+    def ok(self, event=None):
+        self.frame.ok()
+        self.grab_release()
+        self.destroy()
+
+    def cancel(self, event=None):
+        self.result = ''
+        self.grab_release()
+        self.destroy()
+
+
 if __name__ == '__main__':
     from unittest import main
     main('idlelib.idle_test.test_config_key', verbosity=2, exit=False)
index 09f455c..43349cb 100644 (file)
@@ -24,7 +24,7 @@ import tkinter.font as tkfont
 from tkinter import messagebox
 
 from idlelib.config import idleConf, ConfigChanges
-from idlelib.config_key import GetKeysDialog
+from idlelib.config_key import GetKeysWindow
 from idlelib.dynoption import DynOptionMenu
 from idlelib import macosx
 from idlelib.query import SectionName, HelpSource
@@ -1397,7 +1397,7 @@ class KeysPage(Frame):
             for event in key_set_changes:
                 current_bindings[event] = key_set_changes[event].split()
         current_key_sequences = list(current_bindings.values())
-        new_keys = GetKeysDialog(self, 'Get New Keys', bind_name,
+        new_keys = GetKeysWindow(self, 'Get New Keys', bind_name,
                 current_key_sequences).result
         if new_keys:
             if self.keyset_source.get():  # Current key set is a built-in.
index bf66cad..32f878b 100644 (file)
@@ -13,15 +13,13 @@ from tkinter import Tk, TclError
 from idlelib.idle_test.mock_idle import Func
 from idlelib.idle_test.mock_tk import Mbox_func
 
-gkd = config_key.GetKeysDialog
-
 
 class ValidationTest(unittest.TestCase):
     "Test validation methods: ok, keys_ok, bind_ok."
 
-    class Validator(gkd):
+    class Validator(config_key.GetKeysFrame):
         def __init__(self, *args, **kwargs):
-            config_key.GetKeysDialog.__init__(self, *args, **kwargs)
+            super().__init__(*args, **kwargs)
             class list_keys_final:
                 get = Func()
             self.list_keys_final = list_keys_final
@@ -34,15 +32,14 @@ class ValidationTest(unittest.TestCase):
         cls.root = Tk()
         cls.root.withdraw()
         keylist = [['<Key-F12>'], ['<Control-Key-x>', '<Control-Key-X>']]
-        cls.dialog = cls.Validator(
-            cls.root, 'Title', '<<Test>>', keylist, _utest=True)
+        cls.dialog = cls.Validator(cls.root, '<<Test>>', keylist)
 
     @classmethod
     def tearDownClass(cls):
-        cls.dialog.cancel()
+        del cls.dialog
         cls.root.update_idletasks()
         cls.root.destroy()
-        del cls.dialog, cls.root
+        del cls.root
 
     def setUp(self):
         self.dialog.showerror.message = ''
@@ -111,14 +108,14 @@ class ToggleLevelTest(unittest.TestCase):
         requires('gui')
         cls.root = Tk()
         cls.root.withdraw()
-        cls.dialog = gkd(cls.root, 'Title', '<<Test>>', [], _utest=True)
+        cls.dialog = config_key.GetKeysFrame(cls.root, '<<Test>>', [])
 
     @classmethod
     def tearDownClass(cls):
-        cls.dialog.cancel()
+        del cls.dialog
         cls.root.update_idletasks()
         cls.root.destroy()
-        del cls.dialog, cls.root
+        del cls.root
 
     def test_toggle_level(self):
         dialog = self.dialog
@@ -130,7 +127,7 @@ class ToggleLevelTest(unittest.TestCase):
             this can be used to check whether a frame is above or
             below another one.
             """
-            for index, child in enumerate(dialog.frame.winfo_children()):
+            for index, child in enumerate(dialog.winfo_children()):
                 if child._name == 'keyseq_basic':
                     basic = index
                 if child._name == 'keyseq_advanced':
@@ -161,7 +158,7 @@ class ToggleLevelTest(unittest.TestCase):
 class KeySelectionTest(unittest.TestCase):
     "Test selecting key on Basic frames."
 
-    class Basic(gkd):
+    class Basic(config_key.GetKeysFrame):
         def __init__(self, *args, **kwargs):
             super().__init__(*args, **kwargs)
             class list_keys_final:
@@ -179,14 +176,14 @@ class KeySelectionTest(unittest.TestCase):
         requires('gui')
         cls.root = Tk()
         cls.root.withdraw()
-        cls.dialog = cls.Basic(cls.root, 'Title', '<<Test>>', [], _utest=True)
+        cls.dialog = cls.Basic(cls.root, '<<Test>>', [])
 
     @classmethod
     def tearDownClass(cls):
-        cls.dialog.cancel()
+        del cls.dialog
         cls.root.update_idletasks()
         cls.root.destroy()
-        del cls.dialog, cls.root
+        del cls.root
 
     def setUp(self):
         self.dialog.clear_key_seq()
@@ -206,7 +203,7 @@ class KeySelectionTest(unittest.TestCase):
         dialog.modifier_checkbuttons['foo'].invoke()
         eq(gm(), ['BAZ'])
 
-    @mock.patch.object(gkd, 'get_modifiers')
+    @mock.patch.object(config_key.GetKeysFrame, 'get_modifiers')
     def test_build_key_string(self, mock_modifiers):
         dialog = self.dialog
         key = dialog.list_keys_final
@@ -227,7 +224,7 @@ class KeySelectionTest(unittest.TestCase):
         dialog.build_key_string()
         eq(string(), '<mymod-test>')
 
-    @mock.patch.object(gkd, 'get_modifiers')
+    @mock.patch.object(config_key.GetKeysFrame, 'get_modifiers')
     def test_final_key_selected(self, mock_modifiers):
         dialog = self.dialog
         key = dialog.list_keys_final
@@ -240,7 +237,7 @@ class KeySelectionTest(unittest.TestCase):
         eq(string(), '<Shift-Key-braceleft>')
 
 
-class CancelTest(unittest.TestCase):
+class CancelWindowTest(unittest.TestCase):
     "Simulate user clicking [Cancel] button."
 
     @classmethod
@@ -248,21 +245,89 @@ class CancelTest(unittest.TestCase):
         requires('gui')
         cls.root = Tk()
         cls.root.withdraw()
-        cls.dialog = gkd(cls.root, 'Title', '<<Test>>', [], _utest=True)
+        cls.dialog = config_key.GetKeysWindow(
+            cls.root, 'Title', '<<Test>>', [], _utest=True)
 
     @classmethod
     def tearDownClass(cls):
         cls.dialog.cancel()
+        del cls.dialog
         cls.root.update_idletasks()
         cls.root.destroy()
-        del cls.dialog, cls.root
+        del cls.root
 
-    def test_cancel(self):
+    @mock.patch.object(config_key.GetKeysFrame, 'ok')
+    def test_cancel(self, mock_frame_ok):
         self.assertEqual(self.dialog.winfo_class(), 'Toplevel')
         self.dialog.button_cancel.invoke()
         with self.assertRaises(TclError):
             self.dialog.winfo_class()
         self.assertEqual(self.dialog.result, '')
+        mock_frame_ok.assert_not_called()
+
+
+class OKWindowTest(unittest.TestCase):
+    "Simulate user clicking [OK] button."
+
+    @classmethod
+    def setUpClass(cls):
+        requires('gui')
+        cls.root = Tk()
+        cls.root.withdraw()
+        cls.dialog = config_key.GetKeysWindow(
+            cls.root, 'Title', '<<Test>>', [], _utest=True)
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.dialog.cancel()
+        del cls.dialog
+        cls.root.update_idletasks()
+        cls.root.destroy()
+        del cls.root
+
+    @mock.patch.object(config_key.GetKeysFrame, 'ok')
+    def test_ok(self, mock_frame_ok):
+        self.assertEqual(self.dialog.winfo_class(), 'Toplevel')
+        self.dialog.button_ok.invoke()
+        with self.assertRaises(TclError):
+            self.dialog.winfo_class()
+        mock_frame_ok.assert_called()
+
+
+class WindowResultTest(unittest.TestCase):
+    "Test window result get and set."
+
+    @classmethod
+    def setUpClass(cls):
+        requires('gui')
+        cls.root = Tk()
+        cls.root.withdraw()
+        cls.dialog = config_key.GetKeysWindow(
+            cls.root, 'Title', '<<Test>>', [], _utest=True)
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.dialog.cancel()
+        del cls.dialog
+        cls.root.update_idletasks()
+        cls.root.destroy()
+        del cls.root
+
+    def test_result(self):
+        dialog = self.dialog
+        eq = self.assertEqual
+
+        dialog.result = ''
+        eq(dialog.result, '')
+        eq(dialog.frame.result,'')
+
+        dialog.result = 'bar'
+        eq(dialog.result,'bar')
+        eq(dialog.frame.result,'bar')
+
+        dialog.frame.result = 'foo'
+        eq(dialog.result, 'foo')
+        eq(dialog.frame.result,'foo')
 
 
 class HelperTest(unittest.TestCase):
index 3005ce0..e5d5b40 100644 (file)
@@ -954,8 +954,8 @@ class KeysPageTest(unittest.TestCase):
     def test_get_new_keys(self):
         eq = self.assertEqual
         d = self.page
-        orig_getkeysdialog = configdialog.GetKeysDialog
-        gkd = configdialog.GetKeysDialog = Func(return_self=True)
+        orig_getkeysdialog = configdialog.GetKeysWindow
+        gkd = configdialog.GetKeysWindow = Func(return_self=True)
         gnkn = d.get_new_keys_name = Func()
 
         d.button_new_keys.state(('!disabled',))
@@ -997,7 +997,7 @@ class KeysPageTest(unittest.TestCase):
         eq(d.keybinding.get(), '<Key-p>')
 
         del d.get_new_keys_name
-        configdialog.GetKeysDialog = orig_getkeysdialog
+        configdialog.GetKeysWindow = orig_getkeysdialog
 
     def test_get_new_keys_name(self):
         orig_sectionname = configdialog.SectionName
index 0f31179..43a9ba0 100644 (file)
@@ -6,7 +6,7 @@ import unittest
 from test.support import requires
 from _tkinter import TclError
 
-class TextTest(object):
+class TextTest:
     "Define items common to both sets of tests."
 
     hw = 'hello\nworld'  # Several tests insert this after initialization.
index 1013cdc..209d856 100644 (file)
@@ -19,7 +19,7 @@ testcfg = {
 }
 code_sample = """\
 
-class C1():
+class C1:
     # Class comment.
     def __init__(self, a, b):
         self.a = a
index 470de5d..1085d68 100644 (file)
@@ -4,6 +4,7 @@ A number of functions that enhance IDLE on macOS.
 from os.path import expanduser
 import plistlib
 from sys import platform  # Used in _init_tk_type, changed by test.
+from test.support import requires, ResourceDenied
 
 import tkinter
 
@@ -14,23 +15,26 @@ import tkinter
 _tk_type = None
 
 def _init_tk_type():
-    """
-    Initializes OS X Tk variant values for
-    isAquaTk(), isCarbonTk(), isCocoaTk(), and isXQuartz().
+    """ Initialize _tk_type for isXyzTk functions.
     """
     global _tk_type
     if platform == 'darwin':
-        root = tkinter.Tk()
-        ws = root.tk.call('tk', 'windowingsystem')
-        if 'x11' in ws:
-            _tk_type = "xquartz"
-        elif 'aqua' not in ws:
-            _tk_type = "other"
-        elif 'AppKit' in root.tk.call('winfo', 'server', '.'):
-            _tk_type = "cocoa"
+        try:
+            requires('gui')
+        except ResourceDenied:  # Possible when testing.
+            _tk_type = "cocoa"  # Newest and most common.
         else:
-            _tk_type = "carbon"
-        root.destroy()
+            root = tkinter.Tk()
+            ws = root.tk.call('tk', 'windowingsystem')
+            if 'x11' in ws:
+                _tk_type = "xquartz"
+            elif 'aqua' not in ws:
+                _tk_type = "other"
+            elif 'AppKit' in root.tk.call('winfo', 'server', '.'):
+                _tk_type = "cocoa"
+            else:
+                _tk_type = "carbon"
+            root.destroy()
     else:
         _tk_type = "other"
 
index 01df575..60740c6 100644 (file)
@@ -1356,7 +1356,10 @@ def getargvalues(frame):
 
 def formatannotation(annotation, base_module=None):
     if getattr(annotation, '__module__', None) == 'typing':
-        return repr(annotation).replace('typing.', '')
+        def repl(match):
+            text = match.group()
+            return text.removeprefix('typing.')
+        return re.sub(r'[\w\.]+', repl, repr(annotation))
     if isinstance(annotation, types.GenericAlias):
         return str(annotation)
     if isinstance(annotation, type):
index e4c21da..ed2c747 100644 (file)
@@ -1,4 +1,4 @@
-r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of
+r"""JSON (JavaScript Object Notation) <https://json.org> is a subset of
 JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
 interchange format.
 
index d7d8244..c5d9ae2 100644 (file)
@@ -252,7 +252,7 @@ def JSONArray(s_and_end, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
 
 
 class JSONDecoder(object):
-    """Simple JSON <http://json.org> decoder
+    """Simple JSON <https://json.org> decoder
 
     Performs the following translations in decoding by default:
 
index 21bff2c..687c506 100644 (file)
@@ -71,7 +71,7 @@ encode_basestring_ascii = (
     c_encode_basestring_ascii or py_encode_basestring_ascii)
 
 class JSONEncoder(object):
-    """Extensible JSON <http://json.org> encoder for Python data structures.
+    """Extensible JSON <https://json.org> encoder for Python data structures.
 
     Supports the following objects and types by default:
 
index ae416a8..444c640 100644 (file)
@@ -2,6 +2,7 @@
 
 import os
 import warnings
+import re
 
 __all__ = ["getcaps","findmatch"]
 
@@ -13,6 +14,11 @@ def lineno_sort_key(entry):
     else:
         return 1, 0
 
+_find_unsafe = re.compile(r'[^\xa1-\U0010FFFF\w@+=:,./-]').search
+
+class UnsafeMailcapInput(Warning):
+    """Warning raised when refusing unsafe input"""
+
 
 # Part 1: top-level interface.
 
@@ -165,15 +171,22 @@ def findmatch(caps, MIMEtype, key='view', filename="/dev/null", plist=[]):
     entry to use.
 
     """
+    if _find_unsafe(filename):
+        msg = "Refusing to use mailcap with filename %r. Use a safe temporary filename." % (filename,)
+        warnings.warn(msg, UnsafeMailcapInput)
+        return None, None
     entries = lookup(caps, MIMEtype, key)
     # XXX This code should somehow check for the needsterminal flag.
     for e in entries:
         if 'test' in e:
             test = subst(e['test'], filename, plist)
+            if test is None:
+                continue
             if test and os.system(test) != 0:
                 continue
         command = subst(e[key], MIMEtype, filename, plist)
-        return command, e
+        if command is not None:
+            return command, e
     return None, None
 
 def lookup(caps, MIMEtype, key=None):
@@ -206,6 +219,10 @@ def subst(field, MIMEtype, filename, plist=[]):
             elif c == 's':
                 res = res + filename
             elif c == 't':
+                if _find_unsafe(MIMEtype):
+                    msg = "Refusing to substitute MIME type %r into a shell command." % (MIMEtype,)
+                    warnings.warn(msg, UnsafeMailcapInput)
+                    return None
                 res = res + MIMEtype
             elif c == '{':
                 start = i
@@ -213,7 +230,12 @@ def subst(field, MIMEtype, filename, plist=[]):
                     i = i+1
                 name = field[start:i]
                 i = i+1
-                res = res + findparam(name, plist)
+                param = findparam(name, plist)
+                if _find_unsafe(param):
+                    msg = "Refusing to substitute parameter %r (%s) into a shell command" % (param, name)
+                    warnings.warn(msg, UnsafeMailcapInput)
+                    return None
+                res = res + param
             # XXX To do:
             # %n == number of parts if type is multipart/*
             # %F == list of alternating type and filename for parts
index cc42dbd..ea36950 100644 (file)
@@ -161,10 +161,10 @@ class ResourceTracker(object):
     def _send(self, cmd, name, rtype):
         self.ensure_running()
         msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii')
-        if len(name) > 512:
+        if len(msg) > 512:
             # posix guarantees that writes to a pipe of less than PIPE_BUF
             # bytes are atomic, and that PIPE_BUF >= 512
-            raise ValueError('name too long')
+            raise ValueError('msg too long')
         nbytes = os.write(self._fd, msg)
         assert nbytes == len(msg), "nbytes {0:n} but len(msg) {1:n}".format(
             nbytes, len(msg))
index d26cfc9..4f2ffce 100644 (file)
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -288,7 +288,8 @@ def walk(top, topdown=True, onerror=None, followlinks=False):
         dirpath, dirnames, filenames
 
     dirpath is a string, the path to the directory.  dirnames is a list of
-    the names of the subdirectories in dirpath (excluding '.' and '..').
+    the names of the subdirectories in dirpath (including symlinks to directories,
+    and excluding '.' and '..').
     filenames is a list of the names of the non-directory files in dirpath.
     Note that the names in the lists are just names, with no path components.
     To get a full path (which begins with top) to a file or directory in
index 2eeebe4..bc8e4c8 100644 (file)
@@ -152,7 +152,7 @@ def _date_to_string(d):
 def _escape(text):
     m = _controlCharPat.search(text)
     if m is not None:
-        raise ValueError("strings can't contains control characters; "
+        raise ValueError("strings can't contain control characters; "
                          "use bytes instead")
     text = text.replace("\r\n", "\n")       # convert DOS line endings
     text = text.replace("\r", "\n")         # convert Mac line endings
index 0f93ae0..ac88c04 100644 (file)
@@ -56,7 +56,7 @@ class SortKey(str, Enum):
 
 @dataclass(unsafe_hash=True)
 class FunctionProfile:
-    ncalls: int
+    ncalls: str
     tottime: float
     percall_tottime: float
     cumtime: float
index 198bd7c..34bb19e 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Autogenerated by Sphinx on Mon Sep  5 13:02:42 2022
+# Autogenerated by Sphinx on Tue Oct 11 12:21:26 2022
 topics = {'assert': 'The "assert" statement\n'
            '**********************\n'
            '\n'
@@ -1674,10 +1674,26 @@ topics = {'assert': 'The "assert" statement\n'
           'If the syntax "**expression" appears in the function call,\n'
           '"expression" must evaluate to a *mapping*, the contents of which '
           'are\n'
-          'treated as additional keyword arguments.  If a keyword is already\n'
-          'present (as an explicit keyword argument, or from another '
-          'unpacking),\n'
-          'a "TypeError" exception is raised.\n'
+          'treated as additional keyword arguments. If a parameter matching a '
+          'key\n'
+          'has already been given a value (by an explicit keyword argument, '
+          'or\n'
+          'from another unpacking), a "TypeError" exception is raised.\n'
+          '\n'
+          'When "**expression" is used, each key in this mapping must be a\n'
+          'string. Each value from the mapping is assigned to the first '
+          'formal\n'
+          'parameter eligible for keyword assignment whose name is equal to '
+          'the\n'
+          'key. A key need not be a Python identifier (e.g. ""max-temp Â°F"" '
+          'is\n'
+          'acceptable, although it will not match any formal parameter that '
+          'could\n'
+          'be declared). If there is no match to a formal parameter the '
+          'key-value\n'
+          'pair is collected by the "**" parameter, if there is one, or if '
+          'there\n'
+          'is not, a "TypeError" exception is raised.\n'
           '\n'
           'Formal parameters using the syntax "*identifier" or "**identifier"\n'
           'cannot be used as positional argument slots or as keyword argument\n'
@@ -12768,7 +12784,7 @@ topics = {'assert': 'The "assert" statement\n'
           '         points. All the code points in the range "U+0000 - '
           'U+10FFFF"\n'
           '         can be represented in a string.  Python doesn’t have a '
-          '*char*\n'
+          'char\n'
           '         type; instead, every code point in the string is '
           'represented\n'
           '         as a string object with length "1".  The built-in '
index a414321..ffe9170 100644 (file)
@@ -411,7 +411,8 @@ def check_output(*popenargs, timeout=None, **kwargs):
     if 'input' in kwargs and kwargs['input'] is None:
         # Explicitly passing input=None was previously equivalent to passing an
         # empty string. That is maintained here for backwards compatibility.
-        if kwargs.get('universal_newlines') or kwargs.get('text'):
+        if kwargs.get('universal_newlines') or kwargs.get('text') or kwargs.get('encoding') \
+                or kwargs.get('errors'):
             empty = ''
         else:
             empty = b''
@@ -463,7 +464,8 @@ def run(*popenargs,
 
     The returned instance will have attributes args, returncode, stdout and
     stderr. By default, stdout and stderr are not captured, and those attributes
-    will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
+    will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them,
+    or pass capture_output=True to capture both.
 
     If check is True and the exit code was non-zero, it raises a
     CalledProcessError. The CalledProcessError object will have the return code
index 7973f26..a47f5a9 100755 (executable)
@@ -23,8 +23,6 @@ __version__ = "6"
 import os
 import sys
 import tokenize
-if not hasattr(tokenize, 'NL'):
-    raise ValueError("tokenize.NL doesn't exist -- tokenize module too old")
 
 __all__ = ["check", "NannyNag", "process_tokens"]
 
index 8dced90..be174aa 100644 (file)
@@ -5377,6 +5377,14 @@ class TestResourceTracker(unittest.TestCase):
 
         self.assertTrue(is_resource_tracker_reused)
 
+    def test_too_long_name_resource(self):
+        # gh-96819: Resource names that will make the length of a write to a pipe
+        # greater than PIPE_BUF are not allowed
+        rtype = "shared_memory"
+        too_long_name_resource = "a" * (512 - len(rtype))
+        with self.assertRaises(ValueError):
+            resource_tracker.register(too_long_name_resource, rtype)
+
 
 class TestSimpleQueue(unittest.TestCase):
 
index ccec9fe..b781b99 100644 (file)
@@ -408,6 +408,27 @@ def test_sqlite3():
             raise RuntimeError("Expected sqlite3.load_extension to fail")
 
 
+def test_syslog():
+    import syslog
+
+    def hook(event, args):
+        if event.startswith("syslog."):
+            print(event, *args)
+
+    sys.addaudithook(hook)
+    syslog.openlog('python')
+    syslog.syslog('test')
+    syslog.setlogmask(syslog.LOG_DEBUG)
+    syslog.closelog()
+    # implicit open
+    syslog.syslog('test2')
+    # open with default ident
+    syslog.openlog(logoption=syslog.LOG_NDELAY, facility=syslog.LOG_LOCAL0)
+    sys.argv = None
+    syslog.openlog()
+    syslog.closelog()
+
+
 if __name__ == "__main__":
     from test.support import suppress_msvcrt_asserts
 
index 0f5c651..3a3fbd1 100644 (file)
@@ -1805,12 +1805,12 @@ static PyObject *
 test_Py_UNICODE_converter(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *a;
-    const Py_UNICODE *b;
-    const Py_UNICODE *c;
-    const Py_UNICODE *d;
+    const Py_UNICODE *a = NULL;
+    const Py_UNICODE *b = NULL;
+    const Py_UNICODE *c = NULL;
+    const Py_UNICODE *d = NULL;
     Py_ssize_clean_t d_length;
-    const Py_UNICODE *e;
+    const Py_UNICODE *e = NULL;
     Py_ssize_clean_t e_length;
 
     if (!_PyArg_ParseStack(args, nargs, "O&O&O&u#Z#:test_Py_UNICODE_converter",
@@ -1843,7 +1843,7 @@ test_Py_UNICODE_converter_impl(PyObject *module, const Py_UNICODE *a,
                                Py_ssize_clean_t d_length,
                                const Py_UNICODE *e,
                                Py_ssize_clean_t e_length)
-/*[clinic end generated code: output=ef45e982fedf0b3d input=064a3b68ad7f04b0]*/
+/*[clinic end generated code: output=e45007c49e77ad4a input=064a3b68ad7f04b0]*/
 
 
 /*[clinic input]
index 4e8d4e4..18d7f52 100644 (file)
@@ -2773,6 +2773,15 @@ class AbstractPickleTests:
                     unpickled = self.loads(self.dumps(method, proto))
                     self.assertEqual(method(obj), unpickled(obj))
 
+        descriptors = (
+            PyMethodsTest.__dict__['cheese'],  # static method descriptor
+            PyMethodsTest.__dict__['wine'],  # class method descriptor
+        )
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+            for descr in descriptors:
+                with self.subTest(proto=proto, descr=descr):
+                    self.assertRaises(TypeError, self.dumps, descr, proto)
+
     def test_c_methods(self):
         global Subclass
         class Subclass(tuple):
@@ -2808,6 +2817,15 @@ class AbstractPickleTests:
                     unpickled = self.loads(self.dumps(method, proto))
                     self.assertEqual(method(*args), unpickled(*args))
 
+        descriptors = (
+            bytearray.__dict__['maketrans'],  # built-in static method descriptor
+            dict.__dict__['fromkeys'],  # built-in class method descriptor
+        )
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+            for descr in descriptors:
+                with self.subTest(proto=proto, descr=descr):
+                    self.assertRaises(TypeError, self.dumps, descr, proto)
+
     def test_compat_pickle(self):
         tests = [
             (range(1, 7), '__builtin__', 'xrange'),
index 838147b..0126742 100644 (file)
@@ -827,6 +827,21 @@ class BaseFutureDoneCallbackTests():
 
         fut.remove_done_callback(evil())
 
+    def test_remove_done_callbacks_list_clear(self):
+        # see https://github.com/python/cpython/issues/97592 for details
+
+        fut = self._new_future()
+        fut.add_done_callback(str)
+
+        for _ in range(63):
+            fut.add_done_callback(id)
+
+        class evil:
+            def __eq__(self, other):
+                fut.remove_done_callback(other)
+
+        fut.remove_done_callback(evil())
+
     def test_schedule_callbacks_list_mutation_1(self):
         # see http://bugs.python.org/issue28963 for details
 
index 167ae70..50aed90 100644 (file)
@@ -5,6 +5,7 @@ from unittest import mock
 import re
 
 import asyncio
+import collections
 
 STR_RGX_REPR = (
     r'^<(?P<class>.*?) object at (?P<address>.*?)'
@@ -782,6 +783,9 @@ class SemaphoreTests(unittest.IsolatedAsyncioTestCase):
         self.assertTrue('waiters' not in repr(sem))
         self.assertTrue(RGX_REPR.match(repr(sem)))
 
+        if sem._waiters is None:
+            sem._waiters = collections.deque()
+
         sem._waiters.append(mock.Mock())
         self.assertTrue('waiters:1' in repr(sem))
         self.assertTrue(RGX_REPR.match(repr(sem)))
@@ -853,7 +857,7 @@ class SemaphoreTests(unittest.IsolatedAsyncioTestCase):
 
         sem.release()
         sem.release()
-        self.assertEqual(2, sem._value)
+        self.assertEqual(0, sem._value)
 
         await asyncio.sleep(0)
         self.assertEqual(0, sem._value)
@@ -898,6 +902,7 @@ class SemaphoreTests(unittest.IsolatedAsyncioTestCase):
         sem.release()
 
         await asyncio.sleep(0)
+        await asyncio.sleep(0)
         num_done = sum(t.done() for t in [t3, t4])
         self.assertEqual(num_done, 1)
         self.assertTrue(t3.done())
@@ -917,9 +922,32 @@ class SemaphoreTests(unittest.IsolatedAsyncioTestCase):
         t1.cancel()
         sem.release()
         await asyncio.sleep(0)
+        await asyncio.sleep(0)
         self.assertTrue(sem.locked())
         self.assertTrue(t2.done())
 
+    async def test_acquire_no_hang(self):
+
+        sem = asyncio.Semaphore(1)
+
+        async def c1():
+            async with sem:
+                await asyncio.sleep(0)
+            t2.cancel()
+
+        async def c2():
+            async with sem:
+                self.assertFalse(True)
+
+        t1 = asyncio.create_task(c1())
+        t2 = asyncio.create_task(c2())
+
+        r1, r2 = await asyncio.gather(t1, t2, return_exceptions=True)
+        self.assertTrue(r1 is None)
+        self.assertTrue(isinstance(r2, asyncio.CancelledError))
+
+        await asyncio.wait_for(sem.acquire(), timeout=1.0)
+
     def test_release_not_acquired(self):
         sem = asyncio.BoundedSemaphore()
 
@@ -959,6 +987,77 @@ class SemaphoreTests(unittest.IsolatedAsyncioTestCase):
             result
         )
 
+    async def test_acquire_fifo_order_2(self):
+        sem = asyncio.Semaphore(1)
+        result = []
+
+        async def c1(result):
+            await sem.acquire()
+            result.append(1)
+            return True
+
+        async def c2(result):
+            await sem.acquire()
+            result.append(2)
+            sem.release()
+            await sem.acquire()
+            result.append(4)
+            return True
+
+        async def c3(result):
+            await sem.acquire()
+            result.append(3)
+            return True
+
+        t1 = asyncio.create_task(c1(result))
+        t2 = asyncio.create_task(c2(result))
+        t3 = asyncio.create_task(c3(result))
+
+        await asyncio.sleep(0)
+
+        sem.release()
+        sem.release()
+
+        tasks = [t1, t2, t3]
+        await asyncio.gather(*tasks)
+        self.assertEqual([1, 2, 3, 4], result)
+
+    async def test_acquire_fifo_order_3(self):
+        sem = asyncio.Semaphore(0)
+        result = []
+
+        async def c1(result):
+            await sem.acquire()
+            result.append(1)
+            return True
+
+        async def c2(result):
+            await sem.acquire()
+            result.append(2)
+            return True
+
+        async def c3(result):
+            await sem.acquire()
+            result.append(3)
+            return True
+
+        t1 = asyncio.create_task(c1(result))
+        t2 = asyncio.create_task(c2(result))
+        t3 = asyncio.create_task(c3(result))
+
+        await asyncio.sleep(0)
+
+        t1.cancel()
+
+        await asyncio.sleep(0)
+
+        sem.release()
+        sem.release()
+
+        tasks = [t1, t2, t3]
+        await asyncio.gather(*tasks, return_exceptions=True)
+        self.assertEqual([2, 3], result)
+
 
 if __name__ == '__main__':
     unittest.main()
index 227b227..44fcd65 100644 (file)
@@ -801,6 +801,25 @@ os.close(fd)
         self.assertEqual(cm.warnings[0].filename, __file__)
         self.assertIs(protocol._loop, self.loop)
 
+    def test_multiple_drain(self):
+        # See https://github.com/python/cpython/issues/74116
+        drained = 0
+
+        async def drainer(stream):
+            nonlocal drained
+            await stream._drain_helper()
+            drained += 1
+
+        async def main():
+            loop = asyncio.get_running_loop()
+            stream = asyncio.streams.FlowControlMixin(loop)
+            stream.pause_writing()
+            loop.call_later(0.1, stream.resume_writing)
+            await asyncio.gather(*[drainer(stream) for _ in range(10)])
+            self.assertEqual(drained, 10)
+
+        self.loop.run_until_complete(main())
+
     def test_drain_raises(self):
         # See http://bugs.python.org/issue25441
 
index 04c9d6b..cea452d 100644 (file)
@@ -16,6 +16,8 @@ AUDIT_TESTS_PY = support.findfile("audit-tests.py")
 
 
 class AuditTest(unittest.TestCase):
+    maxDiff = None
+
     def do_test(self, *args):
         with subprocess.Popen(
             [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
@@ -170,5 +172,29 @@ class AuditTest(unittest.TestCase):
         self.assertEqual(actual, expected)
 
 
+    def test_syslog(self):
+        syslog = import_helper.import_module("syslog")
+
+        returncode, events, stderr = self.run_python("test_syslog")
+        if returncode:
+            self.fail(stderr)
+
+        if support.verbose:
+            print('Events:', *events, sep='\n  ')
+
+        self.assertSequenceEqual(
+            events,
+            [('syslog.openlog', ' ', f'python 0 {syslog.LOG_USER}'),
+            ('syslog.syslog', ' ', f'{syslog.LOG_INFO} test'),
+            ('syslog.setlogmask', ' ', f'{syslog.LOG_DEBUG}'),
+            ('syslog.closelog', '', ''),
+            ('syslog.syslog', ' ', f'{syslog.LOG_INFO} test2'),
+            ('syslog.openlog', ' ', f'audit-tests.py 0 {syslog.LOG_USER}'),
+            ('syslog.openlog', ' ', f'audit-tests.py {syslog.LOG_NDELAY} {syslog.LOG_LOCAL0}'),
+            ('syslog.openlog', ' ', f'None 0 {syslog.LOG_USER}'),
+            ('syslog.closelog', '', '')]
+        )
+
+
 if __name__ == "__main__":
     unittest.main()
index 8db497a..018626e 100644 (file)
@@ -114,6 +114,31 @@ class ExceptionClassTests(unittest.TestCase):
                 [repr(exc), exc.__class__.__name__ + '()'])
         self.interface_test_driver(results)
 
+    def test_setstate_refcount_no_crash(self):
+        # gh-97591: Acquire strong reference before calling tp_hash slot
+        # in PyObject_SetAttr.
+        import gc
+        d = {}
+        class HashThisKeyWillClearTheDict(str):
+            def __hash__(self) -> int:
+                d.clear()
+                return super().__hash__()
+        class Value(str):
+            pass
+        exc = Exception()
+
+        d[HashThisKeyWillClearTheDict()] = Value()  # refcount of Value() is 1 now
+
+        # Exception.__setstate__ should aquire a strong reference of key and
+        # value in the dict. Otherwise, Value()'s refcount would go below
+        # zero in the tp_hash call in PyObject_SetAttr(), and it would cause
+        # crash in GC.
+        exc.__setstate__(d)  # __hash__() is called again here, clearing the dict.
+
+        # This GC would crash if the refcount of Value() goes below zero.
+        gc.collect()
+
+
 class UsageTests(unittest.TestCase):
 
     """Test usage of exceptions"""
index 84bd883..14de3d4 100644 (file)
@@ -831,6 +831,8 @@ class CmdLineTest(unittest.TestCase):
         assert_python_failure('-X', 'int_max_str_digits', '-c', code)
         assert_python_failure('-X', 'int_max_str_digits=foo', '-c', code)
         assert_python_failure('-X', 'int_max_str_digits=100', '-c', code)
+        assert_python_failure('-X', 'int_max_str_digits', '-c', code,
+                              PYTHONINTMAXSTRDIGITS='4000')
 
         assert_python_failure('-c', code, PYTHONINTMAXSTRDIGITS='foo')
         assert_python_failure('-c', code, PYTHONINTMAXSTRDIGITS='100')
index 17376c7..133096d 100644 (file)
@@ -321,6 +321,26 @@ class CodeopTests(unittest.TestCase):
             warnings.simplefilter('error', SyntaxWarning)
             compile_command('1 is 1', symbol='exec')
 
+        # Check DeprecationWarning treated as an SyntaxError
+        with warnings.catch_warnings(), self.assertRaises(SyntaxError):
+            warnings.simplefilter('error', DeprecationWarning)
+            compile_command(r"'\e'", symbol='exec')
+
+    def test_incomplete_warning(self):
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter('always')
+            self.assertIncomplete("'\\e' + (")
+        self.assertEqual(w, [])
+
+    def test_invalid_warning(self):
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter('always')
+            self.assertInvalid("'\\e' 1")
+        self.assertEqual(len(w), 1)
+        self.assertEqual(w[0].category, DeprecationWarning)
+        self.assertRegex(str(w[0].message), 'invalid escape sequence')
+        self.assertEqual(w[0].filename, '<input>')
+
 
 if __name__ == "__main__":
     unittest.main()
index ac06518..d329cb1 100644 (file)
@@ -984,6 +984,38 @@ if 1:
             elif instr.opname in HANDLED_JUMPS:
                 self.assertNotEqual(instr.arg, (line + 1)*INSTR_SIZE)
 
+    def test_compare_positions(self):
+        for opname, op in [
+            ("COMPARE_OP", "<"),
+            ("COMPARE_OP", "<="),
+            ("COMPARE_OP", ">"),
+            ("COMPARE_OP", ">="),
+            ("CONTAINS_OP", "in"),
+            ("CONTAINS_OP", "not in"),
+            ("IS_OP", "is"),
+            ("IS_OP", "is not"),
+        ]:
+            expr = f'a {op} b {op} c'
+            expected_lines = 2 * [2]
+            for source in [
+                f"\\\n{expr}", f'if \\\n{expr}: x', f"x if \\\n{expr} else y"
+            ]:
+                code = compile(source, "<test>", "exec")
+                all_lines = (
+                    line
+                    for start, stop, line in code.co_lines()
+                    for _ in range(start, stop, 2)
+                )
+                actual_lines = [
+                    line
+                    for instruction, line in zip(
+                        dis.get_instructions(code), all_lines, strict=True
+                    )
+                    if instruction.opname == opname
+                ]
+                with self.subTest(source):
+                    self.assertEqual(actual_lines, expected_lines)
+
 
 class TestExpressionStackSize(unittest.TestCase):
     # These tests check that the computed stack size for a code object
index a414a6f..acff245 100644 (file)
@@ -1262,7 +1262,7 @@ class CoroutineTest(unittest.TestCase):
 
         async def func():
             async with CM():
-                assert (1, ) == 1
+                self.assertEqual((1, ), 1)
 
         with self.assertRaises(AssertionError):
             run_async(func())
index d94a6f2..623a6b6 100644 (file)
@@ -335,6 +335,11 @@ class Test_Csv(unittest.TestCase):
                           ['abc,3'], [[]],
                           quoting=csv.QUOTE_NONNUMERIC)
 
+    def test_read_skipinitialspace(self):
+        self._read_test(['no space, space,  spaces,\ttab'],
+                        [['no space', 'space', 'spaces', '\ttab']],
+                        skipinitialspace=True)
+
     def test_read_bigfield(self):
         # This exercises the buffer realloc functionality and field size
         # limits.
index 23a1718..69f7db7 100644 (file)
@@ -707,7 +707,7 @@ class DisWithFileTests(DisTests):
         return output.getvalue()
 
 
-if sys.flags.optimize:
+if dis.code_info.__doc__ is None:
     code_info_consts = "0: None"
 else:
     code_info_consts = "0: 'Formatted details of methods, functions, or code.'"
index d9ea8a4..5cdbfcd 100644 (file)
@@ -1981,6 +1981,11 @@ class AttributeErrorTests(unittest.TestCase):
         except AttributeError as exc:
             self.assertEqual("bluch", exc.name)
             self.assertEqual(obj, exc.obj)
+        try:
+            object.__getattribute__(obj, "bluch")
+        except AttributeError as exc:
+            self.assertEqual("bluch", exc.name)
+            self.assertEqual(obj, exc.obj)
 
     def test_getattr_has_name_and_obj_for_method(self):
         class A:
index eaefe94..16fef5c 100644 (file)
@@ -1418,6 +1418,13 @@ class TestClassesAndFunctions(unittest.TestCase):
         self.assertEqual(inspect.get_annotations(isa.MyClassWithLocalAnnotations, eval_str=True), {'x': int})
 
 
+class TestFormatAnnotation(unittest.TestCase):
+    def test_typing_replacement(self):
+        from test.typinganndata.ann_module9 import ann, ann1
+        self.assertEqual(inspect.formatannotation(ann), 'Union[List[str], int]')
+        self.assertEqual(inspect.formatannotation(ann1), 'Union[List[testModule.typing.A], int]')
+
+
 class TestIsDataDescriptor(unittest.TestCase):
 
     def test_custom_descriptors(self):
index a578ca8..4939d7b 100644 (file)
@@ -641,7 +641,8 @@ class IntStrDigitLimitsTests(unittest.TestCase):
         self.assertEqual(len(huge_decimal), digits)
         # Ensuring that we chose a slow enough conversion to measure.
         # It takes 0.1 seconds on a Zen based cloud VM in an opt build.
-        if seconds_to_convert < 0.005:
+        # Some OSes have a low res 1/64s timer, skip if hard to measure.
+        if seconds_to_convert < 1/64:
             raise unittest.SkipTest('"slow" conversion took only '
                                     f'{seconds_to_convert} seconds.')
 
@@ -653,7 +654,7 @@ class IntStrDigitLimitsTests(unittest.TestCase):
                 str(huge_int)
             seconds_to_fail_huge = get_time() - start
         self.assertIn('conversion', str(err.exception))
-        self.assertLess(seconds_to_fail_huge, seconds_to_convert/8)
+        self.assertLessEqual(seconds_to_fail_huge, seconds_to_convert/2)
 
         # Now we test that a conversion that would take 30x as long also fails
         # in a similarly fast fashion.
@@ -664,7 +665,7 @@ class IntStrDigitLimitsTests(unittest.TestCase):
             str(extra_huge_int)
         seconds_to_fail_extra_huge = get_time() - start
         self.assertIn('conversion', str(err.exception))
-        self.assertLess(seconds_to_fail_extra_huge, seconds_to_convert/8)
+        self.assertLess(seconds_to_fail_extra_huge, seconds_to_convert/2)
 
     def test_denial_of_service_prevented_str_to_int(self):
         """Regression test: ensure we fail before performing O(N**2) work."""
@@ -682,7 +683,8 @@ class IntStrDigitLimitsTests(unittest.TestCase):
         seconds_to_convert = get_time() - start
         # Ensuring that we chose a slow enough conversion to measure.
         # It takes 0.1 seconds on a Zen based cloud VM in an opt build.
-        if seconds_to_convert < 0.005:
+        # Some OSes have a low res 1/64s timer, skip if hard to measure.
+        if seconds_to_convert < 1/64:
             raise unittest.SkipTest('"slow" conversion took only '
                                     f'{seconds_to_convert} seconds.')
 
@@ -692,7 +694,7 @@ class IntStrDigitLimitsTests(unittest.TestCase):
                 int(huge)
             seconds_to_fail_huge = get_time() - start
         self.assertIn('conversion', str(err.exception))
-        self.assertLess(seconds_to_fail_huge, seconds_to_convert/8)
+        self.assertLessEqual(seconds_to_fail_huge, seconds_to_convert/2)
 
         # Now we test that a conversion that would take 30x as long also fails
         # in a similarly fast fashion.
@@ -703,7 +705,7 @@ class IntStrDigitLimitsTests(unittest.TestCase):
             int(extra_huge)
         seconds_to_fail_extra_huge = get_time() - start
         self.assertIn('conversion', str(err.exception))
-        self.assertLess(seconds_to_fail_extra_huge, seconds_to_convert/8)
+        self.assertLessEqual(seconds_to_fail_extra_huge, seconds_to_convert/2)
 
     def test_power_of_two_bases_unlimited(self):
         """The limit does not apply to power of 2 bases."""
index f012af0..f1ef87f 100644 (file)
@@ -1653,7 +1653,7 @@ class IpaddrUnitTest(unittest.TestCase):
         self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64)
 
     def testGetitem(self):
-        # http://code.google.com/p/ipaddr-py/issues/detail?id=15
+        # https://code.google.com/p/ipaddr-py/issues/detail?id=15
         addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
         self.assertEqual(28, addr.prefixlen)
         addr_list = list(addr)
index eb9064e..efc982e 100644 (file)
@@ -2,73 +2,73 @@ from test.test_json import PyTest, CTest
 
 # 2007-10-05
 JSONDOCS = [
-    # http://json.org/JSON_checker/test/fail1.json
+    # https://json.org/JSON_checker/test/fail1.json
     '"A JSON payload should be an object or array, not a string."',
-    # http://json.org/JSON_checker/test/fail2.json
+    # https://json.org/JSON_checker/test/fail2.json
     '["Unclosed array"',
-    # http://json.org/JSON_checker/test/fail3.json
+    # https://json.org/JSON_checker/test/fail3.json
     '{unquoted_key: "keys must be quoted"}',
-    # http://json.org/JSON_checker/test/fail4.json
+    # https://json.org/JSON_checker/test/fail4.json
     '["extra comma",]',
-    # http://json.org/JSON_checker/test/fail5.json
+    # https://json.org/JSON_checker/test/fail5.json
     '["double extra comma",,]',
-    # http://json.org/JSON_checker/test/fail6.json
+    # https://json.org/JSON_checker/test/fail6.json
     '[   , "<-- missing value"]',
-    # http://json.org/JSON_checker/test/fail7.json
+    # https://json.org/JSON_checker/test/fail7.json
     '["Comma after the close"],',
-    # http://json.org/JSON_checker/test/fail8.json
+    # https://json.org/JSON_checker/test/fail8.json
     '["Extra close"]]',
-    # http://json.org/JSON_checker/test/fail9.json
+    # https://json.org/JSON_checker/test/fail9.json
     '{"Extra comma": true,}',
-    # http://json.org/JSON_checker/test/fail10.json
+    # https://json.org/JSON_checker/test/fail10.json
     '{"Extra value after close": true} "misplaced quoted value"',
-    # http://json.org/JSON_checker/test/fail11.json
+    # https://json.org/JSON_checker/test/fail11.json
     '{"Illegal expression": 1 + 2}',
-    # http://json.org/JSON_checker/test/fail12.json
+    # https://json.org/JSON_checker/test/fail12.json
     '{"Illegal invocation": alert()}',
-    # http://json.org/JSON_checker/test/fail13.json
+    # https://json.org/JSON_checker/test/fail13.json
     '{"Numbers cannot have leading zeroes": 013}',
-    # http://json.org/JSON_checker/test/fail14.json
+    # https://json.org/JSON_checker/test/fail14.json
     '{"Numbers cannot be hex": 0x14}',
-    # http://json.org/JSON_checker/test/fail15.json
+    # https://json.org/JSON_checker/test/fail15.json
     '["Illegal backslash escape: \\x15"]',
-    # http://json.org/JSON_checker/test/fail16.json
+    # https://json.org/JSON_checker/test/fail16.json
     '[\\naked]',
-    # http://json.org/JSON_checker/test/fail17.json
+    # https://json.org/JSON_checker/test/fail17.json
     '["Illegal backslash escape: \\017"]',
-    # http://json.org/JSON_checker/test/fail18.json
+    # https://json.org/JSON_checker/test/fail18.json
     '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]',
-    # http://json.org/JSON_checker/test/fail19.json
+    # https://json.org/JSON_checker/test/fail19.json
     '{"Missing colon" null}',
-    # http://json.org/JSON_checker/test/fail20.json
+    # https://json.org/JSON_checker/test/fail20.json
     '{"Double colon":: null}',
-    # http://json.org/JSON_checker/test/fail21.json
+    # https://json.org/JSON_checker/test/fail21.json
     '{"Comma instead of colon", null}',
-    # http://json.org/JSON_checker/test/fail22.json
+    # https://json.org/JSON_checker/test/fail22.json
     '["Colon instead of comma": false]',
-    # http://json.org/JSON_checker/test/fail23.json
+    # https://json.org/JSON_checker/test/fail23.json
     '["Bad value", truth]',
-    # http://json.org/JSON_checker/test/fail24.json
+    # https://json.org/JSON_checker/test/fail24.json
     "['single quote']",
-    # http://json.org/JSON_checker/test/fail25.json
+    # https://json.org/JSON_checker/test/fail25.json
     '["\ttab\tcharacter\tin\tstring\t"]',
-    # http://json.org/JSON_checker/test/fail26.json
+    # https://json.org/JSON_checker/test/fail26.json
     '["tab\\   character\\   in\\  string\\  "]',
-    # http://json.org/JSON_checker/test/fail27.json
+    # https://json.org/JSON_checker/test/fail27.json
     '["line\nbreak"]',
-    # http://json.org/JSON_checker/test/fail28.json
+    # https://json.org/JSON_checker/test/fail28.json
     '["line\\\nbreak"]',
-    # http://json.org/JSON_checker/test/fail29.json
+    # https://json.org/JSON_checker/test/fail29.json
     '[0e]',
-    # http://json.org/JSON_checker/test/fail30.json
+    # https://json.org/JSON_checker/test/fail30.json
     '[0e+]',
-    # http://json.org/JSON_checker/test/fail31.json
+    # https://json.org/JSON_checker/test/fail31.json
     '[0e+-1]',
-    # http://json.org/JSON_checker/test/fail32.json
+    # https://json.org/JSON_checker/test/fail32.json
     '{"Comma instead if closing brace": true,',
-    # http://json.org/JSON_checker/test/fail33.json
+    # https://json.org/JSON_checker/test/fail33.json
     '["mismatch"}',
-    # http://code.google.com/p/simplejson/issues/detail?id=3
+    # https://code.google.com/archive/p/simplejson/issues/3
     '["A\u001FZ control characters in string"]',
 ]
 
index 15e64b0..26bf3cd 100644 (file)
@@ -1,7 +1,7 @@
 from test.test_json import PyTest, CTest
 
 
-# from http://json.org/JSON_checker/test/pass1.json
+# from https://json.org/JSON_checker/test/pass1.json
 JSON = r'''
 [
     "JSON Test Pattern pass1",
index 3507524..9340de6 100644 (file)
@@ -1,7 +1,7 @@
 from test.test_json import PyTest, CTest
 
 
-# from http://json.org/JSON_checker/test/pass2.json
+# from https://json.org/JSON_checker/test/pass2.json
 JSON = r'''
 [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
 '''
index cd0cf17..0adccc1 100644 (file)
@@ -1,7 +1,7 @@
 from test.test_json import PyTest, CTest
 
 
-# from http://json.org/JSON_checker/test/pass3.json
+# from https://json.org/JSON_checker/test/pass3.json
 JSON = r'''
 {
     "JSON Test Pattern pass3": {
index 3c8d829..85bbf51 100644 (file)
@@ -68,6 +68,19 @@ class ListTest(list_tests.CommonTest):
         self.assertRaises((MemoryError, OverflowError), mul, lst, n)
         self.assertRaises((MemoryError, OverflowError), imul, lst, n)
 
+    def test_list_resize_overflow(self):
+        # gh-97616: test new_allocated * sizeof(PyObject*) overflow
+        # check in list_resize()
+        lst = [0] * 65
+        del lst[1:]
+        self.assertEqual(len(lst), 1)
+
+        size = ((2 ** (tuple.__itemsize__ * 8) - 1) // 2)
+        with self.assertRaises((MemoryError, OverflowError)):
+            lst * size
+        with self.assertRaises((MemoryError, OverflowError)):
+            lst *= size
+
     def test_repr_large(self):
         # Check the repr of large list objects
         def check(n):
index c97842b..f8a6207 100644 (file)
@@ -1350,6 +1350,26 @@ class LongTest(unittest.TestCase):
         self.assertEqual(i, 1)
         self.assertEqual(getattr(i, 'foo', 'none'), 'bar')
 
+        class ValidBytes:
+            def __bytes__(self):
+                return b'\x01'
+        class InvalidBytes:
+            def __bytes__(self):
+                return 'abc'
+        class MissingBytes: ...
+        class RaisingBytes:
+            def __bytes__(self):
+                1 / 0
+
+        for byte_order in ('big', 'little'):
+            self.assertEqual(int.from_bytes(ValidBytes(), byte_order), 1)
+            self.assertRaises(
+                TypeError, int.from_bytes, InvalidBytes(), byte_order)
+            self.assertRaises(
+                TypeError, int.from_bytes, MissingBytes(), byte_order)
+            self.assertRaises(
+                ZeroDivisionError, int.from_bytes, RaisingBytes(), byte_order)
+
     def test_access_to_nonexistent_digit_0(self):
         # http://bugs.python.org/issue14630: A bug in _PyLong_Copy meant that
         # ob_digit[0] was being incorrectly accessed for instances of a
index ef9cad4..32f07ab 100644 (file)
@@ -123,7 +123,8 @@ class HelperFunctionTest(unittest.TestCase):
             (["", "audio/*", "foo.txt"], ""),
             (["echo foo", "audio/*", "foo.txt"], "echo foo"),
             (["echo %s", "audio/*", "foo.txt"], "echo foo.txt"),
-            (["echo %t", "audio/*", "foo.txt"], "echo audio/*"),
+            (["echo %t", "audio/*", "foo.txt"], None),
+            (["echo %t", "audio/wav", "foo.txt"], "echo audio/wav"),
             (["echo \\%t", "audio/*", "foo.txt"], "echo %t"),
             (["echo foo", "audio/*", "foo.txt", plist], "echo foo"),
             (["echo %{total}", "audio/*", "foo.txt", plist], "echo 3")
@@ -207,7 +208,10 @@ class FindmatchTest(unittest.TestCase):
              ('"An audio fragment"', audio_basic_entry)),
             ([c, "audio/*"],
              {"filename": fname},
-             ("/usr/local/bin/showaudio audio/*", audio_entry)),
+             (None, None)),
+            ([c, "audio/wav"],
+             {"filename": fname},
+             ("/usr/local/bin/showaudio audio/wav", audio_entry)),
             ([c, "message/external-body"],
              {"plist": plist},
              ("showexternal /dev/null default john python.org     /tmp foo bar", message_entry))
index 701543b..19bc885 100644 (file)
@@ -2066,6 +2066,28 @@ class TestPosixWeaklinking(unittest.TestCase):
             with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"):
                 os.mkdir("dir", dir_fd=0)
 
+    def test_mkfifo(self):
+        self._verify_available("HAVE_MKFIFOAT")
+        if self.mac_ver >= (13, 0):
+            self.assertIn("HAVE_MKFIFOAT", posix._have_functions)
+
+        else:
+            self.assertNotIn("HAVE_MKFIFOAT", posix._have_functions)
+
+            with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"):
+                os.mkfifo("path", dir_fd=0)
+
+    def test_mknod(self):
+        self._verify_available("HAVE_MKNODAT")
+        if self.mac_ver >= (13, 0):
+            self.assertIn("HAVE_MKNODAT", posix._have_functions)
+
+        else:
+            self.assertNotIn("HAVE_MKNODAT", posix._have_functions)
+
+            with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"):
+                os.mknod("path", dir_fd=0)
+
     def test_rename_replace(self):
         self._verify_available("HAVE_RENAMEAT")
         if self.mac_ver >= (10, 10):
index 7ae7baa..b9c8ea3 100644 (file)
@@ -91,10 +91,23 @@ class TestCase(unittest.TestCase):
         l = []
         fun = lambda x: l.append(x)
         scheduler = sched.scheduler(time.time, time.sleep)
-        for priority in [1, 2, 3, 4, 5]:
-            z = scheduler.enterabs(0.01, priority, fun, (priority,))
-        scheduler.run()
-        self.assertEqual(l, [1, 2, 3, 4, 5])
+
+        cases = [
+            ([1, 2, 3, 4, 5], [1, 2, 3, 4, 5]),
+            ([5, 4, 3, 2, 1], [1, 2, 3, 4, 5]),
+            ([2, 5, 3, 1, 4], [1, 2, 3, 4, 5]),
+            ([1, 2, 3, 2, 1], [1, 1, 2, 2, 3]),
+        ]
+        for priorities, expected in cases:
+            with self.subTest(priorities=priorities, expected=expected):
+                for priority in priorities:
+                    scheduler.enterabs(0.01, priority, fun, (priority,))
+                scheduler.run()
+                self.assertEqual(l, expected)
+
+                # Cleanup:
+                self.assertTrue(scheduler.empty())
+                l.clear()
 
     def test_cancel(self):
         l = []
index a0cb605..219c25c 100644 (file)
@@ -147,6 +147,18 @@ class MiscSourceEncodingTest(unittest.TestCase):
         self.assertTrue(c.exception.args[0].startswith(expected),
                         msg=c.exception.args[0])
 
+    def test_file_parse_error_multiline(self):
+        # gh96611:
+        with open(TESTFN, "wb") as fd:
+            fd.write(b'print("""\n\xb1""")\n')
+
+        try:
+            retcode, stdout, stderr = script_helper.assert_python_failure(TESTFN)
+
+            self.assertGreater(retcode, 0)
+            self.assertIn(b"Non-UTF-8 code starting with '\\xb1'", stderr)
+        finally:
+            os.unlink(TESTFN)
 
 class AbstractSourceEncodingTest:
 
index 7231970..f3d5f33 100644 (file)
@@ -213,6 +213,13 @@ class TestLiterals(unittest.TestCase):
         self.assertRaises(SyntaxError, eval, """ bu'' """)
         self.assertRaises(SyntaxError, eval, """ ub'' """)
 
+    def test_uppercase_prefixes(self):
+        self.assertEqual(eval(""" B'x' """), b'x')
+        self.assertEqual(eval(r""" R'\x01' """), r'\x01')
+        self.assertEqual(eval(r""" BR'\x01' """), br'\x01')
+        self.assertEqual(eval(""" F'{1+1}' """), f'{1+1}')
+        self.assertEqual(eval(r""" U'\U0001d120' """), u'\U0001d120')
+
     def check_encoding(self, encoding, extra=""):
         modname = "xx_" + encoding.replace("-", "_")
         fn = os.path.join(self.tmpdir, modname + ".py")
index b91791a..ea02a9e 100644 (file)
@@ -227,6 +227,12 @@ class ProcessTestCase(BaseTestCase):
                 input=None, universal_newlines=True)
         self.assertNotIn('XX', output)
 
+    def test_check_output_input_none_encoding_errors(self):
+        output = subprocess.check_output(
+                [sys.executable, "-c", "print('foo')"],
+                input=None, encoding='utf-8', errors='ignore')
+        self.assertIn('foo', output)
+
     def test_check_output_stdout_arg(self):
         # check_output() refuses to accept 'stdout' argument
         with self.assertRaises(ValueError) as c:
index 1f509ee..312b909 100644 (file)
@@ -1310,6 +1310,20 @@ class RaisingTraceFuncTestCase(unittest.TestCase):
         finally:
             sys.settrace(existing)
 
+    def test_line_event_raises_before_opcode_event(self):
+        exception = ValueError("BOOM!")
+        def trace(frame, event, arg):
+            if event == "line":
+                raise exception
+            frame.f_trace_opcodes = True
+            return trace
+        def f():
+            pass
+        with self.assertRaises(ValueError) as caught:
+            sys.settrace(trace)
+            f()
+        self.assertIs(caught.exception, exception)
+
 
 # 'Jump' tests: assigning to frame.f_lineno within a trace function
 # moves the execution position - it's how debuggers implement a Jump
index fe09bd3..b3ba2ab 100644 (file)
@@ -1,5 +1,9 @@
-from test.support import import_helper
+from test.support import import_helper, threading_helper
 syslog = import_helper.import_module("syslog") #skip if not supported
+from test import support
+import sys
+import threading
+import time
 import unittest
 
 # XXX(nnorwitz): This test sucks.  I don't know of a platform independent way
@@ -8,6 +12,9 @@ import unittest
 
 class Test(unittest.TestCase):
 
+    def tearDown(self):
+        syslog.closelog()
+
     def test_openlog(self):
         syslog.openlog('python')
         # Issue #6697.
@@ -18,22 +25,58 @@ class Test(unittest.TestCase):
         syslog.syslog('test message from python test_syslog')
         syslog.syslog(syslog.LOG_ERR, 'test error from python test_syslog')
 
+    def test_syslog_implicit_open(self):
+        syslog.closelog() # Make sure log is closed
+        syslog.syslog('test message from python test_syslog')
+        syslog.syslog(syslog.LOG_ERR, 'test error from python test_syslog')
+
     def test_closelog(self):
         syslog.openlog('python')
         syslog.closelog()
+        syslog.closelog()  # idempotent operation
 
     def test_setlogmask(self):
-        syslog.setlogmask(syslog.LOG_DEBUG)
+        mask = syslog.LOG_UPTO(syslog.LOG_WARNING)
+        oldmask = syslog.setlogmask(mask)
+        self.assertEqual(syslog.setlogmask(0), mask)
+        self.assertEqual(syslog.setlogmask(oldmask), mask)
 
     def test_log_mask(self):
-        syslog.LOG_MASK(syslog.LOG_INFO)
-
-    def test_log_upto(self):
-        syslog.LOG_UPTO(syslog.LOG_INFO)
+        mask = syslog.LOG_UPTO(syslog.LOG_WARNING)
+        self.assertTrue(mask & syslog.LOG_MASK(syslog.LOG_WARNING))
+        self.assertTrue(mask & syslog.LOG_MASK(syslog.LOG_ERR))
+        self.assertFalse(mask & syslog.LOG_MASK(syslog.LOG_INFO))
 
     def test_openlog_noargs(self):
         syslog.openlog()
         syslog.syslog('test message from python test_syslog')
 
+    def test_syslog_threaded(self):
+        start = threading.Event()
+        stop = False
+        def opener():
+            start.wait(10)
+            i = 1
+            while not stop:
+                syslog.openlog(f'python-test-{i}')  # new string object
+                i += 1
+        def logger():
+            start.wait(10)
+            while not stop:
+                syslog.syslog('test message from python test_syslog')
+
+        orig_si = sys.getswitchinterval()
+        support.setswitchinterval(1e-9)
+        try:
+            threads = [threading.Thread(target=opener)]
+            threads += [threading.Thread(target=logger) for k in range(10)]
+            with threading_helper.start_threads(threads):
+                start.set()
+                time.sleep(0.1)
+                stop = True
+        finally:
+            sys.setswitchinterval(orig_si)
+
+
 if __name__ == "__main__":
     unittest.main()
index dd14287..f5ce095 100644 (file)
@@ -2759,6 +2759,25 @@ class CAPITest(unittest.TestCase):
         check_format('repr=abc',
                      b'repr=%V', 'abc', b'xyz')
 
+        # test %p
+        # We cannot test the exact result,
+        # because it returns a hex representation of a C pointer,
+        # which is going to be different each time. But, we can test the format.
+        p_format_regex = r'^0x[a-zA-Z0-9]{3,}$'
+        p_format1 = PyUnicode_FromFormat(b'%p', 'abc')
+        self.assertIsInstance(p_format1, str)
+        self.assertRegex(p_format1, p_format_regex)
+
+        p_format2 = PyUnicode_FromFormat(b'%p %p', '123456', b'xyz')
+        self.assertIsInstance(p_format2, str)
+        self.assertRegex(p_format2,
+                         r'0x[a-zA-Z0-9]{3,} 0x[a-zA-Z0-9]{3,}')
+
+        # Extra args are ignored:
+        p_format3 = PyUnicode_FromFormat(b'%p', '123456', None, b'xyz')
+        self.assertIsInstance(p_format3, str)
+        self.assertRegex(p_format3, p_format_regex)
+
         # Test string decode from parameter of %s using utf-8.
         # b'\xe4\xba\xba\xe6\xb0\x91' is utf-8 encoded byte sequence of
         # '\u4eba\u6c11'
index 213b3cf..2a93f0f 100644 (file)
@@ -95,6 +95,13 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest):
         result = h.hexdigest()
         self.assertEqual(result, self.expectedchecksum)
 
+    @requires_resource('cpu')
+    def test_name_inverse_lookup(self):
+        for i in range(sys.maxunicode + 1):
+            char = chr(i)
+            if looked_name := self.db.name(char, None):
+                self.assertEqual(self.db.lookup(looked_name), char)
+
     def test_digit(self):
         self.assertEqual(self.db.digit('A', None), None)
         self.assertEqual(self.db.digit('9'), 9)
index 33e1149..6e38c5e 100644 (file)
@@ -341,6 +341,12 @@ class UnparseTestCase(ASTTestCase):
     def test_invalid_yield_from(self):
         self.check_invalid(ast.YieldFrom(value=None))
 
+    def test_import_from_level_none(self):
+        tree = ast.ImportFrom(module='mod', names=[ast.alias(name='x')])
+        self.assertEqual(ast.unparse(tree), "from mod import x")
+        tree = ast.ImportFrom(module='mod', names=[ast.alias(name='x')], level=None)
+        self.assertEqual(ast.unparse(tree), "from mod import x")
+
     def test_docstrings(self):
         docstrings = (
             'this ends with double quote"',
diff --git a/Lib/test/typinganndata/__init__.py b/Lib/test/typinganndata/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Lib/test/typinganndata/ann_module9.py b/Lib/test/typinganndata/ann_module9.py
new file mode 100644 (file)
index 0000000..9522173
--- /dev/null
@@ -0,0 +1,14 @@
+# Test ``inspect.formatannotation``
+# https://github.com/python/cpython/issues/96073
+
+from typing import Union, List
+
+ann = Union[List[str], int]
+
+# mock typing._type_repr behaviour
+class A: ...
+
+A.__module__ = 'testModule.typing'
+A.__qualname__ = 'A'
+
+ann1 = Union[List[A], int]
index b20c16d..c7176e6 100644 (file)
@@ -2592,7 +2592,7 @@ class BaseWidget(Misc):
         if kw:
             cnf = _cnfmerge((cnf, kw))
         self.widgetName = widgetName
-        BaseWidget._setup(self, master, cnf)
+        self._setup(master, cnf)
         if self._tclCommands is None:
             self._tclCommands = []
         classes = [(k, v) for k, v in cnf.items() if isinstance(k, type)]
@@ -3011,6 +3011,8 @@ class Canvas(Widget, XView, YView):
         return self.tk.call(self._w, 'type', tagOrId) or None
 
 
+_checkbutton_count = 0
+
 class Checkbutton(Widget):
     """Checkbutton widget which is either in on- or off-state."""
 
@@ -3026,6 +3028,14 @@ class Checkbutton(Widget):
         underline, variable, width, wraplength."""
         Widget.__init__(self, master, 'checkbutton', cnf, kw)
 
+    def _setup(self, master, cnf):
+        if not cnf.get('name'):
+            global _checkbutton_count
+            name = self.__class__.__name__.lower()
+            _checkbutton_count += 1
+            cnf['name'] = f'!{name}{_checkbutton_count}'
+        super()._setup(master, cnf)
+
     def deselect(self):
         """Put the button in off-state."""
         self.tk.call(self._w, 'deselect')
index 8ae2140..36ae6c2 100644 (file)
@@ -11,7 +11,7 @@ class Dialog(Widget):
     def __init__(self, master=None, cnf={}, **kw):
         cnf = _cnfmerge((cnf, kw))
         self.widgetName = '__dialog__'
-        Widget._setup(self, master, cnf)
+        self._setup(master, cnf)
         self.num = self.tk.getint(
                 self.tk.call(
                       'tk_dialog', self._w,
index c0b92bf..562f471 100644 (file)
@@ -212,6 +212,32 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
         widget = self.create()
         self.checkParams(widget, 'onvalue', 1, 2.3, '', 'any string')
 
+    def test_unique_variables(self):
+        frames = []
+        buttons = []
+        for i in range(2):
+            f = tkinter.Frame(self.root)
+            f.pack()
+            frames.append(f)
+            for j in 'AB':
+                b = tkinter.Checkbutton(f, text=j)
+                b.pack()
+                buttons.append(b)
+        variables = [str(b['variable']) for b in buttons]
+        self.assertEqual(len(set(variables)), 4, variables)
+
+    def test_same_name(self):
+        f1 = tkinter.Frame(self.root)
+        f2 = tkinter.Frame(self.root)
+        b1 = tkinter.Checkbutton(f1, name='test', text='Test1')
+        b2 = tkinter.Checkbutton(f2, name='test', text='Test2')
+
+        v = tkinter.IntVar(self.root, name='test')
+        b1.select()
+        self.assertEqual(v.get(), 1)
+        b2.deselect()
+        self.assertEqual(v.get(), 0)
+
 
 @add_standard_options(StandardOptionsTests)
 class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
index 1cb7e74..c314296 100644 (file)
@@ -275,6 +275,21 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
         self.assertEqual(cbtn['offvalue'],
             cbtn.tk.globalgetvar(cbtn['variable']))
 
+    def test_unique_variables(self):
+        frames = []
+        buttons = []
+        for i in range(2):
+            f = ttk.Frame(self.root)
+            f.pack()
+            frames.append(f)
+            for j in 'AB':
+                b = ttk.Checkbutton(f, text=j)
+                b.pack()
+                buttons.append(b)
+        variables = [str(b['variable']) for b in buttons]
+        print(variables)
+        self.assertEqual(len(set(variables)), 4, variables)
+
 
 @add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
 class EntryTest(AbstractWidgetTest, unittest.TestCase):
index 44ecae1..ce21826 100644 (file)
@@ -310,7 +310,7 @@ class TixWidget(tkinter.Widget):
                 del cnf[k]
 
         self.widgetName = widgetName
-        Widget._setup(self, master, cnf)
+        self._setup(master, cnf)
 
         # If widgetName is None, this is a dummy creation call where the
         # corresponding Tk widget has already been created by Tix
index f3b320b..1127283 100644 (file)
@@ -595,7 +595,6 @@ class TurtleScreenBase(object):
         item = self.cv.create_text(x-1, -y, text = txt, anchor = anchor[align],
                                         fill = pencolor, font = font)
         x0, y0, x1, y1 = self.cv.bbox(item)
-        self.cv.update()
         return item, x1-1
 
 ##    def _dot(self, pos, size, color):
@@ -3403,6 +3402,7 @@ class RawTurtle(TPen, TNavigator):
         """
         item, end = self.screen._write(self._position, txt, align, font,
                                                           self._pencolor)
+        self._update()
         self.items.append(item)
         if self.undobuffer:
             self.undobuffer.push(("wri", item))
index 62c8851..9f8585b 100755 (executable)
@@ -109,7 +109,6 @@ def tick():
         writer.write(datum(t),
                      align="center", font=("Courier", 14, "bold"))
         writer.forward(85)
-        tracer(True)
         second_hand.setheading(6*sekunde)  # or here
         minute_hand.setheading(6*minute)
         hour_hand.setheading(30*stunde)
index a0ef60b..76fdd71 100644 (file)
@@ -1579,8 +1579,7 @@ class FTPHandler(BaseHandler):
             headers = email.message_from_string(headers)
             return addinfourl(fp, headers, req.full_url)
         except ftplib.all_errors as exp:
-            exc = URLError('ftp error: %r' % exp)
-            raise exc.with_traceback(sys.exc_info()[2])
+            raise URLError(exp) from exp
 
     def connect_ftp(self, user, passwd, host, port, dirs, timeout):
         return ftpwrapper(user, passwd, host, port, dirs, timeout,
@@ -2492,28 +2491,34 @@ def getproxies_environment():
     this seems to be the standard convention.  If you need a
     different way, you can pass a proxies dictionary to the
     [Fancy]URLopener constructor.
-
     """
-    proxies = {}
     # in order to prefer lowercase variables, process environment in
     # two passes: first matches any, second pass matches lowercase only
-    for name, value in os.environ.items():
-        name = name.lower()
-        if value and name[-6:] == '_proxy':
-            proxies[name[:-6]] = value
+
+    # select only environment variables which end in (after making lowercase) _proxy
+    proxies = {}
+    environment = []
+    for name in os.environ.keys():
+        # fast screen underscore position before more expensive case-folding
+        if len(name) > 5 and name[-6] == "_" and name[-5:].lower() == "proxy":
+            value = os.environ[name]
+            proxy_name = name[:-6].lower()
+            environment.append((name, value, proxy_name))
+            if value:
+                proxies[proxy_name] = value
     # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
     # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
     # header from the client
     # If "proxy" is lowercase, it will still be used thanks to the next block
     if 'REQUEST_METHOD' in os.environ:
         proxies.pop('http', None)
-    for name, value in os.environ.items():
+    for name, value, proxy_name in environment:
+        # not case-folded, checking here for lower-case env vars only
         if name[-6:] == '_proxy':
-            name = name.lower()
             if value:
-                proxies[name[:-6]] = value
+                proxies[proxy_name] = value
             else:
-                proxies.pop(name[:-6], None)
+                proxies.pop(proxy_name, None)
     return proxies
 
 def proxy_bypass_environment(host, proxies=None):
index 6f1af29..8852008 100644 (file)
@@ -115,6 +115,11 @@ class EnvBuilder:
         context.prompt = '(%s) ' % prompt
         create_if_needed(env_dir)
         executable = sys._base_executable
+        if not executable:  # see gh-96861
+            raise ValueError('Unable to determine path to the running '
+                             'Python interpreter. Provide an explicit path or '
+                             'check that your PATH environment variable is '
+                             'correctly set.')
         dirname, exename = os.path.split(os.path.abspath(executable))
         context.executable = executable
         context.python_dir = dirname
index 6e16578..6044e32 100644 (file)
@@ -1,6 +1,6 @@
 # (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
-# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
-# Also licenced under the Apache License, 2.0: http://opensource.org/licenses/apache2.0.php
+# Licensed under the MIT license: https://opensource.org/licenses/mit-license.php
+# Also licenced under the Apache License, 2.0: https://opensource.org/licenses/apache2.0.php
 # Licensed to PSF under a Contributor Agreement
 """
 Middleware to check for obedience to the WSGI specification.
index 668667c..67a6e4b 100755 (executable)
@@ -249,6 +249,7 @@ def library_recipes():
               name="OpenSSL 1.1.1q",
               url="https://www.openssl.org/source/openssl-1.1.1q.tar.gz",
               checksum='d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca',
+              patches=['openssl1.1.1q-pr-18719.patch'],
               buildrecipe=build_universal_openssl,
               configure=None,
               install=None,
diff --git a/Mac/BuildScript/openssl1.1.1q-pr-18719.patch b/Mac/BuildScript/openssl1.1.1q-pr-18719.patch
new file mode 100644 (file)
index 0000000..6b4b188
--- /dev/null
@@ -0,0 +1,17 @@
+https://github.com/openssl/openssl/commit/60f011f584d80447e86cae1d1bd3ae24bc13235b
+This fixes a regression in 1.1.1q:
+
+test/v3ext.c:201:24: error: implicitly declaring library function 'memcmp' with type 'int (const void *, const void *, unsigned long)' [-Werror,-Wimplicit-function-declaration]
+        if (!TEST_true(memcmp(ip1->data, ip2->data, ip1->length) <= 0))
+
+diff -Naur openssl-1.1.1q/test/v3ext.c openssl-1.1.1q-patched/test/v3ext.c
+--- openssl-1.1.1q/test/v3ext.c        2022-07-05 09:08:33.000000000 +0000
++++ openssl-1.1.1q-patched/test/v3ext.c        2022-09-05 16:54:45.740859256 +0000
+@@ -8,6 +8,7 @@
+  */
+ #include <stdio.h>
++#include <string.h>
+ #include <openssl/x509.h>
+ #include <openssl/x509v3.h>
+ #include <openssl/pem.h>
index 7fe7e66..1255d1c 100644 (file)
 HISTORY OF THE SOFTWARE\
 
 \f1\b0 \ulnone \
-Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands as a successor of a language called ABC. Guido remains Python's principal author, although it includes many contributions from others.\
+Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands as a successor of a language called ABC. Guido remains Python's principal author, although it includes many contributions from others.\
 \
-In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software.\
+In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software.\
 \
-In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation, see http://www.zope.org). In 2001, the Python Software Foundation (PSF, see https://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF.\
+In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation, see https://www.zope.dev). In 2001, the Python Software Foundation (PSF, see https://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF.\
 \
-All Python releases are Open Source (see http://www.opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases.\
+All Python releases are Open Source (see https://opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases.\
 \
 
 \f2\b Release         Derived     Year        Owner       GPL-\
index ee85f35..8ee44bf 100644 (file)
@@ -1521,6 +1521,7 @@ TESTSUBDIRS=      ctypes/test \
                test/test_warnings test/test_warnings/data \
                test/test_zoneinfo test/test_zoneinfo/data \
                test/tracedmodules \
+               test/typinganndata \
                test/xmltestdata test/xmltestdata/c14n-20 \
                test/ziptestdata \
                tkinter/test tkinter/test/test_tkinter \
@@ -1897,8 +1898,7 @@ rmtestturds:
        -rm -f gb-18030-2000.xml
 
 docclean:
-       -rm -rf Doc/build
-       -rm -rf Doc/tools/sphinx Doc/tools/pygments Doc/tools/docutils
+       $(MAKE) -C Doc clean
 
 # like the 'clean' target but retain the profile guided optimization (PGO)
 # data.  The PGO data is only valid if source code remains unchanged.
@@ -1942,7 +1942,7 @@ clobber: clean
 # Make things extra clean, before making a distribution:
 # remove all generated files, even Makefile[.pre]
 # Keep configure and Python-ast.[ch], it's possible they can't be generated
-distclean: clobber
+distclean: clobber docclean
        for file in $(srcdir)/Lib/test/data/* ; do \
            if test "$$file" != "$(srcdir)/Lib/test/data/README"; then rm "$$file"; fi; \
        done
index fc1dcaf..a78c086 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1428,6 +1428,7 @@ Ram Rachum
 Jeffrey Rackauckas
 Jérôme Radix
 Burton Radons
+Kirill (python273) R.
 Abhilash Raj
 Shorya Raj
 Dhushyanth Ramasamy
@@ -1966,6 +1967,7 @@ Gordon Worley
 Darren Worrall
 Thomas Wouters
 Daniel Wozniak
+Simon Wrede
 Marcin Niemira
 Wei Wu
 Heiko Wundram
index 32d814c..a7c7315 100644 (file)
@@ -19610,7 +19610,7 @@ durable way.  For example, some people say they're confused by that
 the Open Source Initiative's entry for the Python Software Foundation
 License::
 
-      http://www.opensource.org/licenses/PythonSoftFoundation.php
+      https://opensource.org/licenses/PythonSoftFoundation.php
 
 says "Python 2.1.1" all over it, wondering whether it applies only
 to Python 2.1.1.
index b93e410..4f27bca 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -2,6 +2,202 @@
 Python News
 +++++++++++
 
+What's New in Python 3.10.8 final?
+==================================
+
+*Release date: 2022-10-11*
+
+Security
+--------
+
+- gh-issue-97616: Fix multiplying a list by an integer (``list *= int``):
+  detect the integer overflow when the new allocated length is close to the
+  maximum size. Issue reported by Jordan Limor.  Patch by Victor Stinner.
+
+- gh-issue-97612: Fix a shell code injection vulnerability in the
+  ``get-remote-certificate.py`` example script. The script no longer uses a
+  shell to run ``openssl`` commands. Issue reported and initial fix by Caleb
+  Shortt. Patch by Victor Stinner.
+
+- gh-issue-68966: The deprecated mailcap module now refuses to inject unsafe
+  text (filenames, MIME types, parameters) into shell commands. Instead of
+  using such text, it will warn and act as if a match was not found (or for
+  test commands, as if the test failed).
+
+Core and Builtins
+-----------------
+
+- gh-issue-96078: :func:`os.sched_yield` now release the GIL while calling
+  sched_yield(2). Patch by Dong-hee Na.
+
+- gh-issue-97943: Bugfix: :func:`PyFunction_GetAnnotations` should return a
+  borrowed reference. It was returning a new reference.
+
+- gh-issue-97591: Fixed a missing incref/decref pair in
+  `Exception.__setstate__()`. Patch by Ofey Chan.
+
+- gh-issue-96848: Fix command line parsing: reject :option:`-X
+  int_max_str_digits <-X>` option with no value (invalid) when the
+  :envvar:`PYTHONINTMAXSTRDIGITS` environment variable is set to a valid
+  limit. Patch by Victor Stinner.
+
+- gh-issue-95921: Fix overly-broad source position information for chained
+  comparisons used as branching conditions.
+
+- gh-issue-96821: Fix undefined behaviour in ``_testcapimodule.c``.
+
+- gh-issue-95778: When :exc:`ValueError` is raised if an integer is larger
+  than the limit, mention the :func:`sys.set_int_max_str_digits` function in
+  the error message. Patch by Victor Stinner.
+
+- gh-issue-96387: At Python exit, sometimes a thread holding the GIL can
+  wait forever for a thread (usually a daemon thread) which requested to
+  drop the GIL, whereas the thread already exited. To fix the race
+  condition, the thread which requested the GIL drop now resets its request
+  before exiting. Issue discovered and analyzed by Mingliang ZHAO. Patch by
+  Victor Stinner.
+
+- gh-issue-96864: Fix a possible assertion failure, fatal error, or
+  :exc:`SystemError` if a line tracing event raises an exception while
+  opcode tracing is enabled.
+
+- gh-issue-96678: Fix undefined behaviour in C code of null pointer
+  arithmetic.
+
+- gh-issue-96641: Do not expose ``KeyWrapper`` in :mod:`_functools`.
+
+- gh-issue-96611: When loading a file with invalid UTF-8 inside a multi-line
+  string, a correct SyntaxError is emitted.
+
+- gh-issue-95196: Disable incorrect pickling of the C implemented
+  classmethod descriptors.
+
+- gh-issue-96352: Fix :exc:`AttributeError` missing ``name`` and ``obj``
+  attributes in :meth:`object.__getattribute__`. Patch by Philip Georgi.
+
+- bpo-42316: Document some places where an assignment expression needs
+  parentheses.
+
+Library
+-------
+
+- gh-issue-87730: Wrap network errors consistently in urllib FTP support, so
+  the test suite doesn't fail when a network is available but the public
+  internet is not reachable.
+
+- gh-issue-97825: Fixes :exc:`AttributeError` when
+  :meth:`subprocess.check_output` is used with argument ``input=None`` and
+  either of the arguments *encoding* or *errors* are used.
+
+- gh-issue-96827: Avoid spurious tracebacks from :mod:`asyncio` when default
+  executor cleanup is delayed until after the event loop is closed (e.g. as
+  the result of a keyboard interrupt).
+
+- gh-issue-97592: Avoid a crash in the C version of
+  :meth:`asyncio.Future.remove_done_callback` when an evil argument is
+  passed.
+
+- gh-issue-97639: Remove ``tokenize.NL`` check from :mod:`tabnanny`.
+
+- gh-issue-97545: Make Semaphore run faster.
+
+- gh-issue-73588: Fix generation of the default name of
+  :class:`tkinter.Checkbutton`. Previously, checkbuttons in different parent
+  widgets could have the same short name and share the same state if
+  arguments "name" and "variable" are not specified. Now they are globally
+  unique.
+
+- gh-issue-97005: Update bundled libexpat to 2.4.9
+
+- gh-issue-85760: Fix race condition in :mod:`asyncio` where
+  :meth:`~asyncio.SubprocessProtocol.process_exited` called before the
+  :meth:`~asyncio.SubprocessProtocol.pipe_data_received` leading to
+  inconsistent output. Patch by Kumar Aditya.
+
+- gh-issue-96819: Fixed check in :mod:`multiprocessing.resource_tracker`
+  that guarantees that the length of a write to a pipe is not greater than
+  ``PIPE_BUF``.
+
+- gh-issue-96741: Corrected type annotation for dataclass attribute
+  ``pstats.FunctionProfile.ncalls`` to be ``str``.
+
+- gh-issue-96652: Fix the faulthandler implementation of
+  ``faulthandler.register(signal, chain=True)`` if the ``sigaction()``
+  function is not available: don't call the previous signal handler if it's
+  NULL. Patch by Victor Stinner.
+
+- gh-issue-96073: In :mod:`inspect`, fix overeager replacement of
+  "``typing.``" in formatting annotations.
+
+- gh-issue-90467: Fix :class:`asyncio.streams.StreamReaderProtocol` to keep
+  a strong reference to the created task, so that it's not garbage collected
+
+- gh-issue-96052: Fix handling compiler warnings (SyntaxWarning and
+  DeprecationWarning) in :func:`codeop.compile_command` when checking for
+  incomplete input. Previously it emitted warnings and raised a SyntaxError.
+  Now it always returns ``None`` for incomplete input without emitting any
+  warnings.
+
+- gh-issue-91212: Fixed flickering of the turtle window when the tracer is
+  turned off. Patch by Shin-myoung-serp.
+
+- gh-issue-74116: Allow :meth:`asyncio.StreamWriter.drain` to be awaited
+  concurrently by multiple tasks. Patch by Kumar Aditya.
+
+- gh-issue-90155: Fix broken :class:`asyncio.Semaphore` when acquire is
+  cancelled.
+
+- gh-issue-92986: Fix :func:`ast.unparse` when ``ImportFrom.level`` is None
+
+- gh-issue-91539: Improve performance of
+  ``urllib.request.getproxies_environment`` when there are many environment
+  variables
+
+Documentation
+-------------
+
+- gh-issue-97741: Fix ``!`` in c domain ref target syntax via a ``conf.py``
+  patch, so it works as intended to disable ref target resolution.
+
+- gh-issue-95588: Clarified the conflicting advice given in the :mod:`ast`
+  documentation about :func:`ast.literal_eval` being "safe" for use on
+  untrusted input while at the same time warning that it can crash the
+  process. The latter statement is true and is deemed unfixable without a
+  large amount of work unsuitable for a bugfix. So we keep the warning and
+  no longer claim that ``literal_eval`` is safe.
+
+- gh-issue-93031: Update tutorial introduction output to use 3.10+
+  SyntaxError invalid range.
+
+Build
+-----
+
+- gh-issue-96729: Ensure that Windows releases built with
+  ``Tools\msi\buildrelease.bat`` are upgradable to and from official Python
+  releases.
+
+Windows
+-------
+
+- gh-issue-97728: Fix possible crashes caused by the use of uninitialized
+  variables when pass invalid arguments in :func:`os.system` on Windows and
+  in Windows-specific modules (like ``winreg``).
+
+- gh-issue-90989: Clarify some text in the Windows installer.
+
+- gh-issue-96577: Fixes a potential buffer overrun in :mod:`msilib`.
+
+macOS
+-----
+
+- gh-issue-97897: The macOS 13 SDK includes support for the ``mkfifoat`` and
+  ``mknodat`` system calls. Using the ``dir_fd`` option with either
+  :func:`os.mkfifo` or :func:`os.mknod` could result in a segfault if
+  cpython is built with the macOS 13 SDK but run on an earlier version of
+  macOS. Prevent this by adding runtime support for detection of these
+  system calls ("weaklinking") as is done for other newer syscalls on macOS.
+
+
 What's New in Python 3.10.7 final?
 ==================================
 
@@ -7148,7 +7344,7 @@ Core and Builtins
   ends in the internal subinterpreters module.
 
 - bpo-37986: Improve performance of :c:func:`PyLong_FromDouble` for values
-  that fit into :c:type:`long`.
+  that fit into :c:expr:`long`.
 
 Library
 -------
@@ -9997,7 +10193,7 @@ Library
   AsyncMock.
 
 - bpo-38265: Update the *length* parameter of :func:`os.pread` to accept
-  :c:type:`Py_ssize_t` instead of :c:type:`int`.
+  :c:type:`Py_ssize_t` instead of :c:expr:`int`.
 
 - bpo-38112: :mod:`compileall` has a higher default recursion limit and new
   command-line arguments for path manipulation, symlinks handling, and
@@ -12700,9 +12896,9 @@ C API
 - bpo-36763: Fix memory leak in :c:func:`Py_SetStandardStreamEncoding`:
   release memory if the function is called twice.
 
-- bpo-36641: :c:macro:`PyDoc_VAR(name)` and
-  :c:macro:`PyDoc_STRVAR(name,str)` now create ``static const char name[]``
-  instead of ``static char name[]``.  Patch by Inada Naoki.
+- bpo-36641: :c:expr:`PyDoc_VAR(name)` and :c:expr:`PyDoc_STRVAR(name,str)`
+  now create ``static const char name[]`` instead of ``static char name[]``.
+  Patch by Inada Naoki.
 
 - bpo-36389: Change the value of ``CLEANBYTE``, ``DEADDYTE`` and
   ``FORBIDDENBYTE`` internal constants used by debug hooks on Python memory
@@ -30903,7 +31099,7 @@ Library
   Initial patch by Phil Elson.
 
 - bpo-21932: os.read() now uses a :c:func:`Py_ssize_t` type instead of
-  :c:type:`int` for the size to support reading more than 2 GB at once. On
+  :c:expr:`int` for the size to support reading more than 2 GB at once. On
   Windows, the size is truncated to INT_MAX. As any call to os.read(), the
   OS may read less bytes than the number of requested bytes.
 
index 1f6de21..c627382 100644 (file)
@@ -1042,7 +1042,11 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn)
         return NULL;
     }
 
-    for (i = 0; i < PyList_GET_SIZE(self->fut_callbacks); i++) {
+    // Beware: PyObject_RichCompareBool below may change fut_callbacks.
+    // See GH-97592.
+    for (i = 0;
+         self->fut_callbacks != NULL && i < PyList_GET_SIZE(self->fut_callbacks);
+         i++) {
         int ret;
         PyObject *item = PyList_GET_ITEM(self->fut_callbacks, i);
         Py_INCREF(item);
@@ -1061,7 +1065,8 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn)
         }
     }
 
-    if (j == 0) {
+    // Note: fut_callbacks may have been cleared.
+    if (j == 0 || self->fut_callbacks == NULL) {
         Py_CLEAR(self->fut_callbacks);
         Py_DECREF(newlist);
         return PyLong_FromSsize_t(len + cleared_callback0);
index 72f0791..c991968 100644 (file)
@@ -698,7 +698,7 @@ parse_process_char(ReaderObj *self, _csvstate *module_state, Py_UCS4 c)
             self->state = ESCAPED_CHAR;
         }
         else if (c == ' ' && dialect->skipinitialspace)
-            /* ignore space at start of field */
+            /* ignore spaces at start of field */
             ;
         else if (c == dialect->delimiter) {
             /* save empty field */
@@ -1603,9 +1603,9 @@ PyDoc_STRVAR(csv_module_doc,
 "        quoting character.  It defaults to '\"'.\n"
 "    * delimiter - specifies a one-character string to use as the\n"
 "        field separator.  It defaults to ','.\n"
-"    * skipinitialspace - specifies how to interpret whitespace which\n"
-"        immediately follows a delimiter.  It defaults to False, which\n"
-"        means that whitespace immediately following a delimiter is part\n"
+"    * skipinitialspace - specifies how to interpret spaces which\n"
+"        immediately follow a delimiter.  It defaults to False, which\n"
+"        means that spaces immediately following a delimiter is part\n"
 "        of the following field.\n"
 "    * lineterminator -  specifies the character sequence which should\n"
 "        terminate rows.\n"
index fa14521..6ad0990 100644 (file)
@@ -1470,9 +1470,8 @@ _functools_exec(PyObject *module)
     if (state->keyobject_type == NULL) {
         return -1;
     }
-    if (PyModule_AddType(module, state->keyobject_type) < 0) {
-        return -1;
-    }
+    // keyobject_type is used only internally.
+    // So we don't expose it in module namespace.
 
     state->lru_list_elem_type = (PyTypeObject *)PyType_FromModuleAndSpec(
         module, &lru_list_elem_type_spec, NULL);
index 9f74c99..5c582dd 100644 (file)
@@ -5475,8 +5475,10 @@ meth_fastcall_keywords(PyObject* self, PyObject* const* args,
     if (pyargs == NULL) {
         return NULL;
     }
+    assert(args != NULL || nargs == 0);
+    PyObject* const* args_offset = args == NULL ? NULL : args + nargs;
     PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
-                                              args + nargs, 0, kwargs);
+                                              args_offset, 0, kwargs);
     return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
 }
 
index ac73789..f568357 100644 (file)
@@ -192,7 +192,7 @@ _winapi_CreateFileMapping(PyObject *module, PyObject *const *args, Py_ssize_t na
     DWORD protect;
     DWORD max_size_high;
     DWORD max_size_low;
-    LPCWSTR name;
+    LPCWSTR name = NULL;
     HANDLE _return_value;
 
     if (!_PyArg_ParseStack(args, nargs, "" F_HANDLE "" F_POINTER "kkkO&:CreateFileMapping",
@@ -233,8 +233,8 @@ static PyObject *
 _winapi_CreateJunction(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
-    LPCWSTR src_path;
-    LPCWSTR dst_path;
+    LPCWSTR src_path = NULL;
+    LPCWSTR dst_path = NULL;
 
     if (!_PyArg_CheckPositional("CreateJunction", nargs, 2, 2)) {
         goto exit;
@@ -394,14 +394,14 @@ static PyObject *
 _winapi_CreateProcess(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *application_name;
+    const Py_UNICODE *application_name = NULL;
     PyObject *command_line;
     PyObject *proc_attrs;
     PyObject *thread_attrs;
     BOOL inherit_handles;
     DWORD creation_flags;
     PyObject *env_mapping;
-    const Py_UNICODE *current_directory;
+    const Py_UNICODE *current_directory = NULL;
     PyObject *startup_info;
 
     if (!_PyArg_ParseStack(args, nargs, "O&OOOikOO&O:CreateProcess",
@@ -749,7 +749,7 @@ _winapi_OpenFileMapping(PyObject *module, PyObject *const *args, Py_ssize_t narg
     PyObject *return_value = NULL;
     DWORD desired_access;
     BOOL inherit_handle;
-    LPCWSTR name;
+    LPCWSTR name = NULL;
     HANDLE _return_value;
 
     if (!_PyArg_ParseStack(args, nargs, "kiO&:OpenFileMapping",
@@ -1216,4 +1216,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=8e13179bf25bdea5 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d76d0a5901db2e2a input=a9049054013a1b77]*/
index efecd90..43e14a9 100644 (file)
@@ -220,7 +220,7 @@ _overlapped_CreateEvent(PyObject *module, PyObject *const *args, Py_ssize_t narg
     PyObject *EventAttributes;
     BOOL ManualReset;
     BOOL InitialState;
-    const Py_UNICODE *Name;
+    const Py_UNICODE *Name = NULL;
 
     if (!_PyArg_ParseStack(args, nargs, "OiiO&:CreateEvent",
         &EventAttributes, &ManualReset, &InitialState, _PyUnicode_WideCharString_Opt_Converter, &Name)) {
@@ -786,7 +786,7 @@ static PyObject *
 _overlapped_Overlapped_ConnectPipe(OverlappedObject *self, PyObject *arg)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *Address;
+    const Py_UNICODE *Address = NULL;
 
     if (!PyUnicode_Check(arg)) {
         _PyArg_BadArgument("ConnectPipe", "argument", "str", arg);
@@ -905,4 +905,4 @@ _overlapped_Overlapped_WSARecvFrom(OverlappedObject *self, PyObject *const *args
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=ee2ec2f93c8d334b input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d3215a6ca589735a input=a9049054013a1b77]*/
index a3d0632..da190b8 100644 (file)
@@ -1328,7 +1328,8 @@ PyDoc_STRVAR(os_mkdir__doc__,
 "dir_fd may not be implemented on your platform.\n"
 "  If it is unavailable, using it will raise a NotImplementedError.\n"
 "\n"
-"The mode argument is ignored on Windows.");
+"The mode argument is ignored on Windows. Where it is used, the current umask\n"
+"value is first masked out.");
 
 #define OS_MKDIR_METHODDEF    \
     {"mkdir", (PyCFunction)(void(*)(void))os_mkdir, METH_FASTCALL|METH_KEYWORDS, os_mkdir__doc__},
@@ -1717,7 +1718,7 @@ os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k
     static const char * const _keywords[] = {"command", NULL};
     static _PyArg_Parser _parser = {NULL, _keywords, "system", 0};
     PyObject *argsbuf[1];
-    const Py_UNICODE *command;
+    const Py_UNICODE *command = NULL;
     long _return_value;
 
     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
@@ -9291,4 +9292,4 @@ exit:
 #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF
     #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF
 #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */
-/*[clinic end generated code: output=73be33fa0000a6d1 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=f8cdbd04ea0e3502 input=a9049054013a1b77]*/
index 3c0142e..ce9e593 100644 (file)
@@ -1,5 +1,5 @@
 Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
-Copyright (c) 2001-2019 Expat maintainers
+Copyright (c) 2001-2022 Expat maintainers
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
index c9214f6..2b47ce2 100644 (file)
@@ -1055,7 +1055,7 @@ XML_SetBillionLaughsAttackProtectionActivationThreshold(
 */
 #define XML_MAJOR_VERSION 2
 #define XML_MINOR_VERSION 4
-#define XML_MICRO_VERSION 7
+#define XML_MICRO_VERSION 9
 
 #ifdef __cplusplus
 }
index 444eba0..e09f533 100644 (file)
@@ -28,7 +28,7 @@
    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
    Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
    Copyright (c) 2003      Greg Stein <gstein@users.sourceforge.net>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
    Copyright (c) 2018      Yury Gribov <tetra2005@gmail.com>
    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
    Licensed under the MIT license:
 
 #include <limits.h> // ULONG_MAX
 
-#if defined(_WIN32) && ! defined(__USE_MINGW_ANSI_STDIO)
+#if defined(_WIN32)                                                            \
+    && (! defined(__USE_MINGW_ANSI_STDIO)                                      \
+        || (1 - __USE_MINGW_ANSI_STDIO - 1 == 0))
 #  define EXPAT_FMT_ULL(midpart) "%" midpart "I64u"
 #  if defined(_WIN64) // Note: modifiers "td" and "zu" do not work for MinGW
 #    define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "I64d"
index e5406d7..303283a 100644 (file)
  * if this code is included and compiled as C++; related GCC warning is:
  * warning: use of C++11 long long integer constant [-Wlong-long]
  */
-#define _SIP_ULL(high, low) (((uint64_t)high << 32) | low)
+#define _SIP_ULL(high, low) ((((uint64_t)high) << 32) | (low))
 
 #define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
 
index 05216d9..c0bece5 100644 (file)
@@ -1,4 +1,4 @@
-/* fcb1a62fefa945567301146eb98e3ad3413e823a41c4378e84e8b6b6f308d824 (2.4.7+)
+/* 90815a2b2c80c03b2b889fe1d427bb2b9e3282aa065e42784e001db4f23de324 (2.4.9+)
                             __  __            _
                          ___\ \/ /_ __   __ _| |_
                         / _ \\  /| '_ \ / _` | __|
@@ -19,7 +19,7 @@
    Copyright (c) 2016      Gustavo Grieco <gustavo.grieco@imag.fr>
    Copyright (c) 2016      Pascal Cuoq <cuoq@trust-in-soft.com>
    Copyright (c) 2016      Ed Schouten <ed@nuxi.nl>
-   Copyright (c) 2017-2018 Rhodri James <rhodri@wildebeest.org.uk>
+   Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
    Copyright (c) 2017      Václav Slavík <vaclav@slavik.io>
    Copyright (c) 2017      Viktor Szakats <commit@vsz.me>
    Copyright (c) 2017      Chanho Park <chanho61.park@samsung.com>
@@ -4271,7 +4271,7 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s,
   const XML_Char *storedEncName = NULL;
   const ENCODING *newEncoding = NULL;
   const char *version = NULL;
-  const char *versionend;
+  const char *versionend = NULL;
   const XML_Char *storedversion = NULL;
   int standalone = -1;
 
@@ -5826,10 +5826,15 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end,
   {
     parser->m_processor = contentProcessor;
     /* see externalEntityContentProcessor vs contentProcessor */
-    return doContent(parser, parser->m_parentParser ? 1 : 0, parser->m_encoding,
-                     s, end, nextPtr,
-                     (XML_Bool)! parser->m_parsingStatus.finalBuffer,
-                     XML_ACCOUNT_DIRECT);
+    result = doContent(parser, parser->m_parentParser ? 1 : 0,
+                       parser->m_encoding, s, end, nextPtr,
+                       (XML_Bool)! parser->m_parsingStatus.finalBuffer,
+                       XML_ACCOUNT_DIRECT);
+    if (result == XML_ERROR_NONE) {
+      if (! storeRawNames(parser))
+        return XML_ERROR_NO_MEMORY;
+    }
+    return result;
   }
 }
 
index c659983..2b7012a 100644 (file)
@@ -21,6 +21,7 @@
    Copyright (c) 2017      José Gutiérrez de la Concha <jose@zeroc.com>
    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
    Copyright (c) 2021      Dong-hee Na <donghee.na@python.org>
+   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
@@ -296,7 +297,7 @@ sb_charMatches(const ENCODING *enc, const char *p, int c) {
 }
 #else
 /* c is an ASCII character */
-#  define CHAR_MATCHES(enc, p, c) (*(p) == c)
+#  define CHAR_MATCHES(enc, p, c) (*(p) == (c))
 #endif
 
 #define PREFIX(ident) normal_##ident
@@ -740,7 +741,7 @@ DEFINE_UTF16_TO_UTF16(big2_)
   ((p)[1] == 0 ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]  \
                : unicode_byte_type((p)[1], (p)[0]))
 #define LITTLE2_BYTE_TO_ASCII(p) ((p)[1] == 0 ? (p)[0] : -1)
-#define LITTLE2_CHAR_MATCHES(p, c) ((p)[1] == 0 && (p)[0] == c)
+#define LITTLE2_CHAR_MATCHES(p, c) ((p)[1] == 0 && (p)[0] == (c))
 #define LITTLE2_IS_NAME_CHAR_MINBPC(p)                                         \
   UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0])
 #define LITTLE2_IS_NMSTRT_CHAR_MINBPC(p)                                       \
@@ -875,7 +876,7 @@ static const struct normal_encoding internal_little2_encoding
        ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]]        \
        : unicode_byte_type((p)[0], (p)[1]))
 #define BIG2_BYTE_TO_ASCII(p) ((p)[0] == 0 ? (p)[1] : -1)
-#define BIG2_CHAR_MATCHES(p, c) ((p)[0] == 0 && (p)[1] == c)
+#define BIG2_CHAR_MATCHES(p, c) ((p)[0] == 0 && (p)[1] == (c))
 #define BIG2_IS_NAME_CHAR_MINBPC(p)                                            \
   UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1])
 #define BIG2_IS_NMSTRT_CHAR_MINBPC(p)                                          \
index 4072b06..1971d74 100644 (file)
@@ -16,6 +16,7 @@
    Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
    Copyright (c) 2020      Boris Kolpackov <boris@codesynthesis.com>
+   Copyright (c) 2022      Martin Ettl <ettl.martin78@googlemail.com>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
@@ -96,7 +97,7 @@
 
 #  define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr)                      \
   case BT_LEAD##n:                                                             \
-    if (end - ptr < n)                                                         \
+    if ((end) - (ptr) < (n))                                                   \
       return XML_TOK_PARTIAL_CHAR;                                             \
     if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
       *nextTokPtr = ptr;                                                       \
 #    define PREFIX(ident) ident
 #  endif
 
-#  define HAS_CHARS(enc, ptr, end, count) (end - ptr >= count * MINBPC(enc))
+#  define HAS_CHARS(enc, ptr, end, count)                                      \
+    ((end) - (ptr) >= ((count)*MINBPC(enc)))
 
 #  define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
 
index 4af8702..3ae6269 100644 (file)
@@ -877,7 +877,7 @@ faulthandler_user(int signum)
         errno = save_errno;
     }
 #else
-    if (user->chain) {
+    if (user->chain && user->previous != NULL) {
         errno = save_errno;
         /* call the previous signal handler */
         user->previous(signum);
index 3d74b22..f92e2ae 100644 (file)
@@ -85,6 +85,8 @@
 #  define HAVE_FUTIMENS_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
 #  define HAVE_UTIMENSAT_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
 #  define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
+#  define HAVE_MKFIFOAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
+#  define HAVE_MKNODAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
 
 #  define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *)
 
 #  define HAVE_FUTIMENS_RUNTIME 1
 #  define HAVE_UTIMENSAT_RUNTIME 1
 #  define HAVE_PWRITEV_RUNTIME 1
+#  define HAVE_MKFIFOAT_RUNTIME 1
+#  define HAVE_MKNODAT_RUNTIME 1
 #endif
 
 
@@ -4490,12 +4494,13 @@ If dir_fd is not None, it should be a file descriptor open to a directory,
 dir_fd may not be implemented on your platform.
   If it is unavailable, using it will raise a NotImplementedError.
 
-The mode argument is ignored on Windows.
+The mode argument is ignored on Windows. Where it is used, the current umask
+value is first masked out.
 [clinic start generated code]*/
 
 static PyObject *
 os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd)
-/*[clinic end generated code: output=a70446903abe821f input=e965f68377e9b1ce]*/
+/*[clinic end generated code: output=a70446903abe821f input=a61722e1576fab03]*/
 {
     int result;
 #ifdef HAVE_MKDIRAT
@@ -7024,8 +7029,13 @@ static PyObject *
 os_sched_yield_impl(PyObject *module)
 /*[clinic end generated code: output=902323500f222cac input=e54d6f98189391d4]*/
 {
-    if (sched_yield())
+    int result;
+    Py_BEGIN_ALLOW_THREADS
+    result = sched_yield();
+    Py_END_ALLOW_THREADS
+    if (result < 0) {
         return posix_error();
+    }
     Py_RETURN_NONE;
 }
 
@@ -10554,18 +10564,35 @@ os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd)
 {
     int result;
     int async_err = 0;
+#ifdef HAVE_MKFIFOAT
+    int mkfifoat_unavailable = 0;
+#endif
 
     do {
         Py_BEGIN_ALLOW_THREADS
 #ifdef HAVE_MKFIFOAT
-        if (dir_fd != DEFAULT_DIR_FD)
-            result = mkfifoat(dir_fd, path->narrow, mode);
-        else
+        if (dir_fd != DEFAULT_DIR_FD) {
+            if (HAVE_MKFIFOAT_RUNTIME) {
+                result = mkfifoat(dir_fd, path->narrow, mode);
+
+            } else {
+                mkfifoat_unavailable = 1;
+                result = 0;
+            }
+        } else
 #endif
             result = mkfifo(path->narrow, mode);
         Py_END_ALLOW_THREADS
     } while (result != 0 && errno == EINTR &&
              !(async_err = PyErr_CheckSignals()));
+
+#ifdef HAVE_MKFIFOAT
+    if (mkfifoat_unavailable) {
+        argument_unavailable_error(NULL, "dir_fd");
+        return NULL;
+    }
+#endif
+
     if (result != 0)
         return (!async_err) ? posix_error() : NULL;
 
@@ -10606,18 +10633,33 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
 {
     int result;
     int async_err = 0;
+#ifdef HAVE_MKNODAT
+    int mknodat_unavailable = 0;
+#endif
 
     do {
         Py_BEGIN_ALLOW_THREADS
 #ifdef HAVE_MKNODAT
-        if (dir_fd != DEFAULT_DIR_FD)
-            result = mknodat(dir_fd, path->narrow, mode, device);
-        else
+        if (dir_fd != DEFAULT_DIR_FD) {
+            if (HAVE_MKNODAT_RUNTIME) {
+                result = mknodat(dir_fd, path->narrow, mode, device);
+
+            } else {
+                mknodat_unavailable = 1;
+                result = 0;
+            }
+        } else
 #endif
             result = mknod(path->narrow, mode, device);
         Py_END_ALLOW_THREADS
     } while (result != 0 && errno == EINTR &&
              !(async_err = PyErr_CheckSignals()));
+#ifdef HAVE_MKNODAT
+    if (mknodat_unavailable) {
+        argument_unavailable_error(NULL, "dir_fd");
+        return NULL;
+    }
+#endif
     if (result != 0)
         return (!async_err) ? posix_error() : NULL;
 
@@ -15466,6 +15508,14 @@ PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME)
 PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME)
 #endif
 
+#ifdef HAVE_MKFIFOAT
+PROBE(probe_mkfifoat, HAVE_MKFIFOAT_RUNTIME)
+#endif
+
+#ifdef HAVE_MKNODAT
+PROBE(probe_mknodat, HAVE_MKNODAT_RUNTIME)
+#endif
+
 #ifdef HAVE_RENAMEAT
 PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME)
 #endif
@@ -15599,11 +15649,11 @@ static const struct have_function {
 #endif
 
 #ifdef HAVE_MKFIFOAT
-    { "HAVE_MKFIFOAT", NULL },
+    { "HAVE_MKFIFOAT", probe_mkfifoat },
 #endif
 
 #ifdef HAVE_MKNODAT
-    { "HAVE_MKNODAT", NULL },
+    { "HAVE_MKNODAT", probe_mknodat },
 #endif
 
 #ifdef HAVE_OPENAT
index 729986a..bfa2ca2 100644 (file)
@@ -235,7 +235,7 @@ syslog_setlogmask(PyObject *self, PyObject *args)
 
     if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
         return NULL;
-    if (PySys_Audit("syslog.setlogmask", "(O)", args ? args : Py_None) < 0) {
+    if (PySys_Audit("syslog.setlogmask", "l", maskpri) < 0) {
         return NULL;
     }
     omaskpri = setlogmask(maskpri);
index 09b0f82..ee3ad1b 100644 (file)
@@ -755,7 +755,7 @@ PyTypeObject PyClassMethodDescr_Type = {
     0,                                          /* tp_weaklistoffset */
     0,                                          /* tp_iter */
     0,                                          /* tp_iternext */
-    descr_methods,                              /* tp_methods */
+    0,                                          /* tp_methods */
     descr_members,                              /* tp_members */
     method_getset,                              /* tp_getset */
     0,                                          /* tp_base */
index 9639b44..5dfd1d6 100644 (file)
@@ -156,8 +156,14 @@ BaseException_setstate(PyObject *self, PyObject *state)
             return NULL;
         }
         while (PyDict_Next(state, &i, &d_key, &d_value)) {
-            if (PyObject_SetAttr(self, d_key, d_value) < 0)
+            Py_INCREF(d_key);
+            Py_INCREF(d_value);
+            int res = PyObject_SetAttr(self, d_key, d_value);
+            Py_DECREF(d_value);
+            Py_DECREF(d_key);
+            if (res < 0) {
                 return NULL;
+            }
         }
     }
     Py_RETURN_NONE;
index 801478a..eaf7333 100644 (file)
@@ -247,7 +247,6 @@ func_get_annotation_dict(PyFunctionObject *op)
         }
         Py_SETREF(op->func_annotations, ann_dict);
     }
-    Py_INCREF(op->func_annotations);
     assert(PyDict_Check(op->func_annotations));
     return op->func_annotations;
 }
@@ -474,7 +473,11 @@ func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored))
         if (op->func_annotations == NULL)
             return NULL;
     }
-    return func_get_annotation_dict(op);
+    PyObject *d = func_get_annotation_dict(op);
+    if (d) {
+        Py_INCREF(d);
+    }
+    return d;
 }
 
 static int
index 329fd1f..484d374 100644 (file)
@@ -77,8 +77,14 @@ list_resize(PyListObject *self, Py_ssize_t newsize)
 
     if (newsize == 0)
         new_allocated = 0;
-    num_allocated_bytes = new_allocated * sizeof(PyObject *);
-    items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);
+    if (new_allocated <= (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
+        num_allocated_bytes = new_allocated * sizeof(PyObject *);
+        items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);
+    }
+    else {
+        // integer overflow
+        items = NULL;
+    }
     if (items == NULL) {
         PyErr_NoMemory();
         return -1;
index aea5edc..fe4395a 100644 (file)
@@ -36,8 +36,8 @@ _Py_IDENTIFIER(big);
 #define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS)
 #define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS)
 
-#define _MAX_STR_DIGITS_ERROR_FMT_TO_INT "Exceeds the limit (%d) for integer string conversion: value has %zd digits"
-#define _MAX_STR_DIGITS_ERROR_FMT_TO_STR "Exceeds the limit (%d) for integer string conversion"
+#define _MAX_STR_DIGITS_ERROR_FMT_TO_INT "Exceeds the limit (%d) for integer string conversion: value has %zd digits; use sys.set_int_max_str_digits() to increase the limit"
+#define _MAX_STR_DIGITS_ERROR_FMT_TO_STR "Exceeds the limit (%d) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit"
 
 static PyObject *
 get_small_int(sdigit ival)
index 47c352e..6d80d6d 100644 (file)
@@ -1319,6 +1319,8 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
         PyErr_Format(PyExc_AttributeError,
                      "'%.50s' object has no attribute '%U'",
                      tp->tp_name, name);
+
+        set_attribute_error_context(obj, name);
     }
   done:
     Py_XDECREF(descr);
index 01516e8..3d4e4ef 100644 (file)
--- a/PC/_msi.c
+++ b/PC/_msi.c
@@ -360,7 +360,7 @@ msierror(int status)
     int code;
     char buf[2000];
     char *res = buf;
-    DWORD size = sizeof(buf);
+    DWORD size = Py_ARRAY_LENGTH(buf);
     MSIHANDLE err = MsiGetLastErrorRecord();
 
     if (err == 0) {
@@ -484,7 +484,7 @@ _msi_Record_GetString_impl(msiobj *self, unsigned int field)
     unsigned int status;
     WCHAR buf[2000];
     WCHAR *res = buf;
-    DWORD size = sizeof(buf);
+    DWORD size = Py_ARRAY_LENGTH(buf);
     PyObject* string;
 
     status = MsiRecordGetStringW(self->h, field, res, &size);
index 85c4d22..4b82a1b 100644 (file)
@@ -195,7 +195,7 @@ _msi_Record_SetString(msiobj *self, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     int field;
-    const Py_UNICODE *value;
+    const Py_UNICODE *value = NULL;
 
     if (!_PyArg_CheckPositional("SetString", nargs, 2, 2)) {
         goto exit;
@@ -244,7 +244,7 @@ _msi_Record_SetStream(msiobj *self, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     int field;
-    const Py_UNICODE *value;
+    const Py_UNICODE *value = NULL;
 
     if (!_PyArg_CheckPositional("SetStream", nargs, 2, 2)) {
         goto exit;
@@ -555,7 +555,7 @@ static PyObject *
 _msi_Database_OpenView(msiobj *self, PyObject *arg)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *sql;
+    const Py_UNICODE *sql = NULL;
 
     if (!PyUnicode_Check(arg)) {
         _PyArg_BadArgument("OpenView", "argument", "str", arg);
@@ -650,7 +650,7 @@ static PyObject *
 _msi_OpenDatabase(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *path;
+    const Py_UNICODE *path = NULL;
     int persist;
 
     if (!_PyArg_CheckPositional("OpenDatabase", nargs, 2, 2)) {
@@ -713,4 +713,4 @@ _msi_CreateRecord(PyObject *module, PyObject *arg)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=49debf733ee5cab2 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=19b24ee4e6420dcd input=a9049054013a1b77]*/
index 3051bcc..91f27f2 100644 (file)
@@ -148,7 +148,7 @@ static PyObject *
 winreg_ConnectRegistry(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *computer_name;
+    const Py_UNICODE *computer_name = NULL;
     HKEY key;
     HKEY _return_value;
 
@@ -220,7 +220,7 @@ winreg_CreateKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
     HKEY _return_value;
 
     if (!_PyArg_CheckPositional("CreateKey", nargs, 2, 2)) {
@@ -301,7 +301,7 @@ winreg_CreateKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py
     static const char * const _keywords[] = {"key", "sub_key", "reserved", "access", NULL};
     static _PyArg_Parser _parser = {"O&O&|ii:CreateKeyEx", _keywords, 0};
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
     int reserved = 0;
     REGSAM access = KEY_WRITE;
     HKEY _return_value;
@@ -354,7 +354,7 @@ winreg_DeleteKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
 
     if (!_PyArg_CheckPositional("DeleteKey", nargs, 2, 2)) {
         goto exit;
@@ -428,7 +428,7 @@ winreg_DeleteKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py
     static const char * const _keywords[] = {"key", "sub_key", "access", "reserved", NULL};
     static _PyArg_Parser _parser = {"O&O&|ii:DeleteKeyEx", _keywords, 0};
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
     REGSAM access = KEY_WOW64_64KEY;
     int reserved = 0;
 
@@ -469,7 +469,7 @@ winreg_DeleteValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *value;
+    const Py_UNICODE *value = NULL;
 
     if (!_PyArg_CheckPositional("DeleteValue", nargs, 2, 2)) {
         goto exit;
@@ -619,7 +619,7 @@ static PyObject *
 winreg_ExpandEnvironmentStrings(PyObject *module, PyObject *arg)
 {
     PyObject *return_value = NULL;
-    const Py_UNICODE *string;
+    const Py_UNICODE *string = NULL;
 
     if (!PyUnicode_Check(arg)) {
         _PyArg_BadArgument("ExpandEnvironmentStrings", "argument", "str", arg);
@@ -724,8 +724,8 @@ winreg_LoadKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *sub_key;
-    const Py_UNICODE *file_name;
+    const Py_UNICODE *sub_key = NULL;
+    const Py_UNICODE *file_name = NULL;
 
     if (!_PyArg_CheckPositional("LoadKey", nargs, 3, 3)) {
         goto exit;
@@ -805,7 +805,7 @@ winreg_OpenKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje
     static const char * const _keywords[] = {"key", "sub_key", "reserved", "access", NULL};
     static _PyArg_Parser _parser = {"O&O&|ii:OpenKey", _keywords, 0};
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
     int reserved = 0;
     REGSAM access = KEY_READ;
     HKEY _return_value;
@@ -862,7 +862,7 @@ winreg_OpenKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb
     static const char * const _keywords[] = {"key", "sub_key", "reserved", "access", NULL};
     static _PyArg_Parser _parser = {"O&O&|ii:OpenKeyEx", _keywords, 0};
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
     int reserved = 0;
     REGSAM access = KEY_READ;
     HKEY _return_value;
@@ -953,7 +953,7 @@ winreg_QueryValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
 
     if (!_PyArg_CheckPositional("QueryValue", nargs, 2, 2)) {
         goto exit;
@@ -1016,7 +1016,7 @@ winreg_QueryValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *name;
+    const Py_UNICODE *name = NULL;
 
     if (!_PyArg_CheckPositional("QueryValueEx", nargs, 2, 2)) {
         goto exit;
@@ -1084,7 +1084,7 @@ winreg_SaveKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *file_name;
+    const Py_UNICODE *file_name = NULL;
 
     if (!_PyArg_CheckPositional("SaveKey", nargs, 2, 2)) {
         goto exit;
@@ -1153,7 +1153,7 @@ winreg_SetValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *sub_key;
+    const Py_UNICODE *sub_key = NULL;
     DWORD type;
     PyObject *value_obj;
 
@@ -1228,7 +1228,7 @@ winreg_SetValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     HKEY key;
-    const Py_UNICODE *value_name;
+    const Py_UNICODE *value_name = NULL;
     PyObject *reserved;
     DWORD type;
     PyObject *value;
@@ -1349,4 +1349,4 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=8ce6fb3b6cd46242 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=1c96481d6be5c0d8 input=a9049054013a1b77]*/
index 579474c..0bbf1b1 100644 (file)
@@ -1530,7 +1530,7 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end)
     } while (c == ' ' || c == '\t' || c == '\014');
 
     /* Set start of current token */
-    tok->start = tok->cur - 1;
+    tok->start = tok->cur == NULL ? NULL : tok->cur - 1;
 
     /* Skip comment, unless it's a type comment */
     if (c == '#') {
@@ -1965,6 +1965,8 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end)
         /* Get rest of string */
         while (end_quote_size != quote_size) {
             c = tok_nextc(tok);
+            if (tok->done == E_DECODE)
+                break;
             if (c == EOF || (quote_size == 1 && c == '\n')) {
                 assert(tok->multi_line_start != NULL);
                 // shift the tok_state's location into
index df4b9a8..9719177 100644 (file)
@@ -5512,7 +5512,7 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
         }
     }
     /* Always emit an opcode event if we're tracing all opcodes. */
-    if (frame->f_trace_opcodes) {
+    if (frame->f_trace_opcodes && result == 0) {
         result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
     }
     return result;
index 9b8b432..824897e 100644 (file)
@@ -247,6 +247,7 @@ take_gil(PyThreadState *tstate)
         goto _ready;
     }
 
+    int drop_requested = 0;
     while (_Py_atomic_load_relaxed(&gil->locked)) {
         unsigned long saved_switchnum = gil->switch_number;
 
@@ -262,11 +263,21 @@ take_gil(PyThreadState *tstate)
         {
             if (tstate_must_exit(tstate)) {
                 MUTEX_UNLOCK(gil->mutex);
+                // gh-96387: If the loop requested a drop request in a previous
+                // iteration, reset the request. Otherwise, drop_gil() can
+                // block forever waiting for the thread which exited. Drop
+                // requests made by other threads are also reset: these threads
+                // may have to request again a drop request (iterate one more
+                // time).
+                if (drop_requested) {
+                    RESET_GIL_DROP_REQUEST(interp);
+                }
                 PyThread_exit_thread();
             }
             assert(is_tstate_valid(tstate));
 
             SET_GIL_DROP_REQUEST(interp);
+            drop_requested = 1;
         }
     }
 
index 40d1761..e5438f7 100644 (file)
@@ -2691,6 +2691,7 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
         return 1;
     }
     case Compare_kind: {
+        SET_LOC(c, e);
         Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
         if (n > 0) {
             if (!check_compare(c, e)) {
index dd1a9f1..9bfe08e 100644 (file)
@@ -1664,222 +1664,222 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
     0,0,0,114,231,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,5,0,0,0,114,5,0,0,0,114,6,0,0,
-    0,114,234,0,0,0,29,4,0,0,115,56,0,0,0,8,
+    0,114,234,0,0,0,29,4,0,0,115,54,0,0,0,8,
     10,10,1,4,1,12,1,4,2,10,1,8,1,8,255,8,
     2,14,1,10,1,2,1,6,255,2,128,10,2,14,1,2,
-    1,14,1,14,1,10,4,16,1,2,255,12,2,2,1,8,
-    128,2,249,2,252,4,12,114,234,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,41,124,2,100,3,117,1,114,39,124,1,
-    124,2,106,1,107,3,114,39,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,48,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,71,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,158,0,0,0,114,113,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,9,0,0,0,
-    114,154,0,0,0,114,141,0,0,0,114,25,0,0,0,41,
-    6,114,38,0,0,0,114,143,0,0,0,114,101,0,0,0,
-    114,102,0,0,0,114,169,0,0,0,114,142,0,0,0,41,
-    3,218,7,103,108,111,98,97,108,115,114,209,0,0,0,114,
-    109,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,
-    0,0,0,218,17,95,99,97,108,99,95,95,95,112,97,99,
-    107,97,103,101,95,95,66,4,0,0,115,42,0,0,0,10,
-    7,10,1,8,1,18,1,6,1,2,1,4,255,4,1,6,
-    255,4,2,6,254,4,3,8,1,6,1,6,2,4,2,6,
-    254,8,3,8,1,14,1,4,1,114,240,0,0,0,114,5,
-    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,174,0,0,
-    0,124,4,100,1,107,2,114,9,116,0,124,0,131,1,125,
-    5,110,18,124,1,100,2,117,1,114,15,124,1,110,1,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,74,124,4,100,1,107,
-    2,114,42,116,0,124,0,160,2,100,3,161,1,100,1,25,
-    0,131,1,83,0,124,0,115,46,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,116,7,124,5,100,4,131,2,114,85,116,
-    8,124,5,124,3,116,0,131,3,83,0,124,5,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,25,0,
-    0,0,78,114,141,0,0,0,114,154,0,0,0,41,9,114,
-    229,0,0,0,114,240,0,0,0,218,9,112,97,114,116,105,
-    116,105,111,110,114,208,0,0,0,114,18,0,0,0,114,105,
-    0,0,0,114,9,0,0,0,114,11,0,0,0,114,234,0,
-    0,0,41,9,114,20,0,0,0,114,239,0,0,0,218,6,
-    108,111,99,97,108,115,114,235,0,0,0,114,210,0,0,0,
-    114,110,0,0,0,90,8,103,108,111,98,97,108,115,95,114,
-    209,0,0,0,90,7,99,117,116,95,111,102,102,114,5,0,
-    0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,95,
-    105,109,112,111,114,116,95,95,93,4,0,0,115,30,0,0,
-    0,8,11,10,1,16,2,8,1,12,1,4,1,8,3,18,
-    1,4,1,4,1,26,4,30,3,10,1,12,1,4,2,114,
-    243,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,15,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,175,0,0,0,114,183,0,
-    0,0,114,87,0,0,0,114,173,0,0,0,41,2,114,20,
-    0,0,0,114,109,0,0,0,114,5,0,0,0,114,5,0,
-    0,0,114,6,0,0,0,218,18,95,98,117,105,108,116,105,
-    110,95,102,114,111,109,95,110,97,109,101,130,4,0,0,115,
-    8,0,0,0,10,1,8,1,12,1,8,1,114,244,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,36,92,2,125,3,125,
-    4,116,5,124,4,124,2,131,2,114,49,124,3,116,1,106,
-    6,118,0,114,30,116,7,125,5,110,9,116,0,160,8,124,
-    3,161,1,114,38,116,9,125,5,110,1,113,13,116,10,124,
-    4,124,5,131,2,125,6,116,11,124,6,124,4,131,2,1,
-    0,113,13,116,1,106,3,116,12,25,0,125,7,100,1,68,
-    0,93,23,125,8,124,8,116,1,106,3,118,1,114,69,116,
-    13,124,8,131,1,125,9,110,5,116,1,106,3,124,8,25,
-    0,125,9,116,14,124,7,124,8,124,9,131,3,1,0,113,
-    57,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,26,0,0,0,114,101,0,0,0,114,
-    71,0,0,0,78,41,15,114,64,0,0,0,114,18,0,0,
-    0,114,3,0,0,0,114,105,0,0,0,218,5,105,116,101,
-    109,115,114,216,0,0,0,114,86,0,0,0,114,175,0,0,
-    0,114,98,0,0,0,114,193,0,0,0,114,155,0,0,0,
-    114,161,0,0,0,114,9,0,0,0,114,244,0,0,0,114,
-    12,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,20,0,0,
-    0,114,110,0,0,0,114,122,0,0,0,114,109,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,5,0,0,0,
-    114,5,0,0,0,114,6,0,0,0,218,6,95,115,101,116,
-    117,112,137,4,0,0,115,40,0,0,0,4,9,4,1,8,
-    3,18,1,10,1,10,1,6,1,10,1,6,1,2,2,10,
-    1,10,1,2,128,10,3,8,1,10,1,10,1,10,2,14,
-    1,4,251,114,248,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,248,0,0,0,114,18,0,0,0,114,214,0,
-    0,0,114,132,0,0,0,114,175,0,0,0,114,193,0,0,
-    0,41,2,114,246,0,0,0,114,247,0,0,0,114,5,0,
-    0,0,114,5,0,0,0,114,6,0,0,0,218,8,95,105,
-    110,115,116,97,108,108,172,4,0,0,115,6,0,0,0,10,
-    2,12,2,16,1,114,249,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,25,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,139,0,0,0,114,249,
-    0,0,0,114,18,0,0,0,114,105,0,0,0,114,9,0,
-    0,0,41,1,114,250,0,0,0,114,5,0,0,0,114,5,
-    0,0,0,114,6,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,180,4,0,0,115,6,0,0,0,8,3,
-    4,1,20,1,114,251,0,0,0,114,190,0,0,0,114,0,
-    0,0,0,114,24,0,0,0,41,4,78,78,114,5,0,0,
-    0,114,25,0,0,0,41,54,114,10,0,0,0,114,7,0,
-    0,0,114,26,0,0,0,114,101,0,0,0,114,71,0,0,
-    0,114,139,0,0,0,114,17,0,0,0,114,21,0,0,0,
-    114,66,0,0,0,114,37,0,0,0,114,47,0,0,0,114,
-    22,0,0,0,114,23,0,0,0,114,55,0,0,0,114,57,
-    0,0,0,114,60,0,0,0,114,72,0,0,0,114,74,0,
-    0,0,114,83,0,0,0,114,95,0,0,0,114,100,0,0,
-    0,114,111,0,0,0,114,124,0,0,0,114,125,0,0,0,
-    114,104,0,0,0,114,155,0,0,0,114,161,0,0,0,114,
-    165,0,0,0,114,119,0,0,0,114,106,0,0,0,114,172,
-    0,0,0,114,173,0,0,0,114,107,0,0,0,114,175,0,
-    0,0,114,193,0,0,0,114,200,0,0,0,114,211,0,0,
-    0,114,213,0,0,0,114,215,0,0,0,114,221,0,0,0,
-    90,15,95,69,82,82,95,77,83,71,95,80,82,69,70,73,
-    88,114,223,0,0,0,114,226,0,0,0,218,6,111,98,106,
-    101,99,116,114,227,0,0,0,114,228,0,0,0,114,229,0,
-    0,0,114,234,0,0,0,114,240,0,0,0,114,243,0,0,
-    0,114,244,0,0,0,114,248,0,0,0,114,249,0,0,0,
-    114,251,0,0,0,114,5,0,0,0,114,5,0,0,0,114,
-    5,0,0,0,114,6,0,0,0,218,8,60,109,111,100,117,
-    108,101,62,1,0,0,0,115,104,0,0,0,4,0,8,22,
-    4,9,4,1,4,1,4,3,8,3,8,8,4,8,4,2,
-    16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11,
-    8,8,8,11,8,12,8,19,14,26,16,101,10,26,14,45,
-    8,72,8,17,8,17,8,30,8,36,8,45,14,15,14,80,
-    14,85,8,13,8,9,10,10,8,47,4,16,8,1,8,2,
-    6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7,
-    8,35,12,8,
+    1,14,1,14,1,10,4,18,1,12,1,2,1,8,128,2,
+    249,2,252,4,12,114,234,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,41,124,2,100,3,117,1,114,39,124,1,124,2,
+    106,1,107,3,114,39,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,48,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,71,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,158,0,0,0,114,113,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,9,0,0,0,114,154,
+    0,0,0,114,141,0,0,0,114,25,0,0,0,41,6,114,
+    38,0,0,0,114,143,0,0,0,114,101,0,0,0,114,102,
+    0,0,0,114,169,0,0,0,114,142,0,0,0,41,3,218,
+    7,103,108,111,98,97,108,115,114,209,0,0,0,114,109,0,
+    0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,
+    0,218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,
+    103,101,95,95,66,4,0,0,115,42,0,0,0,10,7,10,
+    1,8,1,18,1,6,1,2,1,4,255,4,1,6,255,4,
+    2,6,254,4,3,8,1,6,1,6,2,4,2,6,254,8,
+    3,8,1,14,1,4,1,114,240,0,0,0,114,5,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,174,0,0,0,124,
+    4,100,1,107,2,114,9,116,0,124,0,131,1,125,5,110,
+    18,124,1,100,2,117,1,114,15,124,1,110,1,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,74,124,4,100,1,107,2,114,
+    42,116,0,124,0,160,2,100,3,161,1,100,1,25,0,131,
+    1,83,0,124,0,115,46,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,116,7,124,5,100,4,131,2,114,85,116,8,124,
+    5,124,3,116,0,131,3,83,0,124,5,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,25,0,0,0,
+    78,114,141,0,0,0,114,154,0,0,0,41,9,114,229,0,
+    0,0,114,240,0,0,0,218,9,112,97,114,116,105,116,105,
+    111,110,114,208,0,0,0,114,18,0,0,0,114,105,0,0,
+    0,114,9,0,0,0,114,11,0,0,0,114,234,0,0,0,
+    41,9,114,20,0,0,0,114,239,0,0,0,218,6,108,111,
+    99,97,108,115,114,235,0,0,0,114,210,0,0,0,114,110,
+    0,0,0,90,8,103,108,111,98,97,108,115,95,114,209,0,
+    0,0,90,7,99,117,116,95,111,102,102,114,5,0,0,0,
+    114,5,0,0,0,114,6,0,0,0,218,10,95,95,105,109,
+    112,111,114,116,95,95,93,4,0,0,115,30,0,0,0,8,
+    11,10,1,16,2,8,1,12,1,4,1,8,3,18,1,4,
+    1,4,1,26,4,30,3,10,1,12,1,4,2,114,243,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,15,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,175,0,0,0,114,183,0,0,0,
+    114,87,0,0,0,114,173,0,0,0,41,2,114,20,0,0,
+    0,114,109,0,0,0,114,5,0,0,0,114,5,0,0,0,
+    114,6,0,0,0,218,18,95,98,117,105,108,116,105,110,95,
+    102,114,111,109,95,110,97,109,101,130,4,0,0,115,8,0,
+    0,0,10,1,8,1,12,1,8,1,114,244,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,36,92,2,125,3,125,4,116,
+    5,124,4,124,2,131,2,114,49,124,3,116,1,106,6,118,
+    0,114,30,116,7,125,5,110,9,116,0,160,8,124,3,161,
+    1,114,38,116,9,125,5,110,1,113,13,116,10,124,4,124,
+    5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113,
+    13,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93,
+    23,125,8,124,8,116,1,106,3,118,1,114,69,116,13,124,
+    8,131,1,125,9,110,5,116,1,106,3,124,8,25,0,125,
+    9,116,14,124,7,124,8,124,9,131,3,1,0,113,57,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,26,0,0,0,114,101,0,0,0,114,71,0,
+    0,0,78,41,15,114,64,0,0,0,114,18,0,0,0,114,
+    3,0,0,0,114,105,0,0,0,218,5,105,116,101,109,115,
+    114,216,0,0,0,114,86,0,0,0,114,175,0,0,0,114,
+    98,0,0,0,114,193,0,0,0,114,155,0,0,0,114,161,
+    0,0,0,114,9,0,0,0,114,244,0,0,0,114,12,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,20,0,0,0,114,
+    110,0,0,0,114,122,0,0,0,114,109,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,5,0,0,0,114,5,
+    0,0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,
+    137,4,0,0,115,40,0,0,0,4,9,4,1,8,3,18,
+    1,10,1,10,1,6,1,10,1,6,1,2,2,10,1,10,
+    1,2,128,10,3,8,1,10,1,10,1,10,2,14,1,4,
+    251,114,248,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,248,0,0,0,114,18,0,0,0,114,214,0,0,0,
+    114,132,0,0,0,114,175,0,0,0,114,193,0,0,0,41,
+    2,114,246,0,0,0,114,247,0,0,0,114,5,0,0,0,
+    114,5,0,0,0,114,6,0,0,0,218,8,95,105,110,115,
+    116,97,108,108,172,4,0,0,115,6,0,0,0,10,2,12,
+    2,16,1,114,249,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,25,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,139,0,0,0,114,249,0,0,
+    0,114,18,0,0,0,114,105,0,0,0,114,9,0,0,0,
+    41,1,114,250,0,0,0,114,5,0,0,0,114,5,0,0,
+    0,114,6,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,180,4,0,0,115,6,0,0,0,8,3,4,1,
+    20,1,114,251,0,0,0,114,190,0,0,0,114,0,0,0,
+    0,114,24,0,0,0,41,4,78,78,114,5,0,0,0,114,
+    25,0,0,0,41,54,114,10,0,0,0,114,7,0,0,0,
+    114,26,0,0,0,114,101,0,0,0,114,71,0,0,0,114,
+    139,0,0,0,114,17,0,0,0,114,21,0,0,0,114,66,
+    0,0,0,114,37,0,0,0,114,47,0,0,0,114,22,0,
+    0,0,114,23,0,0,0,114,55,0,0,0,114,57,0,0,
+    0,114,60,0,0,0,114,72,0,0,0,114,74,0,0,0,
+    114,83,0,0,0,114,95,0,0,0,114,100,0,0,0,114,
+    111,0,0,0,114,124,0,0,0,114,125,0,0,0,114,104,
+    0,0,0,114,155,0,0,0,114,161,0,0,0,114,165,0,
+    0,0,114,119,0,0,0,114,106,0,0,0,114,172,0,0,
+    0,114,173,0,0,0,114,107,0,0,0,114,175,0,0,0,
+    114,193,0,0,0,114,200,0,0,0,114,211,0,0,0,114,
+    213,0,0,0,114,215,0,0,0,114,221,0,0,0,90,15,
+    95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114,
+    223,0,0,0,114,226,0,0,0,218,6,111,98,106,101,99,
+    116,114,227,0,0,0,114,228,0,0,0,114,229,0,0,0,
+    114,234,0,0,0,114,240,0,0,0,114,243,0,0,0,114,
+    244,0,0,0,114,248,0,0,0,114,249,0,0,0,114,251,
+    0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,
+    0,0,114,6,0,0,0,218,8,60,109,111,100,117,108,101,
+    62,1,0,0,0,115,104,0,0,0,4,0,8,22,4,9,
+    4,1,4,1,4,3,8,3,8,8,4,8,4,2,16,3,
+    14,4,14,77,14,21,8,16,8,37,8,17,14,11,8,8,
+    8,11,8,12,8,19,14,26,16,101,10,26,14,45,8,72,
+    8,17,8,17,8,30,8,36,8,45,14,15,14,80,14,85,
+    8,13,8,9,10,10,8,47,4,16,8,1,8,2,6,32,
+    8,3,10,16,14,15,8,37,10,27,8,37,8,7,8,35,
+    12,8,
 };
index dcf5505..e77ca4c 100644 (file)
@@ -836,7 +836,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,7,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,106,2,0,0,115,18,0,0,0,24,19,10,1,
-    12,1,16,1,8,1,22,1,2,255,22,2,8,254,114,180,
+    12,1,16,1,8,1,24,1,22,1,4,254,4,1,114,180,
     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,
@@ -1468,1304 +1468,1304 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101,
     95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0,
     0,114,8,0,0,0,114,241,0,0,0,182,3,0,0,115,
-    170,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1,
+    166,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1,
     2,1,12,1,12,1,8,1,2,255,2,3,14,1,12,1,
     4,1,2,255,12,3,2,1,14,1,12,1,4,1,2,255,
     2,4,2,1,6,254,2,4,12,1,16,1,12,1,4,1,
-    12,1,10,1,2,1,2,255,8,2,2,254,10,3,4,1,
-    2,1,2,1,4,254,8,4,2,1,4,255,2,128,2,3,
-    2,1,2,1,6,1,2,1,2,1,4,251,4,128,16,7,
-    4,1,2,255,8,3,2,1,4,255,6,2,2,1,2,1,
-    6,254,8,3,10,1,12,1,12,1,14,1,6,1,2,255,
-    4,2,8,1,10,1,14,1,6,2,6,1,4,255,2,2,
-    16,1,4,3,12,254,2,1,4,1,2,254,4,2,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,150,0,0,0,114,149,0,
-    0,0,114,151,0,0,0,114,251,0,0,0,114,252,0,0,
-    0,114,254,0,0,0,114,253,0,0,0,114,1,1,0,0,
-    114,5,1,0,0,114,241,0,0,0,114,7,0,0,0,114,
-    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,249,
-    0,0,0,123,3,0,0,115,16,0,0,0,8,0,8,2,
-    8,8,8,14,8,10,8,7,14,10,12,8,114,249,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,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,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,135,0,4,0,90,12,83,0,41,16,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,183,0,0,0,41,3,114,143,0,0,0,114,163,0,0,
-    0,114,65,0,0,0,114,7,0,0,0,114,7,0,0,0,
-    114,8,0,0,0,114,236,0,0,0,16,4,0,0,115,4,
-    0,0,0,6,3,10,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,243,24,0,0,0,124,0,106,0,124,1,
-    106,0,107,2,111,11,124,0,106,1,124,1,106,1,107,2,
-    83,0,114,69,0,0,0,169,2,218,9,95,95,99,108,97,
-    115,115,95,95,114,156,0,0,0,169,2,114,143,0,0,0,
-    90,5,111,116,104,101,114,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,218,6,95,95,101,113,95,95,22,4,
-    0,0,243,6,0,0,0,12,1,10,1,2,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,243,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,69,0,0,0,169,3,218,4,104,97,115,104,114,
-    141,0,0,0,114,65,0,0,0,169,1,114,143,0,0,0,
-    114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-    8,95,95,104,97,115,104,95,95,26,4,0,0,243,2,0,
-    0,0,20,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,11,1,0,0,114,248,0,
-    0,0,114,247,0,0,0,169,1,114,14,1,0,0,114,7,
-    0,0,0,114,8,0,0,0,114,248,0,0,0,29,4,0,
-    0,115,2,0,0,0,16,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,243,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,71,0,0,0,114,247,0,0,0,114,7,0,0,
-    0,114,7,0,0,0,114,8,0,0,0,114,203,0,0,0,
-    41,4,0,0,243,2,0,0,0,6,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,128,0,
-    0,0,116,0,124,0,116,1,116,2,102,2,131,2,114,36,
-    116,3,160,4,116,5,124,1,131,1,161,1,143,12,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,29,119,1,1,0,1,0,
-    1,0,89,0,1,0,100,1,83,0,116,3,160,7,124,1,
-    100,2,161,2,143,12,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,57,119,1,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,185,0,0,0,114,249,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,91,0,0,0,90,9,111,112,101,110,95,99,111,
-    100,101,114,109,0,0,0,90,4,114,101,97,100,114,92,0,
-    0,0,41,3,114,143,0,0,0,114,65,0,0,0,114,94,
-    0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,255,0,0,0,46,4,0,0,115,14,0,0,0,
-    14,2,16,1,6,1,36,255,14,3,6,1,36,255,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,
-    3,0,0,0,2,0,0,0,67,0,0,0,115,20,0,0,
-    0,100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,
-    0,131,1,83,0,41,3,78,114,0,0,0,0,41,1,218,
-    10,70,105,108,101,82,101,97,100,101,114,41,2,218,17,105,
-    109,112,111,114,116,108,105,98,46,114,101,97,100,101,114,115,
-    114,31,1,0,0,41,3,114,143,0,0,0,114,244,0,0,
-    0,114,31,1,0,0,114,7,0,0,0,114,7,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,55,4,0,0,115,4,
-    0,0,0,12,2,8,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,41,13,114,150,0,0,0,114,149,
-    0,0,0,114,151,0,0,0,114,152,0,0,0,114,236,0,
-    0,0,114,16,1,0,0,114,22,1,0,0,114,160,0,0,
-    0,114,248,0,0,0,114,203,0,0,0,114,255,0,0,0,
-    114,33,1,0,0,90,13,95,95,99,108,97,115,115,99,101,
-    108,108,95,95,114,7,0,0,0,114,7,0,0,0,114,25,
-    1,0,0,114,8,0,0,0,114,11,1,0,0,11,4,0,
-    0,115,24,0,0,0,8,0,4,2,8,3,8,6,8,4,
-    2,3,14,1,2,11,10,1,8,4,2,9,18,1,114,11,
-    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,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,193,
-    0,0,0,114,6,1,0,0,41,3,114,75,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,143,0,0,0,114,65,0,0,0,114,10,
-    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,252,0,0,0,65,4,0,0,115,4,0,0,0,
-    8,2,14,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,139,0,0,0,114,253,0,0,0,41,
-    5,114,143,0,0,0,114,134,0,0,0,114,132,0,0,0,
-    114,41,0,0,0,114,78,0,0,0,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,114,254,0,0,0,70,4,
-    0,0,115,4,0,0,0,8,2,16,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,87,0,
-    0,0,114,36,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,254,0,0,0,116,0,124,1,131,1,92,2,125,4,125,
-    5,103,0,125,6,124,4,114,31,116,1,124,4,131,1,115,
-    31,116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,
-    2,124,7,161,1,1,0,124,4,114,31,116,1,124,4,131,
-    1,114,14,116,3,124,6,131,1,68,0,93,49,125,7,116,
-    4,124,4,124,7,131,2,125,4,122,7,116,5,160,6,124,
-    4,161,1,1,0,87,0,113,35,4,0,116,7,121,58,1,
-    0,1,0,1,0,89,0,113,35,4,0,116,8,121,84,1,
-    0,125,8,1,0,122,15,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,119,1,119,0,122,
-    15,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,100,2,83,0,4,
-    0,116,8,121,126,1,0,125,8,1,0,122,14,116,9,160,
-    10,100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,
-    2,125,8,126,8,100,2,83,0,100,2,125,8,126,8,119,
-    1,119,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,74,0,0,0,114,83,0,0,0,114,61,0,0,0,218,
-    8,114,101,118,101,114,115,101,100,114,67,0,0,0,114,18,
-    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,76,0,0,0,
-    114,159,0,0,0,114,173,0,0,0,114,95,0,0,0,41,
-    9,114,143,0,0,0,114,65,0,0,0,114,41,0,0,0,
-    114,37,1,0,0,218,6,112,97,114,101,110,116,114,120,0,
-    0,0,114,63,0,0,0,114,68,0,0,0,114,0,1,0,
-    0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,253,0,0,0,75,4,0,0,115,56,0,0,0,12,2,
-    4,1,12,2,12,1,10,1,12,254,12,4,10,1,2,1,
-    14,1,12,1,4,2,14,1,6,3,4,1,4,255,16,2,
-    8,128,2,251,2,6,12,1,18,1,14,1,8,2,2,1,
-    18,255,8,128,2,254,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,150,0,0,0,114,149,0,0,0,114,151,
-    0,0,0,114,152,0,0,0,114,252,0,0,0,114,254,0,
-    0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,7,0,0,0,114,8,0,0,0,114,34,1,0,0,
-    61,4,0,0,115,10,0,0,0,8,0,4,2,8,2,8,
-    5,18,5,114,34,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,
+    12,1,10,1,2,1,2,255,10,2,10,1,4,1,2,1,
+    2,1,4,254,8,4,2,1,4,255,2,128,2,3,2,1,
+    2,1,6,1,2,1,2,1,4,251,4,128,16,7,4,1,
+    2,255,8,3,2,1,4,255,6,2,2,1,2,1,6,254,
+    8,3,10,1,12,1,12,1,14,1,8,1,4,1,8,1,
+    10,1,14,1,6,2,6,1,4,255,2,2,16,1,4,3,
+    12,254,2,1,4,1,2,254,4,2,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,150,0,0,0,114,149,0,0,0,114,151,
+    0,0,0,114,251,0,0,0,114,252,0,0,0,114,254,0,
+    0,0,114,253,0,0,0,114,1,1,0,0,114,5,1,0,
+    0,114,241,0,0,0,114,7,0,0,0,114,7,0,0,0,
+    114,7,0,0,0,114,8,0,0,0,114,249,0,0,0,123,
+    3,0,0,115,16,0,0,0,8,0,8,2,8,8,8,14,
+    8,10,8,7,14,10,12,8,114,249,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,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,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,135,
+    0,4,0,90,12,83,0,41,16,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,183,0,0,
+    0,41,3,114,143,0,0,0,114,163,0,0,0,114,65,0,
+    0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+    0,114,236,0,0,0,16,4,0,0,115,4,0,0,0,6,
+    3,10,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,243,24,0,0,0,124,0,106,0,124,1,106,0,107,2,
+    111,11,124,0,106,1,124,1,106,1,107,2,83,0,114,69,
+    0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95,
+    114,156,0,0,0,169,2,114,143,0,0,0,90,5,111,116,
+    104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,
+    0,0,218,6,95,95,101,113,95,95,22,4,0,0,243,6,
+    0,0,0,12,1,10,1,2,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,243,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,69,
+    0,0,0,169,3,218,4,104,97,115,104,114,141,0,0,0,
+    114,65,0,0,0,169,1,114,143,0,0,0,114,7,0,0,
+    0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,104,
+    97,115,104,95,95,26,4,0,0,243,2,0,0,0,20,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,11,1,0,0,114,248,0,0,0,114,247,
+    0,0,0,169,1,114,14,1,0,0,114,7,0,0,0,114,
+    8,0,0,0,114,248,0,0,0,29,4,0,0,115,2,0,
+    0,0,16,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,243,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,71,
+    0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,0,
+    0,0,114,8,0,0,0,114,203,0,0,0,41,4,0,0,
+    243,2,0,0,0,6,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,128,0,0,0,116,0,
+    124,0,116,1,116,2,102,2,131,2,114,36,116,3,160,4,
+    116,5,124,1,131,1,161,1,143,12,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,29,119,1,1,0,1,0,1,0,89,0,
+    1,0,100,1,83,0,116,3,160,7,124,1,100,2,161,2,
+    143,12,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,57,119,1,
+    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,
+    185,0,0,0,114,249,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,91,
+    0,0,0,90,9,111,112,101,110,95,99,111,100,101,114,109,
+    0,0,0,90,4,114,101,97,100,114,92,0,0,0,41,3,
+    114,143,0,0,0,114,65,0,0,0,114,94,0,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,255,
+    0,0,0,46,4,0,0,115,14,0,0,0,14,2,16,1,
+    6,1,36,255,14,3,6,1,36,255,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,3,0,0,0,
+    2,0,0,0,67,0,0,0,115,20,0,0,0,100,1,100,
+    2,108,0,109,1,125,2,1,0,124,2,124,0,131,1,83,
+    0,41,3,78,114,0,0,0,0,41,1,218,10,70,105,108,
+    101,82,101,97,100,101,114,41,2,218,17,105,109,112,111,114,
+    116,108,105,98,46,114,101,97,100,101,114,115,114,31,1,0,
+    0,41,3,114,143,0,0,0,114,244,0,0,0,114,31,1,
+    0,0,114,7,0,0,0,114,7,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,55,4,0,0,115,4,0,0,0,12,
+    2,8,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,41,13,114,150,0,0,0,114,149,0,0,0,114,
+    151,0,0,0,114,152,0,0,0,114,236,0,0,0,114,16,
+    1,0,0,114,22,1,0,0,114,160,0,0,0,114,248,0,
+    0,0,114,203,0,0,0,114,255,0,0,0,114,33,1,0,
+    0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,
+    114,7,0,0,0,114,7,0,0,0,114,25,1,0,0,114,
+    8,0,0,0,114,11,1,0,0,11,4,0,0,115,24,0,
+    0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,
+    2,11,10,1,8,4,2,9,18,1,114,11,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,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,193,0,0,0,114,
+    6,1,0,0,41,3,114,75,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,143,0,0,0,114,65,0,0,0,114,10,1,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,252,
+    0,0,0,65,4,0,0,115,4,0,0,0,8,2,14,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,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,183,0,0,0,114,169,0,0,0,41,2,114,141,
-    0,0,0,114,132,0,0,0,41,5,114,203,0,0,0,114,
-    255,0,0,0,114,176,0,0,0,114,189,0,0,0,114,7,
-    1,0,0,41,5,114,143,0,0,0,114,163,0,0,0,114,
-    65,0,0,0,114,41,0,0,0,114,175,0,0,0,114,7,
-    0,0,0,114,7,0,0,0,114,8,0,0,0,114,241,0,
-    0,0,110,4,0,0,115,22,0,0,0,10,1,10,1,2,
-    4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6,
-    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,114,23,0,0,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,7,0,0,0,114,
-    247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,1,1,0,0,126,4,0,0,114,24,0,0,
-    0,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,150,0,0,0,114,149,0,0,0,114,
-    151,0,0,0,114,152,0,0,0,114,241,0,0,0,114,1,
-    1,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,41,1,0,0,106,4,0,0,
-    115,8,0,0,0,8,0,4,2,8,2,12,16,114,41,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,30,
-    1,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,69,0,0,0,114,183,0,0,0,41,3,114,143,0,0,
-    0,114,141,0,0,0,114,65,0,0,0,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,236,0,0,0,139,
-    4,0,0,115,4,0,0,0,6,1,10,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,114,12,1,0,0,114,69,0,0,0,114,13,1,
-    0,0,114,15,1,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,114,16,1,0,0,143,4,0,0,114,
-    17,1,0,0,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,114,18,1,0,0,114,69,
-    0,0,0,114,19,1,0,0,114,21,1,0,0,114,7,0,
-    0,0,114,7,0,0,0,114,8,0,0,0,114,22,1,0,
-    0,147,4,0,0,114,23,1,0,0,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,159,
-    0,0,0,114,242,0,0,0,114,187,0,0,0,90,14,99,
-    114,101,97,116,101,95,100,121,110,97,109,105,99,114,173,0,
-    0,0,114,141,0,0,0,114,65,0,0,0,41,3,114,143,
-    0,0,0,114,210,0,0,0,114,244,0,0,0,114,7,0,
-    0,0,114,7,0,0,0,114,8,0,0,0,114,239,0,0,
-    0,150,4,0,0,115,14,0,0,0,4,2,6,1,4,255,
-    6,2,8,1,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,159,0,0,
-    0,114,242,0,0,0,114,187,0,0,0,90,12,101,120,101,
-    99,95,100,121,110,97,109,105,99,114,173,0,0,0,114,141,
-    0,0,0,114,65,0,0,0,169,2,114,143,0,0,0,114,
-    244,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,245,0,0,0,158,4,0,0,115,8,0,0,
-    0,14,2,6,1,8,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,3,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,
-    28,0,0,0,129,0,124,0,93,9,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,236,0,0,0,78,114,7,0,0,0,169,2,114,
-    5,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,7,0,0,0,114,8,
-    0,0,0,114,9,0,0,0,167,4,0,0,115,8,0,0,
-    0,2,128,4,0,2,1,20,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,74,
-    0,0,0,114,65,0,0,0,218,3,97,110,121,114,232,0,
-    0,0,114,247,0,0,0,114,7,0,0,0,114,45,1,0,
-    0,114,8,0,0,0,114,206,0,0,0,164,4,0,0,115,
-    8,0,0,0,14,2,12,1,2,1,8,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,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,139,0,0,0,114,253,0,0,0,41,5,114,143,0,
+    0,0,114,134,0,0,0,114,132,0,0,0,114,41,0,0,
+    0,114,78,0,0,0,114,7,0,0,0,114,7,0,0,0,
+    114,8,0,0,0,114,254,0,0,0,70,4,0,0,115,4,
+    0,0,0,8,2,16,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,87,0,0,0,114,36,
+    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,254,0,0,
+    0,116,0,124,1,131,1,92,2,125,4,125,5,103,0,125,
+    6,124,4,114,31,116,1,124,4,131,1,115,31,116,0,124,
+    4,131,1,92,2,125,4,125,7,124,6,160,2,124,7,161,
+    1,1,0,124,4,114,31,116,1,124,4,131,1,114,14,116,
+    3,124,6,131,1,68,0,93,49,125,7,116,4,124,4,124,
+    7,131,2,125,4,122,7,116,5,160,6,124,4,161,1,1,
+    0,87,0,113,35,4,0,116,7,121,58,1,0,1,0,1,
+    0,89,0,113,35,4,0,116,8,121,84,1,0,125,8,1,
+    0,122,15,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,119,1,119,0,122,15,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,100,2,83,0,4,0,116,8,121,
+    126,1,0,125,8,1,0,122,14,116,9,160,10,100,1,124,
+    1,124,8,161,3,1,0,87,0,89,0,100,2,125,8,126,
+    8,100,2,83,0,100,2,125,8,126,8,119,1,119,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,74,0,0,
+    0,114,83,0,0,0,114,61,0,0,0,218,8,114,101,118,
+    101,114,115,101,100,114,67,0,0,0,114,18,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,76,0,0,0,114,159,0,0,
+    0,114,173,0,0,0,114,95,0,0,0,41,9,114,143,0,
+    0,0,114,65,0,0,0,114,41,0,0,0,114,37,1,0,
+    0,218,6,112,97,114,101,110,116,114,120,0,0,0,114,63,
+    0,0,0,114,68,0,0,0,114,0,1,0,0,114,7,0,
+    0,0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,
+    0,75,4,0,0,115,56,0,0,0,12,2,4,1,12,2,
+    12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,1,
+    4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,251,
+    2,6,12,1,18,1,14,1,8,2,2,1,18,255,8,128,
+    2,254,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,150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,
+    152,0,0,0,114,252,0,0,0,114,254,0,0,0,114,253,
+    0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
+    0,0,114,8,0,0,0,114,34,1,0,0,61,4,0,0,
+    115,10,0,0,0,8,0,4,2,8,2,8,5,18,5,114,
+    34,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,183,
+    0,0,0,114,169,0,0,0,41,2,114,141,0,0,0,114,
+    132,0,0,0,41,5,114,203,0,0,0,114,255,0,0,0,
+    114,176,0,0,0,114,189,0,0,0,114,7,1,0,0,41,
+    5,114,143,0,0,0,114,163,0,0,0,114,65,0,0,0,
+    114,41,0,0,0,114,175,0,0,0,114,7,0,0,0,114,
+    7,0,0,0,114,8,0,0,0,114,241,0,0,0,110,4,
+    0,0,115,22,0,0,0,10,1,10,1,2,4,2,1,6,
+    254,12,4,2,1,14,1,2,1,2,1,6,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,114,23,0,0,0,41,2,122,63,82,101,
-    116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32,
+    0,67,0,0,0,114,23,0,0,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,7,0,0,0,114,247,0,0,0,
+    114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
+    1,1,0,0,126,4,0,0,114,24,0,0,0,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,150,0,0,0,114,149,0,0,0,114,151,0,0,0,
+    114,152,0,0,0,114,241,0,0,0,114,1,1,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+    0,0,0,114,41,1,0,0,106,4,0,0,115,8,0,0,
+    0,8,0,4,2,8,2,12,16,114,41,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,30,1,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,69,0,0,
+    0,114,183,0,0,0,41,3,114,143,0,0,0,114,141,0,
+    0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,0,
+    0,114,8,0,0,0,114,236,0,0,0,139,4,0,0,115,
+    4,0,0,0,6,1,10,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,114,
+    12,1,0,0,114,69,0,0,0,114,13,1,0,0,114,15,
+    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+    0,0,114,16,1,0,0,143,4,0,0,114,17,1,0,0,
+    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,114,18,1,0,0,114,69,0,0,0,114,
+    19,1,0,0,114,21,1,0,0,114,7,0,0,0,114,7,
+    0,0,0,114,8,0,0,0,114,22,1,0,0,147,4,0,
+    0,114,23,1,0,0,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,
-    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,7,
-    0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,241,0,0,0,170,4,0,0,
-    114,24,0,0,0,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,114,23,0,0,
-    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,7,0,0,0,
-    114,247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,1,1,0,0,174,4,0,0,114,24,0,
-    0,0,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,114,26,1,0,0,
-    114,27,1,0,0,114,71,0,0,0,114,247,0,0,0,114,
-    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,203,
-    0,0,0,178,4,0,0,114,28,1,0,0,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,150,0,0,0,114,149,0,0,0,114,151,0,0,0,
-    114,152,0,0,0,114,236,0,0,0,114,16,1,0,0,114,
-    22,1,0,0,114,239,0,0,0,114,245,0,0,0,114,206,
-    0,0,0,114,241,0,0,0,114,1,1,0,0,114,160,0,
-    0,0,114,203,0,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,7,0,0,0,114,8,0,0,0,114,30,1,0,0,
-    131,4,0,0,115,24,0,0,0,8,0,4,2,8,6,8,
-    4,8,4,8,3,8,8,8,6,8,6,8,4,2,4,14,
-    1,114,30,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,
-    108,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,100,14,
-    132,0,90,10,100,15,100,16,132,0,90,11,100,17,100,18,
-    132,0,90,12,100,19,100,20,132,0,90,13,100,21,100,22,
-    132,0,90,14,100,23,100,24,132,0,90,15,100,25,83,0,
-    41,26,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,114,0,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,44,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,0,106,5,124,0,
-    95,6,124,3,124,0,95,7,100,0,83,0,114,69,0,0,
-    0,41,8,218,5,95,110,97,109,101,218,5,95,112,97,116,
-    104,114,136,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,6,95,101,112,
-    111,99,104,218,11,95,108,97,115,116,95,101,112,111,99,104,
-    218,12,95,112,97,116,104,95,102,105,110,100,101,114,169,4,
-    114,143,0,0,0,114,141,0,0,0,114,65,0,0,0,90,
-    11,112,97,116,104,95,102,105,110,100,101,114,114,7,0,0,
-    0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0,
-    195,4,0,0,115,10,0,0,0,6,1,6,1,14,1,8,
-    1,10,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,15,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,97,0,0,0,114,10,0,0,0,41,2,114,15,
-    0,0,0,114,65,0,0,0,90,8,95,95,112,97,116,104,
-    95,95,41,2,114,48,1,0,0,114,104,0,0,0,41,4,
-    114,143,0,0,0,114,40,1,0,0,218,3,100,111,116,90,
-    2,109,101,114,7,0,0,0,114,7,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,202,4,0,0,115,
-    8,0,0,0,18,2,8,1,4,2,8,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,69,
-    0,0,0,41,4,114,57,1,0,0,114,155,0,0,0,114,
-    15,0,0,0,218,7,109,111,100,117,108,101,115,41,3,114,
-    143,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,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,50,1,0,0,212,4,0,0,
-    115,4,0,0,0,12,1,16,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,100,0,0,0,116,0,124,0,160,1,161,0,
-    131,1,125,1,124,1,124,0,106,2,107,3,115,17,124,0,
-    106,3,124,0,106,4,107,3,114,47,124,0,160,5,124,0,
-    106,6,124,1,161,2,125,2,124,2,100,0,117,1,114,40,
-    124,2,106,7,100,0,117,0,114,40,124,2,106,8,114,40,
-    124,2,106,8,124,0,95,9,124,1,124,0,95,2,124,0,
-    106,3,124,0,95,4,124,0,106,9,83,0,114,69,0,0,
-    0,41,10,114,136,0,0,0,114,50,1,0,0,114,51,1,
-    0,0,114,52,1,0,0,114,53,1,0,0,114,54,1,0,
-    0,114,48,1,0,0,114,164,0,0,0,114,202,0,0,0,
-    114,49,1,0,0,41,3,114,143,0,0,0,90,11,112,97,
-    114,101,110,116,95,112,97,116,104,114,210,0,0,0,114,7,
-    0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,
-    114,101,99,97,108,99,117,108,97,116,101,216,4,0,0,115,
-    18,0,0,0,12,2,22,1,14,1,18,3,6,1,8,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,243,12,0,0,
-    0,116,0,124,0,160,1,161,0,131,1,83,0,114,69,0,
-    0,0,41,2,218,4,105,116,101,114,114,59,1,0,0,114,
-    21,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,218,8,95,95,105,116,101,114,95,95,230,4,0,
-    0,243,2,0,0,0,12,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,69,0,0,0,
-    169,1,114,59,1,0,0,41,2,114,143,0,0,0,218,5,
-    105,110,100,101,120,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,218,11,95,95,103,101,116,105,116,101,109,95,
-    95,233,4,0,0,114,63,1,0,0,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,69,0,0,0,41,1,114,49,1,0,0,41,3,
-    114,143,0,0,0,114,65,1,0,0,114,65,0,0,0,114,
-    7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,
-    95,95,115,101,116,105,116,101,109,95,95,236,4,0,0,115,
-    2,0,0,0,14,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,114,60,1,0,0,
-    114,69,0,0,0,41,2,114,4,0,0,0,114,59,1,0,
-    0,114,21,1,0,0,114,7,0,0,0,114,7,0,0,0,
-    114,8,0,0,0,218,7,95,95,108,101,110,95,95,239,4,
-    0,0,114,63,1,0,0,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,
+    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,159,0,0,0,114,
+    242,0,0,0,114,187,0,0,0,90,14,99,114,101,97,116,
+    101,95,100,121,110,97,109,105,99,114,173,0,0,0,114,141,
+    0,0,0,114,65,0,0,0,41,3,114,143,0,0,0,114,
+    210,0,0,0,114,244,0,0,0,114,7,0,0,0,114,7,
+    0,0,0,114,8,0,0,0,114,239,0,0,0,150,4,0,
+    0,115,14,0,0,0,4,2,6,1,4,255,6,2,8,1,
+    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,159,0,0,0,114,242,0,
+    0,0,114,187,0,0,0,90,12,101,120,101,99,95,100,121,
+    110,97,109,105,99,114,173,0,0,0,114,141,0,0,0,114,
+    65,0,0,0,169,2,114,143,0,0,0,114,244,0,0,0,
+    114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
+    245,0,0,0,158,4,0,0,115,8,0,0,0,14,2,6,
+    1,8,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,3,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,28,0,0,0,
+    129,0,124,0,93,9,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,236,
+    0,0,0,78,114,7,0,0,0,169,2,114,5,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,7,0,0,0,114,8,0,0,0,114,
+    9,0,0,0,167,4,0,0,115,8,0,0,0,2,128,4,
+    0,2,1,20,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,74,0,0,0,114,
+    65,0,0,0,218,3,97,110,121,114,232,0,0,0,114,247,
+    0,0,0,114,7,0,0,0,114,45,1,0,0,114,8,0,
+    0,0,114,206,0,0,0,164,4,0,0,115,8,0,0,0,
+    14,2,12,1,2,1,8,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,114,23,0,0,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,7,0,0,0,114,
+    247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+    0,0,0,114,241,0,0,0,170,4,0,0,114,24,0,0,
+    0,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,114,23,0,0,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,7,0,0,0,114,247,0,0,
+    0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+    114,1,1,0,0,174,4,0,0,114,24,0,0,0,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,114,26,1,0,0,114,27,1,0,
+    0,114,71,0,0,0,114,247,0,0,0,114,7,0,0,0,
+    114,7,0,0,0,114,8,0,0,0,114,203,0,0,0,178,
+    4,0,0,114,28,1,0,0,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,150,0,
+    0,0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,
+    0,114,236,0,0,0,114,16,1,0,0,114,22,1,0,0,
+    114,239,0,0,0,114,245,0,0,0,114,206,0,0,0,114,
+    241,0,0,0,114,1,1,0,0,114,160,0,0,0,114,203,
+    0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,
+    0,0,114,8,0,0,0,114,30,1,0,0,131,4,0,0,
+    115,24,0,0,0,8,0,4,2,8,6,8,4,8,4,8,
+    3,8,8,8,6,8,6,8,4,2,4,14,1,114,30,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,108,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,100,14,132,0,90,10,
+    100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12,
+    100,19,100,20,132,0,90,13,100,21,100,22,132,0,90,14,
+    100,23,100,24,132,0,90,15,100,25,83,0,41,26,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,114,0,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,44,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,0,106,5,124,0,95,6,124,3,
+    124,0,95,7,100,0,83,0,114,69,0,0,0,41,8,218,
+    5,95,110,97,109,101,218,5,95,112,97,116,104,114,136,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,6,95,101,112,111,99,104,218,
+    11,95,108,97,115,116,95,101,112,111,99,104,218,12,95,112,
+    97,116,104,95,102,105,110,100,101,114,169,4,114,143,0,0,
+    0,114,141,0,0,0,114,65,0,0,0,90,11,112,97,116,
+    104,95,102,105,110,100,101,114,114,7,0,0,0,114,7,0,
+    0,0,114,8,0,0,0,114,236,0,0,0,195,4,0,0,
+    115,10,0,0,0,6,1,6,1,14,1,8,1,10,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,15,
+    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,97,
+    0,0,0,114,10,0,0,0,41,2,114,15,0,0,0,114,
+    65,0,0,0,90,8,95,95,112,97,116,104,95,95,41,2,
+    114,48,1,0,0,114,104,0,0,0,41,4,114,143,0,0,
+    0,114,40,1,0,0,218,3,100,111,116,90,2,109,101,114,
+    7,0,0,0,114,7,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,202,4,0,0,115,8,0,0,0,
+    18,2,8,1,4,2,8,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,69,0,0,0,41,
+    4,114,57,1,0,0,114,155,0,0,0,114,15,0,0,0,
+    218,7,109,111,100,117,108,101,115,41,3,114,143,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,7,0,0,0,114,7,0,0,0,114,8,
+    0,0,0,114,50,1,0,0,212,4,0,0,115,4,0,0,
+    0,12,1,16,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,
+    100,0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,
+    124,1,124,0,106,2,107,3,115,17,124,0,106,3,124,0,
+    106,4,107,3,114,47,124,0,160,5,124,0,106,6,124,1,
+    161,2,125,2,124,2,100,0,117,1,114,40,124,2,106,7,
+    100,0,117,0,114,40,124,2,106,8,114,40,124,2,106,8,
+    124,0,95,9,124,1,124,0,95,2,124,0,106,3,124,0,
+    95,4,124,0,106,9,83,0,114,69,0,0,0,41,10,114,
+    136,0,0,0,114,50,1,0,0,114,51,1,0,0,114,52,
+    1,0,0,114,53,1,0,0,114,54,1,0,0,114,48,1,
+    0,0,114,164,0,0,0,114,202,0,0,0,114,49,1,0,
+    0,41,3,114,143,0,0,0,90,11,112,97,114,101,110,116,
+    95,112,97,116,104,114,210,0,0,0,114,7,0,0,0,114,
+    7,0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,
+    108,99,117,108,97,116,101,216,4,0,0,115,18,0,0,0,
+    12,2,22,1,14,1,18,3,6,1,8,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,243,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,89,0,0,0,114,49,1,0,0,114,21,
-    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,218,8,95,95,114,101,112,114,95,95,242,4,0,0,
-    114,63,1,0,0,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,
+    3,0,0,0,67,0,0,0,243,12,0,0,0,116,0,124,
+    0,160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,
+    218,4,105,116,101,114,114,59,1,0,0,114,21,1,0,0,
+    114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
+    8,95,95,105,116,101,114,95,95,230,4,0,0,243,2,0,
+    0,0,12,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,69,0,0,0,169,1,114,59,
+    1,0,0,41,2,114,143,0,0,0,218,5,105,110,100,101,
+    120,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+    218,11,95,95,103,101,116,105,116,101,109,95,95,233,4,0,
+    0,114,63,1,0,0,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,69,
+    0,0,0,41,1,114,49,1,0,0,41,3,114,143,0,0,
+    0,114,65,1,0,0,114,65,0,0,0,114,7,0,0,0,
+    114,7,0,0,0,114,8,0,0,0,218,11,95,95,115,101,
+    116,105,116,101,109,95,95,236,4,0,0,115,2,0,0,0,
+    14,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,114,60,1,0,0,114,69,0,0,
+    0,41,2,114,4,0,0,0,114,59,1,0,0,114,21,1,
+    0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
+    0,218,7,95,95,108,101,110,95,95,239,4,0,0,114,63,
+    1,0,0,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,243,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,89,0,0,0,114,49,1,0,0,114,21,1,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,
+    95,95,114,101,112,114,95,95,242,4,0,0,114,63,1,0,
+    0,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,
+    118,0,83,0,114,69,0,0,0,114,64,1,0,0,169,2,
+    114,143,0,0,0,218,4,105,116,101,109,114,7,0,0,0,
+    114,7,0,0,0,114,8,0,0,0,218,12,95,95,99,111,
+    110,116,97,105,110,115,95,95,245,4,0,0,114,63,1,0,
+    0,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,12,0,0,0,124,1,124,0,
-    160,0,161,0,118,0,83,0,114,69,0,0,0,114,64,1,
-    0,0,169,2,114,143,0,0,0,218,4,105,116,101,109,114,
-    7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,12,
-    95,95,99,111,110,116,97,105,110,115,95,95,245,4,0,0,
-    114,63,1,0,0,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,69,0,0,0,41,2,114,49,1,0,0,114,61,0,0,
-    0,114,71,1,0,0,114,7,0,0,0,114,7,0,0,0,
-    114,8,0,0,0,114,61,0,0,0,248,4,0,0,243,2,
-    0,0,0,16,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,16,114,
-    150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,
-    0,0,0,114,52,1,0,0,114,236,0,0,0,114,57,1,
-    0,0,114,50,1,0,0,114,59,1,0,0,114,62,1,0,
-    0,114,66,1,0,0,114,67,1,0,0,114,68,1,0,0,
-    114,70,1,0,0,114,73,1,0,0,114,61,0,0,0,114,
-    7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,47,1,0,0,184,4,0,0,115,28,0,0,
-    0,8,0,4,1,4,8,8,2,8,7,8,10,8,4,8,
-    14,8,3,8,3,8,3,8,3,8,3,12,3,114,47,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,88,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,100,18,
-    132,0,90,12,100,19,83,0,41,20,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,69,0,0,
-    0,41,2,114,47,1,0,0,114,49,1,0,0,114,55,1,
+    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,69,0,0,
+    0,41,2,114,49,1,0,0,114,61,0,0,0,114,71,1,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,114,236,0,0,0,254,4,0,0,115,2,0,0,0,18,
-    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,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,24,0,0,0,116,0,160,1,100,1,
-    116,2,161,2,1,0,100,2,160,3,124,0,106,4,161,1,
-    83,0,41,3,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,82,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,40,41,32,105,115,32,100,101,112,
-    114,101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,
-    101,100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,
-    110,32,80,121,116,104,111,110,32,51,46,49,50,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,5,114,99,0,0,0,114,
-    100,0,0,0,114,101,0,0,0,114,89,0,0,0,114,150,
-    0,0,0,41,1,114,244,0,0,0,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108,
-    101,95,114,101,112,114,1,5,0,0,115,8,0,0,0,6,
-    7,2,1,4,255,12,2,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,114,23,
-    0,0,0,41,2,78,84,114,7,0,0,0,114,247,0,0,
-    0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,206,0,0,0,12,5,0,0,243,2,0,0,0,4,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,114,23,0,0,0,41,2,78,114,10,
-    0,0,0,114,7,0,0,0,114,247,0,0,0,114,7,0,
-    0,0,114,7,0,0,0,114,8,0,0,0,114,1,1,0,
-    0,15,5,0,0,114,77,1,0,0,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,10,0,0,0,122,8,60,
-    115,116,114,105,110,103,62,114,243,0,0,0,84,41,1,114,
-    3,1,0,0,41,1,114,4,1,0,0,114,247,0,0,0,
+    0,114,61,0,0,0,248,4,0,0,243,2,0,0,0,16,
+    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,16,114,150,0,0,0,
+    114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,114,
+    52,1,0,0,114,236,0,0,0,114,57,1,0,0,114,50,
+    1,0,0,114,59,1,0,0,114,62,1,0,0,114,66,1,
+    0,0,114,67,1,0,0,114,68,1,0,0,114,70,1,0,
+    0,114,73,1,0,0,114,61,0,0,0,114,7,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    241,0,0,0,18,5,0,0,114,74,1,0,0,122,25,95,
+    47,1,0,0,184,4,0,0,115,28,0,0,0,8,0,4,
+    1,4,8,8,2,8,7,8,10,8,4,8,14,8,3,8,
+    3,8,3,8,3,8,3,12,3,114,47,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,88,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,100,18,132,0,90,12,
+    100,19,83,0,41,20,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,69,0,0,0,41,2,114,
+    47,1,0,0,114,49,1,0,0,114,55,1,0,0,114,7,
+    0,0,0,114,7,0,0,0,114,8,0,0,0,114,236,0,
+    0,0,254,4,0,0,115,2,0,0,0,18,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,114,23,0,0,0,114,237,0,0,0,114,7,0,0,0,
-    114,238,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,239,0,0,0,21,5,0,0,114,240,0,
-    0,0,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,69,0,0,0,114,7,0,0,0,114,42,
-    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,245,0,0,0,24,5,0,0,114,77,1,0,0,
-    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,159,0,0,0,114,173,0,0,0,
-    114,49,1,0,0,114,246,0,0,0,114,247,0,0,0,114,
-    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,248,
-    0,0,0,27,5,0,0,115,8,0,0,0,6,7,4,1,
-    4,255,12,3,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,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,22,0,0,0,
-    100,1,100,2,108,0,109,1,125,2,1,0,124,2,124,0,
-    106,2,131,1,83,0,41,3,78,114,0,0,0,0,41,1,
-    218,15,78,97,109,101,115,112,97,99,101,82,101,97,100,101,
-    114,41,3,114,32,1,0,0,114,78,1,0,0,114,49,1,
-    0,0,41,3,114,143,0,0,0,114,244,0,0,0,114,78,
-    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,33,1,0,0,39,5,0,0,115,4,0,0,0,
-    12,1,10,1,122,36,95,78,97,109,101,115,112,97,99,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,78,41,13,114,150,0,
-    0,0,114,149,0,0,0,114,151,0,0,0,114,236,0,0,
-    0,114,233,0,0,0,114,76,1,0,0,114,206,0,0,0,
-    114,1,1,0,0,114,241,0,0,0,114,239,0,0,0,114,
-    245,0,0,0,114,248,0,0,0,114,33,1,0,0,114,7,
-    0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,75,1,0,0,253,4,0,0,115,22,0,0,0,
-    8,0,8,1,2,3,10,1,8,10,8,3,8,3,8,3,
-    8,3,8,3,12,12,114,75,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,7,100,
-    6,100,7,132,0,131,1,90,8,101,7,100,8,100,9,132,
-    0,131,1,90,9,101,7,100,19,100,11,100,12,132,1,131,
-    1,90,10,101,7,100,20,100,13,100,14,132,1,131,1,90,
-    11,101,7,100,19,100,15,100,16,132,1,131,1,90,12,101,
-    4,100,17,100,18,132,0,131,1,90,13,100,10,83,0,41,
-    21,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,0,0,
-    0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,
-    0,0,67,0,0,0,115,78,0,0,0,116,0,116,1,106,
-    2,160,3,161,0,131,1,68,0,93,22,92,2,125,0,125,
-    1,124,1,100,1,117,0,114,20,116,1,106,2,124,0,61,
-    0,113,7,116,4,124,1,100,2,131,2,114,29,124,1,160,
-    5,161,0,1,0,113,7,116,6,4,0,106,7,100,3,55,
-    0,2,0,95,7,100,1,83,0,41,4,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,114,3,
-    0,0,0,41,8,218,4,108,105,115,116,114,15,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,153,0,0,
-    0,114,80,1,0,0,114,47,1,0,0,114,52,1,0,0,
-    41,2,114,141,0,0,0,218,6,102,105,110,100,101,114,114,
-    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,80,
-    1,0,0,50,5,0,0,115,14,0,0,0,22,4,8,1,
-    10,1,10,1,8,1,2,128,18,3,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,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,76,0,0,0,116,0,106,1,100,1,117,1,114,14,
-    116,0,106,1,115,14,116,2,160,3,100,2,116,4,161,2,
-    1,0,116,0,106,1,68,0,93,18,125,1,122,7,124,1,
-    124,0,131,1,87,0,2,0,1,0,83,0,4,0,116,5,
-    121,35,1,0,1,0,1,0,89,0,113,17,119,0,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,15,0,0,0,218,10,112,97,116,104,95,104,111,111,107,
-    115,114,99,0,0,0,114,100,0,0,0,114,162,0,0,0,
-    114,142,0,0,0,41,2,114,65,0,0,0,90,4,104,111,
-    111,107,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,218,11,95,112,97,116,104,95,104,111,111,107,115,63,5,
-    0,0,115,18,0,0,0,16,3,12,1,10,1,2,1,14,
-    1,12,1,4,1,2,255,4,3,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,21,122,6,116,0,160,1,161,0,125,
-    1,87,0,110,10,4,0,116,2,121,20,1,0,1,0,1,
-    0,89,0,100,2,83,0,119,0,122,8,116,3,106,4,124,
-    1,25,0,125,2,87,0,124,2,83,0,4,0,116,5,121,
-    49,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,124,2,83,
-    0,119,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,10,0,0,0,78,41,
-    7,114,18,0,0,0,114,82,0,0,0,218,17,70,105,108,
-    101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,15,
-    0,0,0,114,82,1,0,0,218,8,75,101,121,69,114,114,
-    111,114,114,86,1,0,0,41,3,114,221,0,0,0,114,65,
-    0,0,0,114,84,1,0,0,114,7,0,0,0,114,7,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,76,5,0,
-    0,115,28,0,0,0,8,8,2,1,12,1,12,1,6,3,
-    2,253,2,4,12,1,4,4,12,253,10,1,12,1,4,1,
-    2,253,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,
-    7,0,0,0,4,0,0,0,67,0,0,0,115,138,0,0,
-    0,116,0,124,2,100,1,131,2,114,27,116,1,160,2,124,
-    2,161,1,155,0,100,2,157,2,125,3,116,3,160,4,124,
-    3,116,5,161,2,1,0,124,2,160,6,124,1,161,1,92,
-    2,125,4,125,5,110,21,116,1,160,2,124,2,161,1,155,
-    0,100,3,157,2,125,3,116,3,160,4,124,3,116,5,161,
-    2,1,0,124,2,160,7,124,1,161,1,125,4,103,0,125,
-    5,124,4,100,0,117,1,114,58,116,1,160,8,124,1,124,
-    4,161,2,83,0,116,1,160,9,124,1,100,0,161,2,125,
-    6,124,5,124,6,95,10,124,6,83,0,41,4,78,114,161,
-    0,0,0,122,53,46,102,105,110,100,95,115,112,101,99,40,
-    41,32,110,111,116,32,102,111,117,110,100,59,32,102,97,108,
-    108,105,110,103,32,98,97,99,107,32,116,111,32,102,105,110,
-    100,95,108,111,97,100,101,114,40,41,122,53,46,102,105,110,
-    100,95,115,112,101,99,40,41,32,110,111,116,32,102,111,117,
-    110,100,59,32,102,97,108,108,105,110,103,32,98,97,99,107,
-    32,116,111,32,102,105,110,100,95,109,111,100,117,108,101,40,
-    41,41,11,114,153,0,0,0,114,159,0,0,0,90,12,95,
-    111,98,106,101,99,116,95,110,97,109,101,114,99,0,0,0,
-    114,100,0,0,0,114,162,0,0,0,114,161,0,0,0,114,
-    229,0,0,0,114,224,0,0,0,114,207,0,0,0,114,202,
-    0,0,0,41,7,114,221,0,0,0,114,163,0,0,0,114,
-    84,1,0,0,114,166,0,0,0,114,164,0,0,0,114,165,
-    0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,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,98,5,0,0,115,26,0,
-    0,0,10,4,16,1,12,2,16,1,16,2,12,2,10,1,
-    4,1,8,1,12,1,12,1,6,1,4,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,67,125,5,116,0,124,5,116,1,116,2,102,2,131,2,
-    115,14,113,4,124,0,160,3,124,5,161,1,125,6,124,6,
-    100,1,117,1,114,71,116,4,124,6,100,2,131,2,114,35,
-    124,6,160,5,124,1,124,3,161,2,125,7,110,6,124,0,
-    160,6,124,1,124,6,161,2,125,7,124,7,100,1,117,0,
-    114,46,113,4,124,7,106,7,100,1,117,1,114,55,124,7,
-    2,0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,
-    117,0,114,66,116,9,100,3,131,1,130,1,124,4,160,10,
-    124,8,161,1,1,0,113,4,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,226,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,185,
-    0,0,0,114,109,0,0,0,218,5,98,121,116,101,115,114,
-    89,1,0,0,114,153,0,0,0,114,226,0,0,0,114,90,
-    1,0,0,114,164,0,0,0,114,202,0,0,0,114,142,0,
-    0,0,114,191,0,0,0,114,159,0,0,0,114,207,0,0,
-    0,41,9,114,221,0,0,0,114,163,0,0,0,114,65,0,
-    0,0,114,225,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,84,
-    1,0,0,114,210,0,0,0,114,165,0,0,0,114,7,0,
-    0,0,114,7,0,0,0,114,8,0,0,0,218,9,95,103,
-    101,116,95,115,112,101,99,119,5,0,0,115,42,0,0,0,
-    4,5,8,1,14,1,2,1,10,1,8,1,10,1,14,1,
-    12,2,8,1,2,1,10,1,8,1,6,1,8,1,8,1,
-    10,5,2,128,12,2,6,1,4,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,94,0,0,0,124,2,
-    100,1,117,0,114,7,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,20,100,1,83,0,124,4,106,3,100,1,117,0,114,45,
-    124,4,106,4,125,5,124,5,114,43,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,124,4,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,15,0,0,0,114,65,0,0,0,114,93,1,0,0,114,
-    164,0,0,0,114,202,0,0,0,114,205,0,0,0,114,47,
-    1,0,0,41,6,114,221,0,0,0,114,163,0,0,0,114,
-    65,0,0,0,114,225,0,0,0,114,210,0,0,0,114,92,
-    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,226,0,0,0,151,5,0,0,115,26,0,0,0,
-    8,6,6,1,14,1,8,1,4,1,10,1,6,1,4,1,
-    6,3,16,1,4,1,4,2,4,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,42,0,0,0,116,0,
-    160,1,100,1,116,2,161,2,1,0,124,0,160,3,124,1,
-    124,2,161,2,125,3,124,3,100,2,117,0,114,18,100,2,
-    83,0,124,3,106,4,83,0,41,3,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,
+    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,4,0,0,0,67,0,0,
+    0,115,24,0,0,0,116,0,160,1,100,1,116,2,161,2,
+    1,0,100,2,160,3,124,0,106,4,161,1,83,0,41,3,
+    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,82,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,40,41,32,105,115,32,100,101,112,114,101,99,97,
+    116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102,
+    111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121,
+    116,104,111,110,32,51,46,49,50,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,5,114,99,0,0,0,114,100,0,0,0,
+    114,101,0,0,0,114,89,0,0,0,114,150,0,0,0,41,
+    1,114,244,0,0,0,114,7,0,0,0,114,7,0,0,0,
+    114,8,0,0,0,218,11,109,111,100,117,108,101,95,114,101,
+    112,114,1,5,0,0,115,8,0,0,0,6,7,2,1,4,
+    255,12,2,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,114,23,0,0,0,41,
+    2,78,84,114,7,0,0,0,114,247,0,0,0,114,7,0,
+    0,0,114,7,0,0,0,114,8,0,0,0,114,206,0,0,
+    0,12,5,0,0,243,2,0,0,0,4,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,114,23,0,0,0,41,2,78,114,10,0,0,0,114,
+    7,0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,
+    0,0,0,114,8,0,0,0,114,1,1,0,0,15,5,0,
+    0,114,77,1,0,0,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,10,0,0,0,122,8,60,115,116,114,105,
+    110,103,62,114,243,0,0,0,84,41,1,114,3,1,0,0,
+    41,1,114,4,1,0,0,114,247,0,0,0,114,7,0,0,
+    0,114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,
+    18,5,0,0,114,74,1,0,0,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,114,23,0,
+    0,0,114,237,0,0,0,114,7,0,0,0,114,238,0,0,
+    0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
+    114,239,0,0,0,21,5,0,0,114,240,0,0,0,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,69,0,0,0,114,7,0,0,0,114,42,1,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,245,
+    0,0,0,24,5,0,0,114,77,1,0,0,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,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,122,101,80,97,116,104,70,105,110,100,
-    101,114,46,102,105,110,100,95,109,111,100,117,108,101,40,41,
-    32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,
-    110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101,
-    109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32,
-    51,46,49,50,59,32,117,115,101,32,102,105,110,100,95,115,
-    112,101,99,40,41,32,105,110,115,116,101,97,100,78,114,227,
-    0,0,0,114,228,0,0,0,114,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,229,0,0,0,175,5,0,0,
-    115,14,0,0,0,6,8,2,2,4,254,12,3,8,1,4,
-    1,6,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,0,0,0,0,
-    0,0,0,0,0,0,0,0,3,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,2,1,0,124,2,106,2,124,0,105,0,124,1,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,0,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,94,1,
-    0,0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,
-    117,116,105,111,110,115,41,3,114,144,0,0,0,114,145,0,
-    0,0,114,94,1,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,114,95,1,0,0,191,5,0,0,115,
-    4,0,0,0,12,10,16,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,114,69,0,0,0,114,230,0,0,
-    0,41,14,114,150,0,0,0,114,149,0,0,0,114,151,0,
-    0,0,114,152,0,0,0,114,233,0,0,0,114,80,1,0,
-    0,114,86,1,0,0,114,234,0,0,0,114,89,1,0,0,
-    114,90,1,0,0,114,93,1,0,0,114,226,0,0,0,114,
-    229,0,0,0,114,95,1,0,0,114,7,0,0,0,114,7,
-    0,0,0,114,7,0,0,0,114,8,0,0,0,114,79,1,
-    0,0,46,5,0,0,115,36,0,0,0,8,0,4,2,2,
-    2,10,1,2,12,10,1,2,12,10,1,2,21,10,1,2,
-    20,12,1,2,31,12,1,2,23,12,1,2,15,14,1,114,
-    79,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,112,0,0,0,103,0,125,3,124,2,68,0,93,16,
-    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,4,
-    124,3,124,0,95,1,124,1,112,27,100,3,124,0,95,2,
-    116,3,124,0,106,2,131,1,115,43,116,4,116,5,160,6,
-    161,0,124,0,106,2,131,2,124,0,95,2,100,4,124,0,
-    95,7,116,8,131,0,124,0,95,9,116,8,131,0,124,0,
-    95,10,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,24,0,
-    0,0,129,0,124,0,93,7,125,1,124,1,136,0,102,2,
-    86,0,1,0,113,2,100,0,83,0,114,69,0,0,0,114,
-    7,0,0,0,114,43,1,0,0,169,1,114,164,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,9,0,0,0,220,
-    5,0,0,115,4,0,0,0,2,128,22,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,97,0,0,0,114,130,0,0,0,78,41,
-    11,114,191,0,0,0,218,8,95,108,111,97,100,101,114,115,
-    114,65,0,0,0,114,86,0,0,0,114,67,0,0,0,114,
-    18,0,0,0,114,82,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,
-    143,0,0,0,114,65,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,212,0,0,0,114,7,0,0,0,114,97,1,0,
-    0,114,8,0,0,0,114,236,0,0,0,214,5,0,0,115,
-    20,0,0,0,4,4,12,1,26,1,6,1,10,2,10,1,
-    18,1,6,1,8,1,12,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,130,0,0,0,78,41,1,
-    114,99,1,0,0,114,21,1,0,0,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,114,80,1,0,0,230,5,
-    0,0,114,81,0,0,0,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,4,0,0,0,67,0,0,0,115,54,
-    0,0,0,116,0,160,1,100,1,116,2,161,2,1,0,124,
-    0,160,3,124,1,161,1,125,2,124,2,100,2,117,0,114,
-    19,100,2,103,0,102,2,83,0,124,2,106,4,124,2,106,
-    5,112,25,103,0,102,2,83,0,41,3,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,
+    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,159,0,0,0,114,173,0,0,0,114,49,1,0,
+    0,114,246,0,0,0,114,247,0,0,0,114,7,0,0,0,
+    114,7,0,0,0,114,8,0,0,0,114,248,0,0,0,27,
+    5,0,0,115,8,0,0,0,6,7,4,1,4,255,12,3,
+    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,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,22,0,0,0,100,1,100,2,
+    108,0,109,1,125,2,1,0,124,2,124,0,106,2,131,1,
+    83,0,41,3,78,114,0,0,0,0,41,1,218,15,78,97,
+    109,101,115,112,97,99,101,82,101,97,100,101,114,41,3,114,
+    32,1,0,0,114,78,1,0,0,114,49,1,0,0,41,3,
+    114,143,0,0,0,114,244,0,0,0,114,78,1,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,33,
+    1,0,0,39,5,0,0,115,4,0,0,0,12,1,10,1,
+    122,36,95,78,97,109,101,115,112,97,99,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,78,41,13,114,150,0,0,0,114,149,
+    0,0,0,114,151,0,0,0,114,236,0,0,0,114,233,0,
+    0,0,114,76,1,0,0,114,206,0,0,0,114,1,1,0,
+    0,114,241,0,0,0,114,239,0,0,0,114,245,0,0,0,
+    114,248,0,0,0,114,33,1,0,0,114,7,0,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,75,
+    1,0,0,253,4,0,0,115,22,0,0,0,8,0,8,1,
+    2,3,10,1,8,10,8,3,8,3,8,3,8,3,8,3,
+    12,12,114,75,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,7,100,6,100,7,132,
+    0,131,1,90,8,101,7,100,8,100,9,132,0,131,1,90,
+    9,101,7,100,19,100,11,100,12,132,1,131,1,90,10,101,
+    7,100,20,100,13,100,14,132,1,131,1,90,11,101,7,100,
+    19,100,15,100,16,132,1,131,1,90,12,101,4,100,17,100,
+    18,132,0,131,1,90,13,100,10,83,0,41,21,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,0,0,0,0,0,0,
+    0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,
+    0,0,115,78,0,0,0,116,0,116,1,106,2,160,3,161,
+    0,131,1,68,0,93,22,92,2,125,0,125,1,124,1,100,
+    1,117,0,114,20,116,1,106,2,124,0,61,0,113,7,116,
+    4,124,1,100,2,131,2,114,29,124,1,160,5,161,0,1,
+    0,113,7,116,6,4,0,106,7,100,3,55,0,2,0,95,
+    7,100,1,83,0,41,4,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,114,3,0,0,0,41,
+    8,218,4,108,105,115,116,114,15,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,153,0,0,0,114,80,1,
+    0,0,114,47,1,0,0,114,52,1,0,0,41,2,114,141,
+    0,0,0,218,6,102,105,110,100,101,114,114,7,0,0,0,
+    114,7,0,0,0,114,8,0,0,0,114,80,1,0,0,50,
+    5,0,0,115,14,0,0,0,22,4,8,1,10,1,10,1,
+    8,1,2,128,18,3,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,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,76,0,
+    0,0,116,0,106,1,100,1,117,1,114,14,116,0,106,1,
+    115,14,116,2,160,3,100,2,116,4,161,2,1,0,116,0,
+    106,1,68,0,93,18,125,1,122,7,124,1,124,0,131,1,
+    87,0,2,0,1,0,83,0,4,0,116,5,121,35,1,0,
+    1,0,1,0,89,0,113,17,119,0,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,15,0,0,
+    0,218,10,112,97,116,104,95,104,111,111,107,115,114,99,0,
+    0,0,114,100,0,0,0,114,162,0,0,0,114,142,0,0,
+    0,41,2,114,65,0,0,0,90,4,104,111,111,107,114,7,
+    0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95,
+    112,97,116,104,95,104,111,111,107,115,63,5,0,0,115,18,
+    0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,4,
+    1,2,255,4,3,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,21,122,6,116,0,160,1,161,0,125,1,87,0,110,
+    10,4,0,116,2,121,20,1,0,1,0,1,0,89,0,100,
+    2,83,0,119,0,122,8,116,3,106,4,124,1,25,0,125,
+    2,87,0,124,2,83,0,4,0,116,5,121,49,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,124,2,83,0,119,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,10,0,0,0,78,41,7,114,18,0,
+    0,0,114,82,0,0,0,218,17,70,105,108,101,78,111,116,
+    70,111,117,110,100,69,114,114,111,114,114,15,0,0,0,114,
+    82,1,0,0,218,8,75,101,121,69,114,114,111,114,114,86,
+    1,0,0,41,3,114,221,0,0,0,114,65,0,0,0,114,
+    84,1,0,0,114,7,0,0,0,114,7,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,76,5,0,0,115,28,0,
+    0,0,8,8,2,1,12,1,12,1,6,3,2,253,2,4,
+    12,1,4,4,12,253,10,1,12,1,4,1,2,253,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,7,0,0,0,
+    4,0,0,0,67,0,0,0,115,138,0,0,0,116,0,124,
+    2,100,1,131,2,114,27,116,1,160,2,124,2,161,1,155,
+    0,100,2,157,2,125,3,116,3,160,4,124,3,116,5,161,
+    2,1,0,124,2,160,6,124,1,161,1,92,2,125,4,125,
+    5,110,21,116,1,160,2,124,2,161,1,155,0,100,3,157,
+    2,125,3,116,3,160,4,124,3,116,5,161,2,1,0,124,
+    2,160,7,124,1,161,1,125,4,103,0,125,5,124,4,100,
+    0,117,1,114,58,116,1,160,8,124,1,124,4,161,2,83,
+    0,116,1,160,9,124,1,100,0,161,2,125,6,124,5,124,
+    6,95,10,124,6,83,0,41,4,78,114,161,0,0,0,122,
+    53,46,102,105,110,100,95,115,112,101,99,40,41,32,110,111,
+    116,32,102,111,117,110,100,59,32,102,97,108,108,105,110,103,
+    32,98,97,99,107,32,116,111,32,102,105,110,100,95,108,111,
+    97,100,101,114,40,41,122,53,46,102,105,110,100,95,115,112,
+    101,99,40,41,32,110,111,116,32,102,111,117,110,100,59,32,
+    102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,
+    102,105,110,100,95,109,111,100,117,108,101,40,41,41,11,114,
+    153,0,0,0,114,159,0,0,0,90,12,95,111,98,106,101,
+    99,116,95,110,97,109,101,114,99,0,0,0,114,100,0,0,
+    0,114,162,0,0,0,114,161,0,0,0,114,229,0,0,0,
+    114,224,0,0,0,114,207,0,0,0,114,202,0,0,0,41,
+    7,114,221,0,0,0,114,163,0,0,0,114,84,1,0,0,
+    114,166,0,0,0,114,164,0,0,0,114,165,0,0,0,114,
+    210,0,0,0,114,7,0,0,0,114,7,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,98,5,0,0,115,26,0,0,0,10,4,
+    16,1,12,2,16,1,16,2,12,2,10,1,4,1,8,1,
+    12,1,12,1,6,1,4,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,67,125,5,
+    116,0,124,5,116,1,116,2,102,2,131,2,115,14,113,4,
+    124,0,160,3,124,5,161,1,125,6,124,6,100,1,117,1,
+    114,71,116,4,124,6,100,2,131,2,114,35,124,6,160,5,
+    124,1,124,3,161,2,125,7,110,6,124,0,160,6,124,1,
+    124,6,161,2,125,7,124,7,100,1,117,0,114,46,113,4,
+    124,7,106,7,100,1,117,1,114,55,124,7,2,0,1,0,
+    83,0,124,7,106,8,125,8,124,8,100,1,117,0,114,66,
+    116,9,100,3,131,1,130,1,124,4,160,10,124,8,161,1,
+    1,0,113,4,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,226,
+    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,185,0,0,0,114,
+    109,0,0,0,218,5,98,121,116,101,115,114,89,1,0,0,
+    114,153,0,0,0,114,226,0,0,0,114,90,1,0,0,114,
+    164,0,0,0,114,202,0,0,0,114,142,0,0,0,114,191,
+    0,0,0,114,159,0,0,0,114,207,0,0,0,41,9,114,
+    221,0,0,0,114,163,0,0,0,114,65,0,0,0,114,225,
+    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,84,1,0,0,114,
+    210,0,0,0,114,165,0,0,0,114,7,0,0,0,114,7,
+    0,0,0,114,8,0,0,0,218,9,95,103,101,116,95,115,
+    112,101,99,119,5,0,0,115,42,0,0,0,4,5,8,1,
+    14,1,2,1,10,1,8,1,10,1,14,1,12,2,8,1,
+    2,1,10,1,8,1,6,1,8,1,8,1,10,5,2,128,
+    12,2,6,1,4,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,94,0,0,0,124,2,100,1,117,0,
+    114,7,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,20,100,1,
+    83,0,124,4,106,3,100,1,117,0,114,45,124,4,106,4,
+    125,5,124,5,114,43,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,124,4,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,15,0,0,
+    0,114,65,0,0,0,114,93,1,0,0,114,164,0,0,0,
+    114,202,0,0,0,114,205,0,0,0,114,47,1,0,0,41,
+    6,114,221,0,0,0,114,163,0,0,0,114,65,0,0,0,
+    114,225,0,0,0,114,210,0,0,0,114,92,1,0,0,114,
+    7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,
+    0,0,0,151,5,0,0,115,26,0,0,0,8,6,6,1,
+    14,1,8,1,4,1,10,1,6,1,4,1,6,3,16,1,
+    4,1,4,2,4,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,42,0,0,0,116,0,160,1,100,1,
+    116,2,161,2,1,0,124,0,160,3,124,1,124,2,161,2,
+    125,3,124,3,100,2,117,0,114,18,100,2,83,0,124,3,
+    106,4,83,0,41,3,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,122,101,70,105,108,101,70,105,110,100,101,114,46,102,
-    105,110,100,95,108,111,97,100,101,114,40,41,32,105,115,32,
+    32,32,122,101,80,97,116,104,70,105,110,100,101,114,46,102,
+    105,110,100,95,109,111,100,117,108,101,40,41,32,105,115,32,
     100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,115,
     108,97,116,101,100,32,102,111,114,32,114,101,109,111,118,97,
     108,32,105,110,32,80,121,116,104,111,110,32,51,46,49,50,
     59,32,117,115,101,32,102,105,110,100,95,115,112,101,99,40,
-    41,32,105,110,115,116,101,97,100,78,41,6,114,99,0,0,
-    0,114,100,0,0,0,114,101,0,0,0,114,226,0,0,0,
-    114,164,0,0,0,114,202,0,0,0,41,3,114,143,0,0,
-    0,114,163,0,0,0,114,210,0,0,0,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,161,0,0,0,236,
-    5,0,0,115,14,0,0,0,6,7,2,2,4,254,10,3,
-    8,1,8,1,16,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,201,0,0,0,41,1,
-    114,213,0,0,0,41,7,114,143,0,0,0,114,211,0,0,
-    0,114,163,0,0,0,114,65,0,0,0,90,4,115,109,115,
-    108,114,225,0,0,0,114,164,0,0,0,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,93,1,0,0,251,
-    5,0,0,115,8,0,0,0,10,1,8,1,2,1,6,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,9,0,0,0,67,0,0,0,
-    115,122,1,0,0,100,1,125,3,124,1,160,0,100,2,161,
-    1,100,3,25,0,125,4,122,12,116,1,124,0,106,2,112,
-    17,116,3,160,4,161,0,131,1,106,5,125,5,87,0,110,
-    11,4,0,116,6,121,32,1,0,1,0,1,0,100,4,125,
-    5,89,0,110,1,119,0,124,5,124,0,106,7,107,3,114,
-    45,124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,
-    9,131,0,114,56,124,0,106,10,125,6,124,4,160,11,161,
-    0,125,7,110,5,124,0,106,12,125,6,124,4,125,7,124,
-    7,124,6,118,0,114,108,116,13,124,0,106,2,124,4,131,
-    2,125,8,124,0,106,14,68,0,93,29,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,103,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,74,116,17,124,8,131,1,125,3,124,0,106,
-    14,68,0,93,55,92,2,125,9,125,10,122,10,116,13,124,
-    0,106,2,124,4,124,9,23,0,131,2,125,12,87,0,110,
-    11,4,0,116,18,121,136,1,0,1,0,1,0,89,0,1,
-    0,100,6,83,0,119,0,116,19,106,20,100,7,124,12,100,
-    3,100,8,141,3,1,0,124,7,124,9,23,0,124,6,118,
-    0,114,166,116,15,124,12,131,1,114,166,124,0,160,16,124,
-    10,124,1,124,12,100,6,124,2,161,5,2,0,1,0,83,
-    0,113,111,124,3,114,187,116,19,160,20,100,9,124,8,161,
-    2,1,0,116,19,160,21,124,1,100,6,161,2,125,13,124,
-    8,103,1,124,13,95,22,124,13,83,0,100,6,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,97,0,0,0,114,44,0,0,0,114,130,0,
-    0,0,114,236,0,0,0,78,122,9,116,114,121,105,110,103,
-    32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121,
-    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,23,114,104,0,
-    0,0,114,75,0,0,0,114,65,0,0,0,114,18,0,0,
-    0,114,82,0,0,0,114,35,1,0,0,114,76,0,0,0,
-    114,99,1,0,0,218,11,95,102,105,108,108,95,99,97,99,
-    104,101,114,21,0,0,0,114,102,1,0,0,114,131,0,0,
-    0,114,101,1,0,0,114,67,0,0,0,114,98,1,0,0,
-    114,80,0,0,0,114,93,1,0,0,114,83,0,0,0,114,
-    111,0,0,0,114,159,0,0,0,114,173,0,0,0,114,207,
-    0,0,0,114,202,0,0,0,41,14,114,143,0,0,0,114,
-    163,0,0,0,114,225,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,193,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,44,1,0,0,114,211,
-    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,210,0,
-    0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,114,226,0,0,0,0,6,0,0,115,86,0,0,0,4,
-    5,14,1,2,1,24,1,12,1,8,1,2,255,10,2,8,
-    1,6,1,6,2,6,1,10,1,6,2,4,1,8,2,12,
-    1,14,1,8,1,10,1,8,1,24,1,2,255,8,5,14,
-    2,2,1,20,1,12,1,8,1,2,255,16,2,12,1,8,
-    1,10,1,4,1,8,255,2,128,4,2,12,1,12,1,8,
-    1,4,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,192,0,0,0,124,0,106,0,125,1,122,
-    11,116,1,160,2,124,1,112,11,116,1,160,3,161,0,161,
-    1,125,2,87,0,110,14,4,0,116,4,116,5,116,6,102,
-    3,121,28,1,0,1,0,1,0,103,0,125,2,89,0,110,
-    1,119,0,116,7,106,8,160,9,100,1,161,1,115,41,116,
-    10,124,2,131,1,124,0,95,11,110,37,116,10,131,0,125,
-    3,124,2,68,0,93,28,125,4,124,4,160,12,100,2,161,
-    1,92,3,125,5,125,6,125,7,124,6,114,67,100,3,160,
-    13,124,5,124,7,160,14,161,0,161,2,125,8,110,2,124,
-    5,125,8,124,3,160,15,124,8,161,1,1,0,113,46,124,
-    3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,
-    94,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,
-    17,100,6,83,0,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,14,0,0,0,114,97,0,0,0,114,88,0,0,0,
+    41,32,105,110,115,116,101,97,100,78,114,227,0,0,0,114,
+    228,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
+    0,0,0,114,229,0,0,0,175,5,0,0,115,14,0,0,
+    0,6,8,2,2,4,254,12,3,8,1,4,1,6,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,0,0,0,0,0,0,0,0,
+    0,0,0,0,3,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,2,1,
+    0,124,2,106,2,124,0,105,0,124,1,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,0,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,94,1,0,0,218,18,
+    102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,
+    110,115,41,3,114,144,0,0,0,114,145,0,0,0,114,94,
+    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+    0,0,114,95,1,0,0,191,5,0,0,115,4,0,0,0,
+    12,10,16,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,114,69,0,0,0,114,230,0,0,0,41,14,114,
+    150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,
+    0,0,0,114,233,0,0,0,114,80,1,0,0,114,86,1,
+    0,0,114,234,0,0,0,114,89,1,0,0,114,90,1,0,
+    0,114,93,1,0,0,114,226,0,0,0,114,229,0,0,0,
+    114,95,1,0,0,114,7,0,0,0,114,7,0,0,0,114,
+    7,0,0,0,114,8,0,0,0,114,79,1,0,0,46,5,
+    0,0,115,36,0,0,0,8,0,4,2,2,2,10,1,2,
+    12,10,1,2,12,10,1,2,21,10,1,2,20,12,1,2,
+    31,12,1,2,23,12,1,2,15,14,1,114,79,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,112,0,
+    0,0,103,0,125,3,124,2,68,0,93,16,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,4,124,3,124,0,
+    95,1,124,1,112,27,100,3,124,0,95,2,116,3,124,0,
+    106,2,131,1,115,43,116,4,116,5,160,6,161,0,124,0,
+    106,2,131,2,124,0,95,2,100,4,124,0,95,7,116,8,
+    131,0,124,0,95,9,116,8,131,0,124,0,95,10,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,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0,
-    124,0,93,6,125,1,124,1,160,0,161,0,146,2,113,2,
-    83,0,114,7,0,0,0,41,1,114,131,0,0,0,41,2,
-    114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,7,
-    0,0,0,114,8,0,0,0,114,13,0,0,0,80,6,0,
-    0,115,2,0,0,0,20,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,65,0,0,0,114,18,0,0,0,
-    90,7,108,105,115,116,100,105,114,114,82,0,0,0,114,87,
-    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,15,0,0,0,114,25,0,
-    0,0,114,26,0,0,0,114,100,1,0,0,114,101,1,0,
-    0,114,126,0,0,0,114,89,0,0,0,114,131,0,0,0,
-    218,3,97,100,100,114,27,0,0,0,114,102,1,0,0,41,
-    9,114,143,0,0,0,114,65,0,0,0,90,8,99,111,110,
-    116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102,
-    102,105,120,95,99,111,110,116,101,110,116,115,114,72,1,0,
-    0,114,141,0,0,0,114,56,1,0,0,114,44,1,0,0,
-    90,8,110,101,119,95,110,97,109,101,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,114,104,1,0,0,51,6,
-    0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,8,
-    3,2,253,12,6,12,1,6,7,8,1,16,1,4,1,18,
-    1,4,2,12,1,6,1,12,1,20,1,4,255,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,
+    0,3,0,0,0,51,0,0,0,115,24,0,0,0,129,0,
+    124,0,93,7,125,1,124,1,136,0,102,2,86,0,1,0,
+    113,2,100,0,83,0,114,69,0,0,0,114,7,0,0,0,
+    114,43,1,0,0,169,1,114,164,0,0,0,114,7,0,0,
+    0,114,8,0,0,0,114,9,0,0,0,220,5,0,0,115,
+    4,0,0,0,2,128,22,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,97,0,0,0,114,130,0,0,0,78,41,11,114,191,0,
+    0,0,218,8,95,108,111,97,100,101,114,115,114,65,0,0,
+    0,114,86,0,0,0,114,67,0,0,0,114,18,0,0,0,
+    114,82,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,143,0,0,0,
+    114,65,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,212,
+    0,0,0,114,7,0,0,0,114,97,1,0,0,114,8,0,
+    0,0,114,236,0,0,0,214,5,0,0,115,20,0,0,0,
+    4,4,12,1,26,1,6,1,10,2,10,1,18,1,6,1,
+    8,1,12,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,130,0,0,0,78,41,1,114,99,1,0,
+    0,114,21,1,0,0,114,7,0,0,0,114,7,0,0,0,
+    114,8,0,0,0,114,80,1,0,0,230,5,0,0,114,81,
+    0,0,0,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,4,0,0,0,67,0,0,0,115,54,0,0,0,116,
+    0,160,1,100,1,116,2,161,2,1,0,124,0,160,3,124,
+    1,161,1,125,2,124,2,100,2,117,0,114,19,100,2,103,
+    0,102,2,83,0,124,2,106,4,124,2,106,5,112,25,103,
+    0,102,2,83,0,41,3,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,122,101,
+    70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,
+    108,111,97,100,101,114,40,41,32,105,115,32,100,101,112,114,
+    101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,101,
+    100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,110,
+    32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,115,
+    101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
+    115,116,101,97,100,78,41,6,114,99,0,0,0,114,100,0,
+    0,0,114,101,0,0,0,114,226,0,0,0,114,164,0,0,
+    0,114,202,0,0,0,41,3,114,143,0,0,0,114,163,0,
+    0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,0,
+    0,114,8,0,0,0,114,161,0,0,0,236,5,0,0,115,
+    14,0,0,0,6,7,2,2,4,254,10,3,8,1,8,1,
+    16,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,201,0,0,0,41,1,114,213,0,0,
+    0,41,7,114,143,0,0,0,114,211,0,0,0,114,163,0,
+    0,0,114,65,0,0,0,90,4,115,109,115,108,114,225,0,
+    0,0,114,164,0,0,0,114,7,0,0,0,114,7,0,0,
+    0,114,8,0,0,0,114,93,1,0,0,251,5,0,0,115,
+    8,0,0,0,10,1,8,1,2,1,6,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,9,0,0,0,67,0,0,0,115,122,1,0,
+    0,100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,
+    0,125,4,122,12,116,1,124,0,106,2,112,17,116,3,160,
+    4,161,0,131,1,106,5,125,5,87,0,110,11,4,0,116,
+    6,121,32,1,0,1,0,1,0,100,4,125,5,89,0,110,
+    1,119,0,124,5,124,0,106,7,107,3,114,45,124,0,160,
+    8,161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,
+    56,124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,
+    5,124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,
+    0,114,108,116,13,124,0,106,2,124,4,131,2,125,8,124,
+    0,106,14,68,0,93,29,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,103,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,
+    74,116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,
+    55,92,2,125,9,125,10,122,10,116,13,124,0,106,2,124,
+    4,124,9,23,0,131,2,125,12,87,0,110,11,4,0,116,
+    18,121,136,1,0,1,0,1,0,89,0,1,0,100,6,83,
+    0,119,0,116,19,106,20,100,7,124,12,100,3,100,8,141,
+    3,1,0,124,7,124,9,23,0,124,6,118,0,114,166,116,
+    15,124,12,131,1,114,166,124,0,160,16,124,10,124,1,124,
+    12,100,6,124,2,161,5,2,0,1,0,83,0,113,111,124,
+    3,114,187,116,19,160,20,100,9,124,8,161,2,1,0,116,
+    19,160,21,124,1,100,6,161,2,125,13,124,8,103,1,124,
+    13,95,22,124,13,83,0,100,6,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,
+    97,0,0,0,114,44,0,0,0,114,130,0,0,0,114,236,
+    0,0,0,78,122,9,116,114,121,105,110,103,32,123,125,41,
+    1,90,9,118,101,114,98,111,115,105,116,121,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,23,114,104,0,0,0,114,75,
+    0,0,0,114,65,0,0,0,114,18,0,0,0,114,82,0,
+    0,0,114,35,1,0,0,114,76,0,0,0,114,99,1,0,
+    0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,21,
+    0,0,0,114,102,1,0,0,114,131,0,0,0,114,101,1,
+    0,0,114,67,0,0,0,114,98,1,0,0,114,80,0,0,
+    0,114,93,1,0,0,114,83,0,0,0,114,111,0,0,0,
+    114,159,0,0,0,114,173,0,0,0,114,207,0,0,0,114,
+    202,0,0,0,41,14,114,143,0,0,0,114,163,0,0,0,
+    114,225,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,193,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,44,1,0,0,114,211,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,210,0,0,0,114,7,
+    0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,0,
+    0,0,0,6,0,0,115,86,0,0,0,4,5,14,1,2,
+    1,24,1,12,1,8,1,2,255,10,2,8,1,6,1,6,
+    2,6,1,10,1,6,2,4,1,8,2,12,1,14,1,8,
+    1,10,1,8,1,24,1,2,255,8,5,14,2,2,1,20,
+    1,12,1,8,1,2,255,16,2,12,1,8,1,10,1,4,
+    1,8,255,2,128,4,2,12,1,12,1,8,1,4,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,192,0,0,0,124,0,106,0,125,1,122,11,116,1,160,
+    2,124,1,112,11,116,1,160,3,161,0,161,1,125,2,87,
+    0,110,14,4,0,116,4,116,5,116,6,102,3,121,28,1,
+    0,1,0,1,0,103,0,125,2,89,0,110,1,119,0,116,
+    7,106,8,160,9,100,1,161,1,115,41,116,10,124,2,131,
+    1,124,0,95,11,110,37,116,10,131,0,125,3,124,2,68,
+    0,93,28,125,4,124,4,160,12,100,2,161,1,92,3,125,
+    5,125,6,125,7,124,6,114,67,100,3,160,13,124,5,124,
+    7,160,14,161,0,161,2,125,8,110,2,124,5,125,8,124,
+    3,160,15,124,8,161,1,1,0,113,46,124,3,124,0,95,
+    11,116,7,106,8,160,9,116,16,161,1,114,94,100,4,100,
+    5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83,
+    0,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,14,0,
+    0,0,114,97,0,0,0,114,88,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,6,
+    125,1,124,1,160,0,161,0,146,2,113,2,83,0,114,7,
+    0,0,0,41,1,114,131,0,0,0,41,2,114,5,0,0,
+    0,90,2,102,110,114,7,0,0,0,114,7,0,0,0,114,
+    8,0,0,0,114,13,0,0,0,80,6,0,0,115,2,0,
+    0,0,20,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,65,0,0,0,114,18,0,0,0,90,7,108,105,
+    115,116,100,105,114,114,82,0,0,0,114,87,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,15,0,0,0,114,25,0,0,0,114,26,
+    0,0,0,114,100,1,0,0,114,101,1,0,0,114,126,0,
+    0,0,114,89,0,0,0,114,131,0,0,0,218,3,97,100,
+    100,114,27,0,0,0,114,102,1,0,0,41,9,114,143,0,
+    0,0,114,65,0,0,0,90,8,99,111,110,116,101,110,116,
+    115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,
+    99,111,110,116,101,110,116,115,114,72,1,0,0,114,141,0,
+    0,0,114,56,1,0,0,114,44,1,0,0,90,8,110,101,
+    119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0,
+    114,8,0,0,0,114,104,1,0,0,51,6,0,0,115,38,
+    0,0,0,6,2,2,1,22,1,18,1,8,3,2,253,12,
+    6,12,1,6,7,8,1,16,1,4,1,18,1,4,2,12,
+    1,6,1,12,1,20,1,4,255,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,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,10,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,71,0,0,0,41,2,114,83,0,0,0,114,
-    142,0,0,0,114,71,0,0,0,169,2,114,221,0,0,0,
-    114,103,1,0,0,114,7,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,92,6,0,0,115,6,0,
-    0,0,8,2,12,1,16,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,7,0,0,0,41,3,114,221,0,0,0,114,103,1,0,
-    0,114,109,1,0,0,114,7,0,0,0,114,108,1,0,0,
-    114,8,0,0,0,218,9,112,97,116,104,95,104,111,111,107,
-    82,6,0,0,115,4,0,0,0,14,10,4,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,114,69,1,0,
-    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,89,0,0,0,114,65,0,
-    0,0,114,21,1,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,114,70,1,0,0,100,6,0,0,114,
-    63,1,0,0,122,19,70,105,108,101,70,105,110,100,101,114,
-    46,95,95,114,101,112,114,95,95,114,69,0,0,0,41,15,
-    114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,
-    152,0,0,0,114,236,0,0,0,114,80,1,0,0,114,167,
-    0,0,0,114,229,0,0,0,114,161,0,0,0,114,93,1,
-    0,0,114,226,0,0,0,114,104,1,0,0,114,234,0,0,
-    0,114,110,1,0,0,114,70,1,0,0,114,7,0,0,0,
-    114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    96,1,0,0,205,5,0,0,115,24,0,0,0,8,0,4,
-    2,8,7,8,16,4,4,8,2,8,15,10,5,8,51,2,
-    31,10,1,12,17,114,96,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,33,
-    124,5,114,18,124,5,106,1,125,4,110,15,124,2,124,3,
-    107,2,114,28,116,2,124,1,124,2,131,2,125,4,110,5,
-    116,3,124,1,124,2,131,2,125,4,124,5,115,42,116,4,
-    124,1,124,2,124,4,100,3,141,3,125,5,122,19,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,
-    100,0,83,0,4,0,116,5,121,71,1,0,1,0,1,0,
-    89,0,100,0,83,0,119,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,97,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,164,0,0,0,114,41,1,0,0,114,34,1,
-    0,0,114,213,0,0,0,218,9,69,120,99,101,112,116,105,
-    111,110,41,6,90,2,110,115,114,141,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,164,0,0,0,114,210,0,0,0,114,7,0,0,
-    0,114,7,0,0,0,114,8,0,0,0,218,14,95,102,105,
-    120,95,117,112,95,109,111,100,117,108,101,106,6,0,0,115,
-    36,0,0,0,10,2,10,1,4,1,4,1,8,1,8,1,
-    12,1,10,2,4,1,14,1,2,1,8,1,8,1,8,1,
-    14,1,12,1,6,2,2,254,114,115,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,30,1,0,0,114,187,0,0,0,
-    218,18,101,120,116,101,110,115,105,111,110,95,115,117,102,102,
-    105,120,101,115,114,34,1,0,0,114,127,0,0,0,114,41,
-    1,0,0,114,113,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,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,208,0,0,0,129,6,0,0,
-    115,8,0,0,0,12,5,8,1,8,1,10,1,114,208,0,
-    0,0,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,8,0,0,0,
-    124,0,97,0,100,0,83,0,114,69,0,0,0,41,1,114,
-    159,0,0,0,41,1,218,17,95,98,111,111,116,115,116,114,
-    97,112,95,109,111,100,117,108,101,114,7,0,0,0,114,7,
-    0,0,0,114,8,0,0,0,218,21,95,115,101,116,95,98,
-    111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,140,
-    6,0,0,115,2,0,0,0,8,2,114,118,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,
-    118,1,0,0,114,208,0,0,0,114,15,0,0,0,114,85,
-    1,0,0,114,191,0,0,0,114,96,1,0,0,114,110,1,
-    0,0,218,9,109,101,116,97,95,112,97,116,104,114,61,0,
-    0,0,114,79,1,0,0,41,2,114,117,1,0,0,90,17,
-    115,117,112,112,111,114,116,101,100,95,108,111,97,100,101,114,
-    115,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    218,8,95,105,110,115,116,97,108,108,145,6,0,0,115,8,
-    0,0,0,8,2,6,1,20,1,16,1,114,120,1,0,0,
-    41,1,114,87,0,0,0,114,69,0,0,0,41,3,78,78,
-    78,41,2,114,0,0,0,0,114,0,0,0,0,41,1,84,
-    41,85,114,152,0,0,0,114,159,0,0,0,114,187,0,0,
-    0,114,91,0,0,0,114,15,0,0,0,114,99,0,0,0,
-    114,184,0,0,0,114,25,0,0,0,114,231,0,0,0,90,
-    2,110,116,114,18,0,0,0,114,215,0,0,0,90,5,112,
-    111,115,105,120,114,50,0,0,0,218,3,97,108,108,114,59,
-    0,0,0,114,136,0,0,0,114,57,0,0,0,114,62,0,
-    0,0,90,20,95,112,97,116,104,115,101,112,115,95,119,105,
-    116,104,95,99,111,108,111,110,114,28,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,27,0,0,0,114,29,0,0,0,114,21,
-    0,0,0,114,36,0,0,0,114,42,0,0,0,114,45,0,
-    0,0,114,67,0,0,0,114,74,0,0,0,114,75,0,0,
-    0,114,79,0,0,0,114,80,0,0,0,114,83,0,0,0,
-    114,86,0,0,0,114,95,0,0,0,218,4,116,121,112,101,
-    218,8,95,95,99,111,100,101,95,95,114,186,0,0,0,114,
-    34,0,0,0,114,172,0,0,0,114,33,0,0,0,114,39,
-    0,0,0,114,8,1,0,0,114,116,0,0,0,114,112,0,
-    0,0,114,127,0,0,0,114,61,0,0,0,114,116,1,0,
-    0,114,232,0,0,0,114,113,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,121,0,0,0,114,128,0,0,0,114,135,0,0,0,
-    114,137,0,0,0,114,139,0,0,0,114,160,0,0,0,114,
-    167,0,0,0,114,176,0,0,0,114,180,0,0,0,114,182,
-    0,0,0,114,189,0,0,0,114,194,0,0,0,114,195,0,
-    0,0,114,200,0,0,0,218,6,111,98,106,101,99,116,114,
-    209,0,0,0,114,213,0,0,0,114,214,0,0,0,114,235,
-    0,0,0,114,249,0,0,0,114,11,1,0,0,114,34,1,
-    0,0,114,41,1,0,0,114,30,1,0,0,114,47,1,0,
-    0,114,75,1,0,0,114,79,1,0,0,114,96,1,0,0,
-    114,115,1,0,0,114,208,0,0,0,114,118,1,0,0,114,
-    120,1,0,0,114,7,0,0,0,114,7,0,0,0,114,7,
-    0,0,0,114,8,0,0,0,218,8,60,109,111,100,117,108,
-    101,62,1,0,0,0,115,180,0,0,0,4,0,4,22,8,
-    3,8,1,8,1,8,1,8,1,10,3,4,1,8,1,10,
-    1,8,2,4,3,10,1,6,2,22,2,8,1,8,1,10,
-    1,14,1,4,4,4,1,2,1,2,1,4,255,8,4,6,
-    16,8,3,8,5,8,5,4,6,10,1,8,30,8,6,8,
-    8,8,10,8,9,8,5,4,7,10,1,8,8,10,5,10,
-    22,0,127,16,30,12,1,4,2,4,1,6,2,4,1,10,
-    1,8,2,6,2,8,2,16,2,8,71,8,40,8,19,8,
-    12,8,12,8,31,8,20,8,33,8,28,10,24,10,13,10,
-    10,8,11,6,14,4,3,2,1,12,255,14,73,14,67,16,
-    30,0,127,14,17,18,50,18,45,18,25,14,53,14,69,14,
-    49,0,127,14,32,0,127,10,30,8,23,8,11,12,5,
+    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,10,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,
+    71,0,0,0,41,2,114,83,0,0,0,114,142,0,0,0,
+    114,71,0,0,0,169,2,114,221,0,0,0,114,103,1,0,
+    0,114,7,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,92,6,0,0,115,6,0,0,0,8,2,
+    12,1,16,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,7,0,0,
+    0,41,3,114,221,0,0,0,114,103,1,0,0,114,109,1,
+    0,0,114,7,0,0,0,114,108,1,0,0,114,8,0,0,
+    0,218,9,112,97,116,104,95,104,111,111,107,82,6,0,0,
+    115,4,0,0,0,14,10,4,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,114,69,1,0,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,89,0,0,0,114,65,0,0,0,114,21,
+    1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
+    0,0,114,70,1,0,0,100,6,0,0,114,63,1,0,0,
+    122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114,
+    101,112,114,95,95,114,69,0,0,0,41,15,114,150,0,0,
+    0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,
+    114,236,0,0,0,114,80,1,0,0,114,167,0,0,0,114,
+    229,0,0,0,114,161,0,0,0,114,93,1,0,0,114,226,
+    0,0,0,114,104,1,0,0,114,234,0,0,0,114,110,1,
+    0,0,114,70,1,0,0,114,7,0,0,0,114,7,0,0,
+    0,114,7,0,0,0,114,8,0,0,0,114,96,1,0,0,
+    205,5,0,0,115,24,0,0,0,8,0,4,2,8,7,8,
+    16,4,4,8,2,8,15,10,5,8,51,2,31,10,1,12,
+    17,114,96,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,33,124,5,114,18,
+    124,5,106,1,125,4,110,15,124,2,124,3,107,2,114,28,
+    116,2,124,1,124,2,131,2,125,4,110,5,116,3,124,1,
+    124,2,131,2,125,4,124,5,115,42,116,4,124,1,124,2,
+    124,4,100,3,141,3,125,5,122,19,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,100,0,83,0,
+    4,0,116,5,121,71,1,0,1,0,1,0,89,0,100,0,
+    83,0,119,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,97,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,
+    164,0,0,0,114,41,1,0,0,114,34,1,0,0,114,213,
+    0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6,
+    90,2,110,115,114,141,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,164,
+    0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,
+    0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112,
+    95,109,111,100,117,108,101,106,6,0,0,115,36,0,0,0,
+    10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2,
+    4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1,
+    6,2,2,254,114,115,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,30,1,0,0,114,187,0,0,0,218,18,101,120,
+    116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,115,
+    114,34,1,0,0,114,127,0,0,0,114,41,1,0,0,114,
+    113,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,7,0,0,0,114,7,0,0,0,114,8,
+    0,0,0,114,208,0,0,0,129,6,0,0,115,8,0,0,
+    0,12,5,8,1,8,1,10,1,114,208,0,0,0,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,8,0,0,0,124,0,97,0,
+    100,0,83,0,114,69,0,0,0,41,1,114,159,0,0,0,
+    41,1,218,17,95,98,111,111,116,115,116,114,97,112,95,109,
+    111,100,117,108,101,114,7,0,0,0,114,7,0,0,0,114,
+    8,0,0,0,218,21,95,115,101,116,95,98,111,111,116,115,
+    116,114,97,112,95,109,111,100,117,108,101,140,6,0,0,115,
+    2,0,0,0,8,2,114,118,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,118,1,0,0,
+    114,208,0,0,0,114,15,0,0,0,114,85,1,0,0,114,
+    191,0,0,0,114,96,1,0,0,114,110,1,0,0,218,9,
+    109,101,116,97,95,112,97,116,104,114,61,0,0,0,114,79,
+    1,0,0,41,2,114,117,1,0,0,90,17,115,117,112,112,
+    111,114,116,101,100,95,108,111,97,100,101,114,115,114,7,0,
+    0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,105,
+    110,115,116,97,108,108,145,6,0,0,115,8,0,0,0,8,
+    2,6,1,20,1,16,1,114,120,1,0,0,41,1,114,87,
+    0,0,0,114,69,0,0,0,41,3,78,78,78,41,2,114,
+    0,0,0,0,114,0,0,0,0,41,1,84,41,85,114,152,
+    0,0,0,114,159,0,0,0,114,187,0,0,0,114,91,0,
+    0,0,114,15,0,0,0,114,99,0,0,0,114,184,0,0,
+    0,114,25,0,0,0,114,231,0,0,0,90,2,110,116,114,
+    18,0,0,0,114,215,0,0,0,90,5,112,111,115,105,120,
+    114,50,0,0,0,218,3,97,108,108,114,59,0,0,0,114,
+    136,0,0,0,114,57,0,0,0,114,62,0,0,0,90,20,
+    95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99,
+    111,108,111,110,114,28,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,27,0,0,0,114,29,0,0,0,114,21,0,0,0,114,
+    36,0,0,0,114,42,0,0,0,114,45,0,0,0,114,67,
+    0,0,0,114,74,0,0,0,114,75,0,0,0,114,79,0,
+    0,0,114,80,0,0,0,114,83,0,0,0,114,86,0,0,
+    0,114,95,0,0,0,218,4,116,121,112,101,218,8,95,95,
+    99,111,100,101,95,95,114,186,0,0,0,114,34,0,0,0,
+    114,172,0,0,0,114,33,0,0,0,114,39,0,0,0,114,
+    8,1,0,0,114,116,0,0,0,114,112,0,0,0,114,127,
+    0,0,0,114,61,0,0,0,114,116,1,0,0,114,232,0,
+    0,0,114,113,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,121,0,
+    0,0,114,128,0,0,0,114,135,0,0,0,114,137,0,0,
+    0,114,139,0,0,0,114,160,0,0,0,114,167,0,0,0,
+    114,176,0,0,0,114,180,0,0,0,114,182,0,0,0,114,
+    189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,200,
+    0,0,0,218,6,111,98,106,101,99,116,114,209,0,0,0,
+    114,213,0,0,0,114,214,0,0,0,114,235,0,0,0,114,
+    249,0,0,0,114,11,1,0,0,114,34,1,0,0,114,41,
+    1,0,0,114,30,1,0,0,114,47,1,0,0,114,75,1,
+    0,0,114,79,1,0,0,114,96,1,0,0,114,115,1,0,
+    0,114,208,0,0,0,114,118,1,0,0,114,120,1,0,0,
+    114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
+    8,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,
+    0,0,115,180,0,0,0,4,0,4,22,8,3,8,1,8,
+    1,8,1,8,1,10,3,4,1,8,1,10,1,8,2,4,
+    3,10,1,6,2,22,2,8,1,8,1,10,1,14,1,4,
+    4,4,1,2,1,2,1,4,255,8,4,6,16,8,3,8,
+    5,8,5,4,6,10,1,8,30,8,6,8,8,8,10,8,
+    9,8,5,4,7,10,1,8,8,10,5,10,22,0,127,16,
+    30,12,1,4,2,4,1,6,2,4,1,10,1,8,2,6,
+    2,8,2,16,2,8,71,8,40,8,19,8,12,8,12,8,
+    31,8,20,8,33,8,28,10,24,10,13,10,10,8,11,6,
+    14,4,3,2,1,12,255,14,73,14,67,16,30,0,127,14,
+    17,18,50,18,45,18,25,14,53,14,69,14,49,0,127,14,
+    32,0,127,10,30,8,23,8,11,12,5,
 };
index 3c47684..aa96cb1 100644 (file)
@@ -921,143 +921,142 @@ const unsigned char _Py_M__zipimport[] = {
     101,90,11,115,111,117,114,99,101,95,115,105,122,101,114,53,
     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,123,2,0,0,115,72,0,0,0,2,2,2,1,
+    111,100,101,123,2,0,0,115,68,0,0,0,2,2,2,1,
     6,254,14,5,12,2,4,1,12,1,10,1,2,1,2,255,
-    8,1,2,255,10,2,8,1,4,1,4,1,2,1,4,254,
-    4,5,8,1,4,255,2,128,8,4,6,255,4,3,22,3,
-    18,1,2,255,4,2,8,1,4,255,4,2,18,2,10,1,
-    16,1,4,1,114,161,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,168,2,0,0,115,6,0,0,0,12,1,12,1,4,
-    1,114,165,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,
-    79,0,0,0,84,41,1,90,12,100,111,110,116,95,105,110,
-    104,101,114,105,116,41,2,114,165,0,0,0,218,7,99,111,
-    109,112,105,108,101,41,2,114,60,0,0,0,114,164,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,175,2,0,0,115,4,0,0,0,8,1,16,1,114,167,
-    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,93,0,0,0,
-    114,14,0,0,0,41,2,114,137,0,0,0,90,6,109,107,
-    116,105,109,101,41,2,218,1,100,114,144,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,181,2,0,
-    0,115,18,0,0,0,4,1,10,1,10,1,6,1,6,1,
-    10,1,10,1,6,1,6,249,114,175,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,110,0,0,0,122,41,124,1,100,
-    1,100,0,133,2,25,0,100,2,118,0,115,11,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,54,1,0,1,0,1,
-    0,89,0,100,6,83,0,119,0,41,7,78,114,14,0,0,
-    0,169,2,218,1,99,218,1,111,114,169,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,175,0,0,0,
-    114,26,0,0,0,218,10,73,110,100,101,120,69,114,114,111,
-    114,114,160,0,0,0,41,6,114,32,0,0,0,114,13,0,
-    0,0,114,61,0,0,0,114,137,0,0,0,114,138,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,157,0,0,0,194,2,0,0,115,22,0,0,
-    0,2,1,20,2,12,1,10,1,8,3,8,1,8,1,16,
-    1,18,1,6,1,2,255,114,157,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,80,0,0,0,124,1,100,1,100,0,
-    133,2,25,0,100,2,118,0,115,10,74,0,130,1,124,1,
-    100,0,100,1,133,2,25,0,125,1,122,7,124,0,106,0,
-    124,1,25,0,125,2,87,0,110,10,4,0,116,1,121,33,
-    1,0,1,0,1,0,89,0,100,0,83,0,119,0,116,2,
-    124,0,106,3,124,2,131,2,83,0,41,3,78,114,14,0,
-    0,0,114,176,0,0,0,41,4,114,28,0,0,0,114,26,
-    0,0,0,114,59,0,0,0,114,29,0,0,0,41,3,114,
-    32,0,0,0,114,13,0,0,0,114,61,0,0,0,114,9,
-    0,0,0,114,9,0,0,0,114,10,0,0,0,114,155,0,
-    0,0,213,2,0,0,115,16,0,0,0,20,2,12,1,2,
-    2,14,1,12,1,6,1,2,255,12,3,114,155,0,0,0,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,14,0,0,
-    0,11,0,0,0,67,0,0,0,115,14,1,0,0,116,0,
-    124,0,124,1,131,2,125,2,100,0,125,3,116,1,68,0,
-    93,102,92,3,125,4,125,5,125,6,124,2,124,4,23,0,
-    125,7,116,2,106,3,100,1,124,0,106,4,116,5,124,7,
-    100,2,100,3,141,5,1,0,122,7,124,0,106,6,124,7,
-    25,0,125,8,87,0,110,9,4,0,116,7,121,45,1,0,
-    1,0,1,0,89,0,113,9,119,0,124,8,100,4,25,0,
-    125,9,116,8,124,0,106,4,124,8,131,2,125,10,100,0,
-    125,11,124,5,114,91,122,10,116,9,124,0,124,9,124,7,
-    124,1,124,10,131,5,125,11,87,0,110,25,4,0,116,10,
-    121,90,1,0,125,12,1,0,122,8,124,12,125,3,87,0,
-    89,0,100,0,125,12,126,12,110,10,100,0,125,12,126,12,
-    119,1,119,0,116,11,124,9,124,10,131,2,125,11,124,11,
-    100,0,117,0,114,101,113,9,124,8,100,4,25,0,125,9,
-    124,11,124,6,124,9,102,3,2,0,1,0,83,0,124,3,
-    114,126,100,5,124,3,155,0,157,2,125,13,116,12,124,13,
-    124,1,100,6,141,2,124,3,130,2,116,12,100,7,124,1,
-    155,2,157,2,124,1,100,6,141,2,130,1,41,8,78,122,
-    13,116,114,121,105,110,103,32,123,125,123,125,123,125,114,93,
-    0,0,0,41,1,90,9,118,101,114,98,111,115,105,116,121,
-    114,0,0,0,0,122,20,109,111,100,117,108,101,32,108,111,
-    97,100,32,102,97,105,108,101,100,58,32,114,65,0,0,0,
-    114,64,0,0,0,41,13,114,39,0,0,0,114,95,0,0,
-    0,114,48,0,0,0,114,81,0,0,0,114,29,0,0,0,
-    114,20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,
-    59,0,0,0,114,161,0,0,0,114,80,0,0,0,114,167,
-    0,0,0,114,3,0,0,0,41,14,114,32,0,0,0,114,
-    41,0,0,0,114,13,0,0,0,90,12,105,109,112,111,114,
-    116,95,101,114,114,111,114,114,96,0,0,0,114,97,0,0,
-    0,114,54,0,0,0,114,69,0,0,0,114,61,0,0,0,
-    114,43,0,0,0,114,132,0,0,0,114,53,0,0,0,90,
-    3,101,120,99,114,82,0,0,0,114,9,0,0,0,114,9,
-    0,0,0,114,10,0,0,0,114,51,0,0,0,228,2,0,
-    0,115,58,0,0,0,10,1,4,1,14,1,8,1,22,1,
-    2,1,14,1,12,1,4,1,2,255,8,3,12,1,4,1,
-    4,1,2,1,20,1,14,1,16,1,8,128,2,255,10,3,
-    8,1,2,3,8,1,14,1,4,2,10,1,14,1,18,2,
-    114,51,0,0,0,41,46,114,91,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,48,0,0,0,114,
-    154,0,0,0,114,116,0,0,0,114,158,0,0,0,114,72,
-    0,0,0,114,137,0,0,0,114,35,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,80,0,0,0,114,3,0,0,0,114,25,0,0,0,
-    218,4,116,121,112,101,114,75,0,0,0,114,119,0,0,0,
-    114,121,0,0,0,114,123,0,0,0,90,13,95,76,111,97,
-    100,101,114,66,97,115,105,99,115,114,4,0,0,0,114,95,
-    0,0,0,114,39,0,0,0,114,40,0,0,0,114,38,0,
-    0,0,114,27,0,0,0,114,128,0,0,0,114,148,0,0,
-    0,114,150,0,0,0,114,59,0,0,0,114,153,0,0,0,
-    114,161,0,0,0,218,8,95,95,99,111,100,101,95,95,114,
-    159,0,0,0,114,165,0,0,0,114,167,0,0,0,114,175,
-    0,0,0,114,157,0,0,0,114,155,0,0,0,114,51,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,90,0,0,0,4,0,8,16,16,1,8,
-    1,8,1,8,1,8,1,8,1,8,1,8,1,8,2,6,
-    3,14,1,16,3,4,4,8,2,4,2,4,1,4,1,18,
-    2,0,127,0,127,12,50,12,1,2,1,2,1,4,252,8,
-    9,8,4,8,9,8,31,2,126,2,254,4,29,8,5,8,
-    21,8,46,8,8,10,40,8,5,8,7,8,6,8,13,8,
-    19,12,15,
+    10,1,10,1,8,1,4,1,4,1,2,1,4,254,4,5,
+    8,1,4,255,2,128,8,4,6,255,4,3,22,3,20,1,
+    4,1,8,1,4,255,4,2,18,2,10,1,16,1,4,1,
+    114,161,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,168,2,
+    0,0,115,6,0,0,0,12,1,12,1,4,1,114,165,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,79,0,0,0,
+    84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,
+    116,41,2,114,165,0,0,0,218,7,99,111,109,112,105,108,
+    101,41,2,114,60,0,0,0,114,164,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,175,2,0,
+    0,115,4,0,0,0,8,1,16,1,114,167,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,93,0,0,0,114,14,0,0,
+    0,41,2,114,137,0,0,0,90,6,109,107,116,105,109,101,
+    41,2,218,1,100,114,144,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,181,2,0,0,115,18,0,
+    0,0,4,1,10,1,10,1,6,1,6,1,10,1,10,1,
+    6,1,6,249,114,175,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,110,0,0,0,122,41,124,1,100,1,100,0,133,
+    2,25,0,100,2,118,0,115,11,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,54,1,0,1,0,1,0,89,0,100,
+    6,83,0,119,0,41,7,78,114,14,0,0,0,169,2,218,
+    1,99,218,1,111,114,169,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,175,0,0,0,114,26,0,0,
+    0,218,10,73,110,100,101,120,69,114,114,111,114,114,160,0,
+    0,0,41,6,114,32,0,0,0,114,13,0,0,0,114,61,
+    0,0,0,114,137,0,0,0,114,138,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,
+    157,0,0,0,194,2,0,0,115,22,0,0,0,2,1,20,
+    2,12,1,10,1,8,3,8,1,8,1,16,1,18,1,6,
+    1,2,255,114,157,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,80,0,0,0,124,1,100,1,100,0,133,2,25,0,
+    100,2,118,0,115,10,74,0,130,1,124,1,100,0,100,1,
+    133,2,25,0,125,1,122,7,124,0,106,0,124,1,25,0,
+    125,2,87,0,110,10,4,0,116,1,121,33,1,0,1,0,
+    1,0,89,0,100,0,83,0,119,0,116,2,124,0,106,3,
+    124,2,131,2,83,0,41,3,78,114,14,0,0,0,114,176,
+    0,0,0,41,4,114,28,0,0,0,114,26,0,0,0,114,
+    59,0,0,0,114,29,0,0,0,41,3,114,32,0,0,0,
+    114,13,0,0,0,114,61,0,0,0,114,9,0,0,0,114,
+    9,0,0,0,114,10,0,0,0,114,155,0,0,0,213,2,
+    0,0,115,16,0,0,0,20,2,12,1,2,2,14,1,12,
+    1,6,1,2,255,12,3,114,155,0,0,0,99,2,0,0,
+    0,0,0,0,0,0,0,0,0,14,0,0,0,11,0,0,
+    0,67,0,0,0,115,14,1,0,0,116,0,124,0,124,1,
+    131,2,125,2,100,0,125,3,116,1,68,0,93,102,92,3,
+    125,4,125,5,125,6,124,2,124,4,23,0,125,7,116,2,
+    106,3,100,1,124,0,106,4,116,5,124,7,100,2,100,3,
+    141,5,1,0,122,7,124,0,106,6,124,7,25,0,125,8,
+    87,0,110,9,4,0,116,7,121,45,1,0,1,0,1,0,
+    89,0,113,9,119,0,124,8,100,4,25,0,125,9,116,8,
+    124,0,106,4,124,8,131,2,125,10,100,0,125,11,124,5,
+    114,91,122,10,116,9,124,0,124,9,124,7,124,1,124,10,
+    131,5,125,11,87,0,110,25,4,0,116,10,121,90,1,0,
+    125,12,1,0,122,8,124,12,125,3,87,0,89,0,100,0,
+    125,12,126,12,110,10,100,0,125,12,126,12,119,1,119,0,
+    116,11,124,9,124,10,131,2,125,11,124,11,100,0,117,0,
+    114,101,113,9,124,8,100,4,25,0,125,9,124,11,124,6,
+    124,9,102,3,2,0,1,0,83,0,124,3,114,126,100,5,
+    124,3,155,0,157,2,125,13,116,12,124,13,124,1,100,6,
+    141,2,124,3,130,2,116,12,100,7,124,1,155,2,157,2,
+    124,1,100,6,141,2,130,1,41,8,78,122,13,116,114,121,
+    105,110,103,32,123,125,123,125,123,125,114,93,0,0,0,41,
+    1,90,9,118,101,114,98,111,115,105,116,121,114,0,0,0,
+    0,122,20,109,111,100,117,108,101,32,108,111,97,100,32,102,
+    97,105,108,101,100,58,32,114,65,0,0,0,114,64,0,0,
+    0,41,13,114,39,0,0,0,114,95,0,0,0,114,48,0,
+    0,0,114,81,0,0,0,114,29,0,0,0,114,20,0,0,
+    0,114,28,0,0,0,114,26,0,0,0,114,59,0,0,0,
+    114,161,0,0,0,114,80,0,0,0,114,167,0,0,0,114,
+    3,0,0,0,41,14,114,32,0,0,0,114,41,0,0,0,
+    114,13,0,0,0,90,12,105,109,112,111,114,116,95,101,114,
+    114,111,114,114,96,0,0,0,114,97,0,0,0,114,54,0,
+    0,0,114,69,0,0,0,114,61,0,0,0,114,43,0,0,
+    0,114,132,0,0,0,114,53,0,0,0,90,3,101,120,99,
+    114,82,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
+    10,0,0,0,114,51,0,0,0,228,2,0,0,115,58,0,
+    0,0,10,1,4,1,14,1,8,1,22,1,2,1,14,1,
+    12,1,4,1,2,255,8,3,12,1,4,1,4,1,2,1,
+    20,1,14,1,16,1,8,128,2,255,10,3,8,1,2,3,
+    8,1,14,1,4,2,10,1,14,1,18,2,114,51,0,0,
+    0,41,46,114,91,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,48,0,0,0,114,154,0,0,0,
+    114,116,0,0,0,114,158,0,0,0,114,72,0,0,0,114,
+    137,0,0,0,114,35,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,80,0,
+    0,0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,
+    112,101,114,75,0,0,0,114,119,0,0,0,114,121,0,0,
+    0,114,123,0,0,0,90,13,95,76,111,97,100,101,114,66,
+    97,115,105,99,115,114,4,0,0,0,114,95,0,0,0,114,
+    39,0,0,0,114,40,0,0,0,114,38,0,0,0,114,27,
+    0,0,0,114,128,0,0,0,114,148,0,0,0,114,150,0,
+    0,0,114,59,0,0,0,114,153,0,0,0,114,161,0,0,
+    0,218,8,95,95,99,111,100,101,95,95,114,159,0,0,0,
+    114,165,0,0,0,114,167,0,0,0,114,175,0,0,0,114,
+    157,0,0,0,114,155,0,0,0,114,51,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,90,0,0,0,4,0,8,16,16,1,8,1,8,1,8,
+    1,8,1,8,1,8,1,8,1,8,2,6,3,14,1,16,
+    3,4,4,8,2,4,2,4,1,4,1,18,2,0,127,0,
+    127,12,50,12,1,2,1,2,1,4,252,8,9,8,4,8,
+    9,8,31,2,126,2,254,4,29,8,5,8,21,8,46,8,
+    8,10,40,8,5,8,7,8,6,8,13,8,19,12,15,
 };
index 0d2077a..1e10e66 100644 (file)
@@ -1774,10 +1774,10 @@ static PyStatus
 config_init_int_max_str_digits(PyConfig *config)
 {
     int maxdigits;
-    int valid = 0;
 
     const char *env = config_get_env(config, "PYTHONINTMAXSTRDIGITS");
     if (env) {
+        int valid = 0;
         if (!_Py_str_to_int(env, &maxdigits)) {
             valid = ((maxdigits == 0) || (maxdigits >= _PY_LONG_MAX_STR_DIGITS_THRESHOLD));
         }
@@ -1795,6 +1795,7 @@ config_init_int_max_str_digits(PyConfig *config)
     const wchar_t *xoption = config_get_xoption(config, L"int_max_str_digits");
     if (xoption) {
         const wchar_t *sep = wcschr(xoption, L'=');
+        int valid = 0;
         if (sep) {
             if (!config_wstr_to_int(sep + 1, &maxdigits)) {
                 valid = ((maxdigits == 0) || (maxdigits >= _PY_LONG_MAX_STR_DIGITS_THRESHOLD));
index cd69198..2a505d1 100644 (file)
@@ -9,6 +9,7 @@
    would have been written had the buffer not been too small, and to set
    the last byte of the buffer to \0.  At least MS _vsnprintf returns a
    negative value instead, and fills the entire buffer with non-\0 data.
+   Unlike C99, our wrappers do not support passing a null buffer.
 
    The wrappers ensure that str[size-1] is always \0 upon return.
 
index 934ae45..986940d 100644 (file)
@@ -1,4 +1,4 @@
-This is Python version 3.10.7
+This is Python version 3.10.8
 =============================
 
 .. image:: https://travis-ci.com/python/cpython.svg?branch=master
index 1ad9807..1a59fa5 100755 (executable)
@@ -3449,6 +3449,7 @@ class Py_UNICODE_converter(CConverter):
                 self.converter = '_PyUnicode_WideCharString_Opt_Converter'
             else:
                 fail("Py_UNICODE_converter: illegal 'accept' argument " + repr(accept))
+        self.c_default = "NULL"
 
     def cleanup(self):
         if not self.length:
index 0612a3c..0411c34 100644 (file)
@@ -12,7 +12,9 @@ rem
 rem The following substitutions will be applied to the release URI:\r
 rem     Variable        Description         Example\r
 rem     {arch}          architecture        amd64, win32\r
-set RELEASE_URI=https://www.python.org/{arch}\r
+rem Do not change the scheme to https. Otherwise, releases built with this\r
+rem script will not be upgradable to/from official releases of Python.\r
+set RELEASE_URI=http://www.python.org/{arch}\r
 \r
 rem This is the URL that will be used to download installation files.\r
 rem The files available from the default URL *will* conflict with your\r
index 791ce6e..6a2fb86 100644 (file)
@@ -80,13 +80,13 @@ Select Customize to review current options.</String>
   <String Id="Include_launcherRemove">Use Programs and Features to remove the 'py' launcher.</String>
   <String Id="Include_launcherUpgrade">Upgrades the global 'py' launcher from the previous version.</String>
   
-  <String Id="AssociateFilesLabel">Associate &amp;files with Python (requires the py launcher)</String>
+  <String Id="AssociateFilesLabel">Associate &amp;files with Python (requires the 'py' launcher)</String>
   <String Id="ShortcutsLabel">Create shortcuts for installed applications</String>
   <String Id="PrependPathLabel">Add Python to &amp;environment variables</String>
-  <String Id="ShortPrependPathLabel">Add &amp;Python [ShortVersion] to PATH</String>
-  <String Id="InstallAllUsersLabel">Install for &amp;all users</String>
-  <String Id="InstallLauncherAllUsersLabel">for &amp;all users (requires elevation)</String>
-  <String Id="ShortInstallLauncherAllUsersLabel">Install &amp;launcher for all users (recommended)</String>
+  <String Id="ShortPrependPathLabel">Add &amp;python.exe to PATH</String>
+  <String Id="InstallAllUsersLabel">Install Python [ShortVersion] for &amp;all users</String>
+  <String Id="InstallLauncherAllUsersLabel">for &amp;all users (requires admin privileges)</String>
+  <String Id="ShortInstallLauncherAllUsersLabel">Use admin privi&amp;leges when installing py.exe</String>
   <String Id="PrecompileLabel">&amp;Precompile standard library</String>
   <String Id="Include_symbolsLabel">Download debugging &amp;symbols</String>
   <String Id="Include_debugLabel">Download debu&amp;g binaries (requires VS 2017 or later)</String>
index 3890128..68272fc 100755 (executable)
@@ -15,8 +15,8 @@ import tempfile
 def fetch_server_certificate (host, port):
 
     def subproc(cmd):
-        from subprocess import Popen, PIPE, STDOUT
-        proc = Popen(cmd, stdout=PIPE, stderr=STDOUT, shell=True)
+        from subprocess import Popen, PIPE, STDOUT, DEVNULL
+        proc = Popen(cmd, stdout=PIPE, stderr=STDOUT, stdin=DEVNULL)
         status = proc.wait()
         output = proc.stdout.read()
         return status, output
@@ -33,8 +33,8 @@ def fetch_server_certificate (host, port):
                 fp.write(m.group(1) + b"\n")
             try:
                 tn2 = (outfile or tempfile.mktemp())
-                status, output = subproc(r'openssl x509 -in "%s" -out "%s"' %
-                                         (tn, tn2))
+                cmd = ['openssl', 'x509', '-in', tn, '-out', tn2]
+                status, output = subproc(cmd)
                 if status != 0:
                     raise RuntimeError('OpenSSL x509 failed with status %s and '
                                        'output: %r' % (status, output))
@@ -45,20 +45,9 @@ def fetch_server_certificate (host, port):
             finally:
                 os.unlink(tn)
 
-    if sys.platform.startswith("win"):
-        tfile = tempfile.mktemp()
-        with open(tfile, "w") as fp:
-            fp.write("quit\n")
-        try:
-            status, output = subproc(
-                'openssl s_client -connect "%s:%s" -showcerts < "%s"' %
-                (host, port, tfile))
-        finally:
-            os.unlink(tfile)
-    else:
-        status, output = subproc(
-            'openssl s_client -connect "%s:%s" -showcerts < /dev/null' %
-            (host, port))
+    cmd = ['openssl', 's_client', '-connect', '%s:%s' % (host, port), '-showcerts']
+    status, output = subproc(cmd)
+
     if status != 0:
         raise RuntimeError('OpenSSL connect failed with status %s and '
                            'output: %r' % (status, output))