From webhook-mailer at python.org Wed Jan 1 01:11:23 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Wed, 01 Jan 2020 06:11:23 -0000 Subject: [Python-checkins] Document CodeType.replace (GH-17776) Message-ID: https://github.com/python/cpython/commit/22424c02e51fab3b62cbe255d0b87d1b55b9a6c3 commit: 22424c02e51fab3b62cbe255d0b87d1b55b9a6c3 branch: master author: Anthony Sottile committer: Pablo Galindo date: 2020-01-01T06:11:16Z summary: Document CodeType.replace (GH-17776) files: M Doc/library/types.rst M Objects/clinic/codeobject.c.h M Objects/codeobject.c diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 9393f9e6db990..3529c2b0edb89 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -132,7 +132,7 @@ Standard names are defined for the following types: .. versionadded:: 3.6 -.. data:: CodeType +.. class:: CodeType(**kwargs) .. index:: builtin: compile @@ -143,6 +143,12 @@ Standard names are defined for the following types: Note that the audited arguments may not match the names or positions required by the initializer. + .. method:: CodeType.replace(**kwargs) + + Return a copy of the code object with new values for the specified fields. + + .. versionadded:: 3.8 + .. data:: CellType The type for cell objects: such objects are used as containers for diff --git a/Objects/clinic/codeobject.c.h b/Objects/clinic/codeobject.c.h index 6596de051cacb..1dd82278cf3d5 100644 --- a/Objects/clinic/codeobject.c.h +++ b/Objects/clinic/codeobject.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(code_replace__doc__, " co_lnotab=None)\n" "--\n" "\n" -"Return a new code object with new specified fields."); +"Return a copy of the code object with new values for the specified fields."); #define CODE_REPLACE_METHODDEF \ {"replace", (PyCFunction)(void(*)(void))code_replace, METH_FASTCALL|METH_KEYWORDS, code_replace__doc__}, @@ -253,4 +253,4 @@ code_replace(PyCodeObject *self, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=fade581d6313a0c2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=27fe34e82106b220 input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index f0b62ec94148d..522e1a9f2a419 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -610,7 +610,7 @@ code.replace co_name: unicode(c_default="self->co_name") = None co_lnotab: PyBytesObject(c_default="(PyBytesObject *)self->co_lnotab") = None -Return a new code object with new specified fields. +Return a copy of the code object with new values for the specified fields. [clinic start generated code]*/ static PyObject * @@ -622,7 +622,7 @@ code_replace_impl(PyCodeObject *self, int co_argcount, PyObject *co_varnames, PyObject *co_freevars, PyObject *co_cellvars, PyObject *co_filename, PyObject *co_name, PyBytesObject *co_lnotab) -/*[clinic end generated code: output=25c8e303913bcace input=77189e46579ec426]*/ +/*[clinic end generated code: output=25c8e303913bcace input=d9051bc8f24e6b28]*/ { #define CHECK_INT_ARG(ARG) \ if (ARG < 0) { \ From webhook-mailer at python.org Wed Jan 1 01:28:00 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 01 Jan 2020 06:28:00 -0000 Subject: [Python-checkins] Document CodeType.replace (GH-17776) Message-ID: https://github.com/python/cpython/commit/dad526eb36530186f625a2724c8835fe3df3c8c1 commit: dad526eb36530186f625a2724c8835fe3df3c8c1 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-12-31T22:27:56-08:00 summary: Document CodeType.replace (GH-17776) (cherry picked from commit 22424c02e51fab3b62cbe255d0b87d1b55b9a6c3) Co-authored-by: Anthony Sottile files: M Doc/library/types.rst M Objects/clinic/codeobject.c.h M Objects/codeobject.c diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 9393f9e6db990..3529c2b0edb89 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -132,7 +132,7 @@ Standard names are defined for the following types: .. versionadded:: 3.6 -.. data:: CodeType +.. class:: CodeType(**kwargs) .. index:: builtin: compile @@ -143,6 +143,12 @@ Standard names are defined for the following types: Note that the audited arguments may not match the names or positions required by the initializer. + .. method:: CodeType.replace(**kwargs) + + Return a copy of the code object with new values for the specified fields. + + .. versionadded:: 3.8 + .. data:: CellType The type for cell objects: such objects are used as containers for diff --git a/Objects/clinic/codeobject.c.h b/Objects/clinic/codeobject.c.h index 6596de051cacb..1dd82278cf3d5 100644 --- a/Objects/clinic/codeobject.c.h +++ b/Objects/clinic/codeobject.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(code_replace__doc__, " co_lnotab=None)\n" "--\n" "\n" -"Return a new code object with new specified fields."); +"Return a copy of the code object with new values for the specified fields."); #define CODE_REPLACE_METHODDEF \ {"replace", (PyCFunction)(void(*)(void))code_replace, METH_FASTCALL|METH_KEYWORDS, code_replace__doc__}, @@ -253,4 +253,4 @@ code_replace(PyCodeObject *self, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=fade581d6313a0c2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=27fe34e82106b220 input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index f0b62ec94148d..522e1a9f2a419 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -610,7 +610,7 @@ code.replace co_name: unicode(c_default="self->co_name") = None co_lnotab: PyBytesObject(c_default="(PyBytesObject *)self->co_lnotab") = None -Return a new code object with new specified fields. +Return a copy of the code object with new values for the specified fields. [clinic start generated code]*/ static PyObject * @@ -622,7 +622,7 @@ code_replace_impl(PyCodeObject *self, int co_argcount, PyObject *co_varnames, PyObject *co_freevars, PyObject *co_cellvars, PyObject *co_filename, PyObject *co_name, PyBytesObject *co_lnotab) -/*[clinic end generated code: output=25c8e303913bcace input=77189e46579ec426]*/ +/*[clinic end generated code: output=25c8e303913bcace input=d9051bc8f24e6b28]*/ { #define CHECK_INT_ARG(ARG) \ if (ARG < 0) { \ From webhook-mailer at python.org Wed Jan 1 14:32:25 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Wed, 01 Jan 2020 19:32:25 -0000 Subject: [Python-checkins] bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) Message-ID: https://github.com/python/cpython/commit/46abfc1416ff8e450999611ef8f231ff871ab133 commit: 46abfc1416ff8e450999611ef8f231ff871ab133 branch: master author: Vinay Sajip committer: GitHub date: 2020-01-01T19:32:11Z summary: bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) This uses the heuristic of assuming a named tuple is a subclass of tuple with a _fields attribute. This change means that contents of a named tuple wouldn't be converted - if a user wants to have ConvertingTuple functionality from a namedtuple, they will have to implement it themselves. files: A Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst M Lib/logging/config.py M Lib/test/test_logging.py diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 4a3b8966ede1c..fd3aded7608cb 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -448,7 +448,7 @@ def convert(self, value): value = ConvertingList(value) value.configurator = self elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): + isinstance(value, tuple) and not hasattr(value, '_fields'): value = ConvertingTuple(value) value.configurator = self elif isinstance(value, str): # str for py3k diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 4feed03fec2a8..c38fdae03385e 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3379,6 +3379,37 @@ def test_baseconfig(self): self.assertRaises(ValueError, bc.convert, 'cfg://!') self.assertRaises(KeyError, bc.convert, 'cfg://adict[2]') + def test_namedtuple(self): + # see bpo-39142 + from collections import namedtuple + + class MyHandler(logging.StreamHandler): + def __init__(self, resource, *args, **kwargs): + super().__init__(*args, **kwargs) + self.resource: namedtuple = resource + + def emit(self, record): + record.msg += f' {self.resource.type}' + return super().emit(record) + + Resource = namedtuple('Resource', ['type', 'labels']) + resource = Resource(type='my_type', labels=['a']) + + config = { + 'version': 1, + 'handlers': { + 'myhandler': { + '()': MyHandler, + 'resource': resource + } + }, + 'root': {'level': 'INFO', 'handlers': ['myhandler']}, + } + with support.captured_stderr() as stderr: + self.apply_config(config) + logging.info('some log') + self.assertEqual(stderr.getvalue(), 'some log my_type\n') + class ManagerTest(BaseTest): def test_manager_loggerclass(self): logged = [] diff --git a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst new file mode 100644 index 0000000000000..508d1338d7c31 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst @@ -0,0 +1,5 @@ +A change was made to logging.config.dictConfig to avoid converting instances +of named tuples to ConvertingTuple. It's assumed that named tuples are too +specialised to be treated like ordinary tuples; if a user of named tuples +requires ConvertingTuple functionality, they will have to implement that +themselves in their named tuple class. From webhook-mailer at python.org Wed Jan 1 15:06:56 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Wed, 01 Jan 2020 20:06:56 -0000 Subject: [Python-checkins] bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) (GH-17785) Message-ID: https://github.com/python/cpython/commit/1d5a7e5694bd9104f56f4f28357c2d13afd58a29 commit: 1d5a7e5694bd9104f56f4f28357c2d13afd58a29 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2020-01-01T20:06:52Z summary: bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) (GH-17785) (cherry picked from commit 46abfc1416ff8e450999611ef8f231ff871ab133) files: A Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst M Lib/logging/config.py M Lib/test/test_logging.py diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 9dd35e11aab39..3cd5fea852449 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -447,7 +447,7 @@ def convert(self, value): value = ConvertingList(value) value.configurator = self elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): + isinstance(value, tuple) and not hasattr(value, '_fields'): value = ConvertingTuple(value) value.configurator = self elif isinstance(value, str): # str for py3k diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 37655a5ccc40c..90bf2a4d3ac06 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3361,6 +3361,37 @@ def test_baseconfig(self): self.assertRaises(ValueError, bc.convert, 'cfg://!') self.assertRaises(KeyError, bc.convert, 'cfg://adict[2]') + def test_namedtuple(self): + # see bpo-39142 + from collections import namedtuple + + class MyHandler(logging.StreamHandler): + def __init__(self, resource, *args, **kwargs): + super().__init__(*args, **kwargs) + self.resource: namedtuple = resource + + def emit(self, record): + record.msg += f' {self.resource.type}' + return super().emit(record) + + Resource = namedtuple('Resource', ['type', 'labels']) + resource = Resource(type='my_type', labels=['a']) + + config = { + 'version': 1, + 'handlers': { + 'myhandler': { + '()': MyHandler, + 'resource': resource + } + }, + 'root': {'level': 'INFO', 'handlers': ['myhandler']}, + } + with support.captured_stderr() as stderr: + self.apply_config(config) + logging.info('some log') + self.assertEqual(stderr.getvalue(), 'some log my_type\n') + class ManagerTest(BaseTest): def test_manager_loggerclass(self): logged = [] diff --git a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst new file mode 100644 index 0000000000000..508d1338d7c31 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst @@ -0,0 +1,5 @@ +A change was made to logging.config.dictConfig to avoid converting instances +of named tuples to ConvertingTuple. It's assumed that named tuples are too +specialised to be treated like ordinary tuples; if a user of named tuples +requires ConvertingTuple functionality, they will have to implement that +themselves in their named tuple class. From webhook-mailer at python.org Wed Jan 1 15:07:36 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Wed, 01 Jan 2020 20:07:36 -0000 Subject: [Python-checkins] bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) (GH-17786) Message-ID: https://github.com/python/cpython/commit/0e0e4acaabdcf8efb60cf75f08301022ac4422a4 commit: 0e0e4acaabdcf8efb60cf75f08301022ac4422a4 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2020-01-01T20:07:31Z summary: bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) (GH-17786) (cherry picked from commit 46abfc1416ff8e450999611ef8f231ff871ab133) files: A Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst M Lib/logging/config.py M Lib/test/test_logging.py diff --git a/Lib/logging/config.py b/Lib/logging/config.py index f58be93089359..626aeea7c2c56 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -447,7 +447,7 @@ def convert(self, value): value = ConvertingList(value) value.configurator = self elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): + isinstance(value, tuple) and not hasattr(value, '_fields'): value = ConvertingTuple(value) value.configurator = self elif isinstance(value, str): # str for py3k diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 546cea98c1ea4..c24a30286806a 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3223,6 +3223,37 @@ def test_baseconfig(self): self.assertRaises(ValueError, bc.convert, 'cfg://!') self.assertRaises(KeyError, bc.convert, 'cfg://adict[2]') + def test_namedtuple(self): + # see bpo-39142 + from collections import namedtuple + + class MyHandler(logging.StreamHandler): + def __init__(self, resource, *args, **kwargs): + super().__init__(*args, **kwargs) + self.resource: namedtuple = resource + + def emit(self, record): + record.msg += f' {self.resource.type}' + return super().emit(record) + + Resource = namedtuple('Resource', ['type', 'labels']) + resource = Resource(type='my_type', labels=['a']) + + config = { + 'version': 1, + 'handlers': { + 'myhandler': { + '()': MyHandler, + 'resource': resource + } + }, + 'root': {'level': 'INFO', 'handlers': ['myhandler']}, + } + with support.captured_stderr() as stderr: + self.apply_config(config) + logging.info('some log') + self.assertEqual(stderr.getvalue(), 'some log my_type\n') + class ManagerTest(BaseTest): def test_manager_loggerclass(self): logged = [] diff --git a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst new file mode 100644 index 0000000000000..508d1338d7c31 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst @@ -0,0 +1,5 @@ +A change was made to logging.config.dictConfig to avoid converting instances +of named tuples to ConvertingTuple. It's assumed that named tuples are too +specialised to be treated like ordinary tuples; if a user of named tuples +requires ConvertingTuple functionality, they will have to implement that +themselves in their named tuple class. From webhook-mailer at python.org Wed Jan 1 17:21:50 2020 From: webhook-mailer at python.org (Antoine Pitrou) Date: Wed, 01 Jan 2020 22:21:50 -0000 Subject: [Python-checkins] bpo-13601: always use line-buffering for sys.stderr (GH-17646) Message-ID: https://github.com/python/cpython/commit/5b9077134cd0535f21905d5f5195847526cac99c commit: 5b9077134cd0535f21905d5f5195847526cac99c branch: master author: Jendrik Seipp committer: Antoine Pitrou date: 2020-01-01T23:21:43+01:00 summary: bpo-13601: always use line-buffering for sys.stderr (GH-17646) files: A Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst M Doc/library/sys.rst M Lib/test/test_cmd_line.py M Misc/ACKS M Python/pylifecycle.c diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index a824fb95e8ecf..0aae263ff5f4c 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1446,9 +1446,15 @@ always available. for the Windows console, this only applies when :envvar:`PYTHONLEGACYWINDOWSSTDIO` is also set. - * When interactive, ``stdout`` and ``stderr`` streams are line-buffered. - Otherwise, they are block-buffered like regular text files. You can - override this value with the :option:`-u` command-line option. + * When interactive, the ``stdout`` stream is line-buffered. Otherwise, + it is block-buffered like regular text files. The ``stderr`` stream + is line-buffered in both cases. You can make both streams unbuffered + by passing the :option:`-u` command-line option or setting the + :envvar:`PYTHONUNBUFFERED` environment variable. + + .. versionchanged:: 3.9 + Non-interactive ``stderr`` is now line-buffered instead of fully + buffered. .. note:: diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 47810020dd353..ee96473322dba 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -6,6 +6,7 @@ import subprocess import sys import tempfile +import textwrap import unittest from test import support from test.support.script_helper import ( @@ -219,6 +220,21 @@ def check_output(text): ) check_output(text) + def test_non_interactive_output_buffering(self): + code = textwrap.dedent(""" + import sys + out = sys.stdout + print(out.isatty(), out.write_through, out.line_buffering) + err = sys.stderr + print(err.isatty(), err.write_through, err.line_buffering) + """) + args = [sys.executable, '-c', code] + proc = subprocess.run(args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, check=True) + self.assertEqual(proc.stdout, + 'False False False\n' + 'False False True\n') + def test_unbuffered_output(self): # Test expected operation of the '-u' switch for stream in ('stdout', 'stderr'): diff --git a/Misc/ACKS b/Misc/ACKS index 5ecbac13e0bb4..d3e683d4a085f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1510,6 +1510,7 @@ Steven Scott Nick Seidenman Michael Seifert ?iga Seilnacht +Jendrik Seipp Michael Selik Yury Selivanov Fred Sells diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst new file mode 100644 index 0000000000000..f2c9495a59afb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst @@ -0,0 +1,6 @@ +By default, ``sys.stderr`` is line-buffered now, even if ``stderr`` is +redirected to a file. You can still make ``sys.stderr`` unbuffered by +passing the :option:`-u` command-line option or setting the +:envvar:`PYTHONUNBUFFERED` environment variable. + +(Contributed by Jendrik Seipp in bpo-13601.) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 4f05dfc349033..94bbbdb560e79 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1817,7 +1817,7 @@ create_stdio(const PyConfig *config, PyObject* io, write_through = Py_True; else write_through = Py_False; - if (isatty && buffered_stdio) + if (buffered_stdio && (isatty || fd == fileno(stderr))) line_buffering = Py_True; else line_buffering = Py_False; From webhook-mailer at python.org Wed Jan 1 17:26:37 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 01 Jan 2020 22:26:37 -0000 Subject: [Python-checkins] bpo-39183: Fix formatting in library/ensurepip (GH-17787) Message-ID: https://github.com/python/cpython/commit/149175c6dfc8455023e4335575f3fe3d606729f9 commit: 149175c6dfc8455023e4335575f3fe3d606729f9 branch: master author: Rafael Fontenelle committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-01T14:26:33-08:00 summary: bpo-39183: Fix formatting in library/ensurepip (GH-17787) Remove extra space to fix formatting and avoid from splitting text in to strings. https://bugs.python.org/issue39183 files: M Doc/library/ensurepip.rst diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index a2bb045e57e3c..a5221250c4048 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -74,7 +74,7 @@ options: script will *not* be installed. * ``--default-pip``: if a "default pip" installation is requested, the - ``pip`` script will be installed in addition to the two regular scripts. + ``pip`` script will be installed in addition to the two regular scripts. Providing both of the script selection options will trigger an exception. From webhook-mailer at python.org Wed Jan 1 17:32:21 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 01 Jan 2020 22:32:21 -0000 Subject: [Python-checkins] bpo-39183: Fix formatting in library/ensurepip (GH-17787) Message-ID: https://github.com/python/cpython/commit/3959638ba1b1e25c25a2da880aba78fd53dd947f commit: 3959638ba1b1e25c25a2da880aba78fd53dd947f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-01T14:32:17-08:00 summary: bpo-39183: Fix formatting in library/ensurepip (GH-17787) Remove extra space to fix formatting and avoid from splitting text in to strings. https://bugs.python.org/issue39183 (cherry picked from commit 149175c6dfc8455023e4335575f3fe3d606729f9) Co-authored-by: Rafael Fontenelle files: M Doc/library/ensurepip.rst diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index c797f63326d1a..1b6fe65b08a21 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -74,7 +74,7 @@ options: script will *not* be installed. * ``--default-pip``: if a "default pip" installation is requested, the - ``pip`` script will be installed in addition to the two regular scripts. + ``pip`` script will be installed in addition to the two regular scripts. Providing both of the script selection options will trigger an exception. From webhook-mailer at python.org Wed Jan 1 17:32:28 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 01 Jan 2020 22:32:28 -0000 Subject: [Python-checkins] bpo-39183: Fix formatting in library/ensurepip (GH-17787) Message-ID: https://github.com/python/cpython/commit/6bf382ac9a07f42c6f91f35a7f0df4c63e35a8a7 commit: 6bf382ac9a07f42c6f91f35a7f0df4c63e35a8a7 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-01T14:32:23-08:00 summary: bpo-39183: Fix formatting in library/ensurepip (GH-17787) Remove extra space to fix formatting and avoid from splitting text in to strings. https://bugs.python.org/issue39183 (cherry picked from commit 149175c6dfc8455023e4335575f3fe3d606729f9) Co-authored-by: Rafael Fontenelle files: M Doc/library/ensurepip.rst diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index a2bb045e57e3c..a5221250c4048 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -74,7 +74,7 @@ options: script will *not* be installed. * ``--default-pip``: if a "default pip" installation is requested, the - ``pip`` script will be installed in addition to the two regular scripts. + ``pip`` script will be installed in addition to the two regular scripts. Providing both of the script selection options will trigger an exception. From webhook-mailer at python.org Thu Jan 2 06:38:56 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 02 Jan 2020 11:38:56 -0000 Subject: [Python-checkins] bpo-39114: Fix tracing of except handlers with name binding (GH-17769) Message-ID: https://github.com/python/cpython/commit/04ec7a1f7a5b92187a73cd02670958444c6f2220 commit: 04ec7a1f7a5b92187a73cd02670958444c6f2220 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-02T11:38:44Z summary: bpo-39114: Fix tracing of except handlers with name binding (GH-17769) When producing the bytecode of exception handlers with name binding (like `except Exception as e`) we need to produce a try-finally block to make sure that the name is deleted after the handler is executed to prevent cycles in the stack frame objects. The bytecode associated with this try-finally block does not have source lines associated and it was causing problems when the tracing functionality was running over it. files: A Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst M Lib/test/test_sys_settrace.py M Python/ceval.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 0af015aa56bb4..a0d1122fad83b 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -481,6 +481,51 @@ def func(): [(0, 'call'), (1, 'line')]) + def test_18_except_with_name(self): + def func(): + try: + try: + raise Exception + except Exception as e: + raise + x = "Something" + y = "Something" + except Exception: + pass + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (4, 'line'), + (5, 'line'), + (8, 'line'), + (9, 'line'), + (9, 'return')]) + + def test_19_except_with_finally(self): + def func(): + try: + try: + raise Exception + finally: + y = "Something" + except Exception: + b = 23 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (7, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst new file mode 100644 index 0000000000000..d742af9d3262e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst @@ -0,0 +1,2 @@ +Fix incorrent line execution reporting in trace functions when tracing +exception handlers with name binding. Patch by Pablo Galindo. diff --git a/Python/ceval.c b/Python/ceval.c index 96ed329b0d995..bd9454b2812dd 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3610,7 +3610,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PUSH(val); PUSH(exc); JUMPTO(handler); - if (_Py_TracingPossible(ceval)) { + if (_Py_TracingPossible(ceval) && + ((f->f_lasti < instr_lb || f->f_lasti >= instr_ub) || + !(f->f_lasti == instr_lb || f->f_lasti < instr_prev))) { /* Make sure that we trace line after exception */ instr_prev = INT_MAX; } From webhook-mailer at python.org Thu Jan 2 12:33:02 2020 From: webhook-mailer at python.org (Zachary Ware) Date: Thu, 02 Jan 2020 17:33:02 -0000 Subject: [Python-checkins] Remove outdated mention of hg.exe from Tools/msi/README.txt (GH-17792) Message-ID: https://github.com/python/cpython/commit/78018bb1621e5ecb61cba6e664d14ff789d2874c commit: 78018bb1621e5ecb61cba6e664d14ff789d2874c branch: master author: Anthony Shaw committer: Zachary Ware date: 2020-01-02T11:32:55-06:00 summary: Remove outdated mention of hg.exe from Tools/msi/README.txt (GH-17792) files: M Tools/msi/README.txt diff --git a/Tools/msi/README.txt b/Tools/msi/README.txt index f5656b971b3ce..82635f3d2c2a1 100644 --- a/Tools/msi/README.txt +++ b/Tools/msi/README.txt @@ -11,7 +11,7 @@ Tools/msi/buildrelease.bat script and environment variables: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -106,7 +106,7 @@ Tools/msi/buildrelease.bat script: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -131,7 +131,7 @@ installer. Official releases of Python must be signed. Ensure %PYTHON% and %SPHINXBUILD% are set when passing this option. You may also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC -on your PATH or in externals/. You will also need Mercurial (hg.exe) on +on your PATH or in externals/. You will also need Git (git.exe) on your PATH. If WiX is not found on your system, it will be automatically downloaded From webhook-mailer at python.org Thu Jan 2 13:20:34 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 02 Jan 2020 18:20:34 -0000 Subject: [Python-checkins] bpo-38870: Throw ValueError on invalid yield from usage (GH-17798) Message-ID: https://github.com/python/cpython/commit/7b35bef9787cd80ed1e12124f759b4be03c849db commit: 7b35bef9787cd80ed1e12124f759b4be03c849db branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Pablo Galindo date: 2020-01-02T18:20:04Z summary: bpo-38870: Throw ValueError on invalid yield from usage (GH-17798) files: M Lib/ast.py M Lib/test/test_unparse.py diff --git a/Lib/ast.py b/Lib/ast.py index 62f6e075a09fd..ece8b139e460e 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -735,10 +735,10 @@ def visit_Yield(self, node): def visit_YieldFrom(self, node): with self.delimit("(", ")"): - self.write("yield from") - if node.value: - self.write(" ") - self.traverse(node.value) + self.write("yield from ") + if not node.value: + raise ValueError("Node can't be used without a value attribute.") + self.traverse(node.value) def visit_Raise(self, node): self.fill("raise") diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 49767dbac16d1..e8b0d4b06f9e9 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -278,6 +278,8 @@ def test_invalid_fstring_conversion(self): def test_invalid_set(self): self.check_invalid(ast.Set(elts=[])) + def test_invalid_yield_from(self): + self.check_invalid(ast.YieldFrom(value=None)) class DirectoryTestCase(ASTTestCase): """Test roundtrip behaviour on all files in Lib and Lib/test.""" From webhook-mailer at python.org Thu Jan 2 21:56:41 2020 From: webhook-mailer at python.org (Benjamin Peterson) Date: Fri, 03 Jan 2020 02:56:41 -0000 Subject: [Python-checkins] Bring Python into the next decade. (GH-17801) Message-ID: https://github.com/python/cpython/commit/946b29ea0b3b386ed05e87e60b8617c9dc19cd53 commit: 946b29ea0b3b386ed05e87e60b8617c9dc19cd53 branch: master author: Benjamin Peterson committer: GitHub date: 2020-01-02T18:56:34-08:00 summary: Bring Python into the next decade. (GH-17801) files: M Doc/copyright.rst M Doc/license.rst M LICENSE M Mac/IDLE/IDLE.app/Contents/Info.plist M Mac/PythonLauncher/Info.plist.in M Mac/Resources/app/Info.plist.in M Python/getcopyright.c M README.rst diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 393a1f03751f8..1b90d9f172c99 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright ? 2001-2019 Python Software Foundation. All rights reserved. +Copyright ? 2001-2020 Python Software Foundation. All rights reserved. Copyright ? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index 810d2e63fd48c..472a5cf3d88b3 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright ? 2001-2019 Python Software Foundation; All Rights + copyright, i.e., "Copyright ? 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 9dc010d80348f..66a3ac80d729a 100644 --- a/LICENSE +++ b/LICENSE @@ -73,7 +73,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index 04a0a08c83639..dcc48abdd2a39 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, ? 2001-2019 Python Software Foundation + %version%, ? 2001-2020 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 9fb4e0affd9c4..21a051535fb92 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, ? 2001-2019 Python Software Foundation + %VERSION%, ? 2001-2020 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index b7581984dd676..66b5e764c54b0 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2019 Python Software Foundation. + %version%, (c) 2001-2020 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 27a1731f46ded..299ccc08c44f8 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2019 Python Software Foundation.\n\ +Copyright (c) 2001-2020 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README.rst b/README.rst index ae56ff025279f..e8fd598a61edd 100644 --- a/README.rst +++ b/README.rst @@ -22,7 +22,7 @@ This is Python version 3.9.0 alpha 2 :target: https://python.zulipchat.com -Copyright (c) 2001-2019 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. See the end of this file for further copyright and license information. @@ -250,7 +250,7 @@ See :pep:`596` for Python 3.9 release details. Copyright and License Information --------------------------------- -Copyright (c) 2001-2019 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. From webhook-mailer at python.org Thu Jan 2 22:10:10 2020 From: webhook-mailer at python.org (Benjamin Peterson) Date: Fri, 03 Jan 2020 03:10:10 -0000 Subject: [Python-checkins] [2.7] Bring Python into the next decade. (GH-17805) Message-ID: https://github.com/python/cpython/commit/aa5b196c180d4c1dbe5a8593e55066e630d38c09 commit: aa5b196c180d4c1dbe5a8593e55066e630d38c09 branch: 2.7 author: Benjamin Peterson committer: GitHub date: 2020-01-02T19:10:06-08:00 summary: [2.7] Bring Python into the next decade. (GH-17805) (cherry picked from commit 946b29ea0b3b386ed05e87e60b8617c9dc19cd53) Co-authored-by: Benjamin Peterson files: M Doc/copyright.rst M Doc/license.rst M LICENSE M Mac/PythonLauncher/Info.plist.in M Mac/Resources/app/Info.plist.in M Python/getcopyright.c M README diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 393a1f03751f8..1b90d9f172c99 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright ? 2001-2019 Python Software Foundation. All rights reserved. +Copyright ? 2001-2020 Python Software Foundation. All rights reserved. Copyright ? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index 56687ac224850..c347cf52f884c 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright ? 2001-2019 Python Software Foundation; All Rights + copyright, i.e., "Copyright ? 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 9dc010d80348f..66a3ac80d729a 100644 --- a/LICENSE +++ b/LICENSE @@ -73,7 +73,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 77dbb0fe84e46..dba64546b8232 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable PythonLauncher CFBundleGetInfoString - %VERSION%, ? 2001-2019 Python Software Foundation + %VERSION%, ? 2001-2020 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index b7581984dd676..66b5e764c54b0 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2019 Python Software Foundation. + %version%, (c) 2001-2020 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 0ef16d0923810..3362ed59842ae 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static char cprt[] = "\ -Copyright (c) 2001-2019 Python Software Foundation.\n\ +Copyright (c) 2001-2020 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README b/README index a2b0543dcdc5a..67eb5fe8b0259 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ This is Python version 2.7.17 ============================= Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All +2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. From webhook-mailer at python.org Thu Jan 2 22:14:01 2020 From: webhook-mailer at python.org (Benjamin Peterson) Date: Fri, 03 Jan 2020 03:14:01 -0000 Subject: [Python-checkins] [3.6] Bring Python into the next decade. (GH-17804) Message-ID: https://github.com/python/cpython/commit/a9964b0aca784c16227a703626701e9003bdebf6 commit: a9964b0aca784c16227a703626701e9003bdebf6 branch: 3.6 author: Benjamin Peterson committer: GitHub date: 2020-01-02T19:13:57-08:00 summary: [3.6] Bring Python into the next decade. (GH-17804) (cherry picked from commit 946b29ea0b3b386ed05e87e60b8617c9dc19cd53) Co-authored-by: Benjamin Peterson files: M Doc/copyright.rst M Doc/license.rst M LICENSE M Mac/IDLE/IDLE.app/Contents/Info.plist M Mac/PythonLauncher/Info.plist.in M Mac/Resources/app/Info.plist.in M Python/getcopyright.c M README.rst diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 393a1f03751f8..1b90d9f172c99 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright ? 2001-2019 Python Software Foundation. All rights reserved. +Copyright ? 2001-2020 Python Software Foundation. All rights reserved. Copyright ? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index ed8b8bc65348e..c046cd2a35936 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright ? 2001-2019 Python Software Foundation; All Rights + copyright, i.e., "Copyright ? 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 9dc010d80348f..66a3ac80d729a 100644 --- a/LICENSE +++ b/LICENSE @@ -73,7 +73,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index 04a0a08c83639..dcc48abdd2a39 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, ? 2001-2019 Python Software Foundation + %version%, ? 2001-2020 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 9fb4e0affd9c4..21a051535fb92 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, ? 2001-2019 Python Software Foundation + %VERSION%, ? 2001-2020 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index b7581984dd676..66b5e764c54b0 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2019 Python Software Foundation. + %version%, (c) 2001-2020 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 27a1731f46ded..299ccc08c44f8 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2019 Python Software Foundation.\n\ +Copyright (c) 2001-2020 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README.rst b/README.rst index 9c8c15858ebd5..81d457c5640b5 100644 --- a/README.rst +++ b/README.rst @@ -17,9 +17,7 @@ This is Python version 3.6.10+ :alt: CPython code coverage on Codecov :target: https://codecov.io/gh/python/cpython -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All -rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. See the end of this file for further copyright and license information. @@ -244,9 +242,7 @@ See :pep:`494` for Python 3.6 release details. Copyright and License Information --------------------------------- -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All -rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. From webhook-mailer at python.org Thu Jan 2 22:15:41 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 Jan 2020 03:15:41 -0000 Subject: [Python-checkins] Bring Python into the next decade. (GH-17801) Message-ID: https://github.com/python/cpython/commit/10dc738bdac7ef4e2ba0785f65c9cb4696aa241d commit: 10dc738bdac7ef4e2ba0785f65c9cb4696aa241d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-02T19:15:37-08:00 summary: Bring Python into the next decade. (GH-17801) (cherry picked from commit 946b29ea0b3b386ed05e87e60b8617c9dc19cd53) Co-authored-by: Benjamin Peterson files: M Doc/copyright.rst M Doc/license.rst M LICENSE M Mac/IDLE/IDLE.app/Contents/Info.plist M Mac/PythonLauncher/Info.plist.in M Mac/Resources/app/Info.plist.in M Python/getcopyright.c M README.rst diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 393a1f03751f8..1b90d9f172c99 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright ? 2001-2019 Python Software Foundation. All rights reserved. +Copyright ? 2001-2020 Python Software Foundation. All rights reserved. Copyright ? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index 810d2e63fd48c..472a5cf3d88b3 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright ? 2001-2019 Python Software Foundation; All Rights + copyright, i.e., "Copyright ? 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 9dc010d80348f..66a3ac80d729a 100644 --- a/LICENSE +++ b/LICENSE @@ -73,7 +73,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index 04a0a08c83639..dcc48abdd2a39 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, ? 2001-2019 Python Software Foundation + %version%, ? 2001-2020 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 9fb4e0affd9c4..21a051535fb92 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, ? 2001-2019 Python Software Foundation + %VERSION%, ? 2001-2020 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index b7581984dd676..66b5e764c54b0 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2019 Python Software Foundation. + %version%, (c) 2001-2020 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 27a1731f46ded..299ccc08c44f8 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2019 Python Software Foundation.\n\ +Copyright (c) 2001-2020 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README.rst b/README.rst index d14f2b3ad99a6..be371c6498079 100644 --- a/README.rst +++ b/README.rst @@ -18,7 +18,7 @@ This is Python version 3.8.1 :target: https://python.zulipchat.com -Copyright (c) 2001-2019 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. See the end of this file for further copyright and license information. @@ -246,7 +246,7 @@ See :pep:`569` for Python 3.8 release details. Copyright and License Information --------------------------------- -Copyright (c) 2001-2019 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. From webhook-mailer at python.org Thu Jan 2 22:28:43 2020 From: webhook-mailer at python.org (Ned Deily) Date: Fri, 03 Jan 2020 03:28:43 -0000 Subject: [Python-checkins] Update copyright year in macOS installer license copy (GH-17806) Message-ID: https://github.com/python/cpython/commit/32f1443aa98db769d87db497b45bd0dcb732445b commit: 32f1443aa98db769d87db497b45bd0dcb732445b branch: master author: Ned Deily committer: GitHub date: 2020-01-02T22:28:37-05:00 summary: Update copyright year in macOS installer license copy (GH-17806) files: M Mac/BuildScript/resources/License.rtf diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 7566cf3b44618..25d53386da01a 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; +{\rtf1\ansi\ansicpg1252\cocoartf2511 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} @@ -55,7 +55,7 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \f1\b0 \ 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation.\ \ -2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ +2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright \'a9 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ \ 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python.\ \ From webhook-mailer at python.org Thu Jan 2 22:39:27 2020 From: webhook-mailer at python.org (Ned Deily) Date: Fri, 03 Jan 2020 03:39:27 -0000 Subject: [Python-checkins] [3.7] Bring Python into the next decade. (GH-17801). (GH-17803) Message-ID: https://github.com/python/cpython/commit/8978ae9705f56e2a4ed7e7b819eea21b2190f9ab commit: 8978ae9705f56e2a4ed7e7b819eea21b2190f9ab branch: 3.7 author: Benjamin Peterson committer: Ned Deily date: 2020-01-02T22:39:21-05:00 summary: [3.7] Bring Python into the next decade. (GH-17801). (GH-17803) (cherry picked from commit 946b29ea0b3b386ed05e87e60b8617c9dc19cd53) Co-authored-by: Benjamin Peterson files: M Doc/copyright.rst M Doc/license.rst M LICENSE M Mac/IDLE/IDLE.app/Contents/Info.plist M Mac/PythonLauncher/Info.plist.in M Mac/Resources/app/Info.plist.in M Python/getcopyright.c M README.rst diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 393a1f03751f8..1b90d9f172c99 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright ? 2001-2019 Python Software Foundation. All rights reserved. +Copyright ? 2001-2020 Python Software Foundation. All rights reserved. Copyright ? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index d9a4314f057f8..9b98b1b2f68e4 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright ? 2001-2019 Python Software Foundation; All Rights + copyright, i.e., "Copyright ? 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 9dc010d80348f..66a3ac80d729a 100644 --- a/LICENSE +++ b/LICENSE @@ -73,7 +73,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index 04a0a08c83639..dcc48abdd2a39 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, ? 2001-2019 Python Software Foundation + %version%, ? 2001-2020 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 9fb4e0affd9c4..21a051535fb92 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, ? 2001-2019 Python Software Foundation + %VERSION%, ? 2001-2020 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index b7581984dd676..66b5e764c54b0 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2019 Python Software Foundation. + %version%, (c) 2001-2020 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 27a1731f46ded..299ccc08c44f8 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2019 Python Software Foundation.\n\ +Copyright (c) 2001-2020 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README.rst b/README.rst index b4b9fbf8f6b65..886b5829d92c1 100644 --- a/README.rst +++ b/README.rst @@ -13,9 +13,7 @@ This is Python version 3.7.6+ :alt: CPython code coverage on Codecov :target: https://codecov.io/gh/python/cpython/branch/3.7 -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All -rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. See the end of this file for further copyright and license information. @@ -244,9 +242,7 @@ See :pep:`537` for Python 3.7 release details. Copyright and License Information --------------------------------- -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All -rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. From webhook-mailer at python.org Thu Jan 2 22:44:08 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 Jan 2020 03:44:08 -0000 Subject: [Python-checkins] Update copyright year in macOS installer license copy (GH-17806) Message-ID: https://github.com/python/cpython/commit/ecd572ae7abf22460296e0a306080d1f5209c73f commit: ecd572ae7abf22460296e0a306080d1f5209c73f branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-02T19:44:03-08:00 summary: Update copyright year in macOS installer license copy (GH-17806) (cherry picked from commit 32f1443aa98db769d87db497b45bd0dcb732445b) Co-authored-by: Ned Deily files: M Mac/BuildScript/resources/License.rtf diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 7566cf3b44618..25d53386da01a 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; +{\rtf1\ansi\ansicpg1252\cocoartf2511 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} @@ -55,7 +55,7 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \f1\b0 \ 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation.\ \ -2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ +2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright \'a9 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ \ 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python.\ \ From webhook-mailer at python.org Thu Jan 2 22:47:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 Jan 2020 03:47:05 -0000 Subject: [Python-checkins] Update copyright year in macOS installer license copy (GH-17806) Message-ID: https://github.com/python/cpython/commit/83638fe0a7b90189677e0d4b40426f50a3a89a2c commit: 83638fe0a7b90189677e0d4b40426f50a3a89a2c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-02T19:47:00-08:00 summary: Update copyright year in macOS installer license copy (GH-17806) (cherry picked from commit 32f1443aa98db769d87db497b45bd0dcb732445b) Co-authored-by: Ned Deily files: M Mac/BuildScript/resources/License.rtf diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 7566cf3b44618..25d53386da01a 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; +{\rtf1\ansi\ansicpg1252\cocoartf2511 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} @@ -55,7 +55,7 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \f1\b0 \ 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation.\ \ -2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ +2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright \'a9 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ \ 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python.\ \ From webhook-mailer at python.org Thu Jan 2 22:50:04 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 03 Jan 2020 03:50:04 -0000 Subject: [Python-checkins] Update copyright year in macOS installer license copy (GH-17806) Message-ID: https://github.com/python/cpython/commit/526f0b3d93b50dda26cff03e92ed0d361dbea828 commit: 526f0b3d93b50dda26cff03e92ed0d361dbea828 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-02T19:49:59-08:00 summary: Update copyright year in macOS installer license copy (GH-17806) (cherry picked from commit 32f1443aa98db769d87db497b45bd0dcb732445b) Co-authored-by: Ned Deily files: M Mac/BuildScript/resources/License.rtf diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 7566cf3b44618..25d53386da01a 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; +{\rtf1\ansi\ansicpg1252\cocoartf2511 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} @@ -55,7 +55,7 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \f1\b0 \ 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation.\ \ -2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ +2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright \'a9 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ \ 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python.\ \ From webhook-mailer at python.org Thu Jan 2 23:14:06 2020 From: webhook-mailer at python.org (Ned Deily) Date: Fri, 03 Jan 2020 04:14:06 -0000 Subject: [Python-checkins] Update copyright year in macOS installer license copy (GH-17806) (GH-17810) Message-ID: https://github.com/python/cpython/commit/4171b8e41165daadb034867eae61e05f8d2bc9c0 commit: 4171b8e41165daadb034867eae61e05f8d2bc9c0 branch: 3.6 author: Ned Deily committer: GitHub date: 2020-01-02T23:13:59-05:00 summary: Update copyright year in macOS installer license copy (GH-17806) (GH-17810) files: M Mac/BuildScript/resources/License.rtf diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 5475d7255bd19..25d53386da01a 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,16 +1,17 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1343\cocoasubrtf160 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fmodern\fcharset0 CourierNewPS-BoldMT;\f2\fmodern\fcharset0 CourierNewPSMT; -} +{\rtf1\ansi\ansicpg1252\cocoartf2511 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; +\f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} \margl1440\margr1440\vieww14620\viewh13380\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\b\fs36 \cf0 \ul \ulc0 HISTORY AND LICENSE\ \fs24 \ HISTORY OF THE SOFTWARE\ -\b0 \ulnone \ +\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.\ \ 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.\ @@ -20,10 +21,10 @@ In May 2000, Guido and the Python core development team moved to BeOpen.com to f 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.\ \ -\f1\b Release Derived Year Owner GPL-\ +\f2\b Release Derived Year Owner GPL-\ from compatible?\ -\f2\b0 \ +\f3\b0 \ 0.9.0 thru 1.2 n/a 1991-1995 CWI yes\ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes\ 1.6 1.5.2 2000 CNRI no\ @@ -36,25 +37,25 @@ All Python releases are Open Source (see http://www.opensource.org for the Open 2.1.3 2.1.2 2002 PSF yes\ 2.2 and above 2.1.1 2001-now PSF yes\ -\f0 \ +\f1 \ -\b Note: -\b0 GPL-compatible doesn't mean that we're distributing Python under the GPL. All Python licenses, unlike the GPL, let you distribute a modified version without making your changes open source. The GPL-compatible licenses make it possible to combine Python with other software that is released under the GPL; the others don't.\ +\f0\b Note: +\f1\b0 GPL-compatible doesn't mean that we're distributing Python under the GPL. All Python licenses, unlike the GPL, let you distribute a modified version without making your changes open source. The GPL-compatible licenses make it possible to combine Python with other software that is released under the GPL; the others don't.\ \ Thanks to the many outside volunteers who have worked under Guido's direction to make these releases possible.\ \ \ -\b \ul TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON\ +\f0\b \ul TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON\ -\b0 \ulnone \ +\f1\b0 \ulnone \ -\b PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2\ +\f0\b PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2\ -\b0 \ +\f1\b0 \ 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation.\ \ -2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ +2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright \'a9 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ \ 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python.\ \ @@ -70,9 +71,9 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \ \ -\b BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0\ +\f0\b BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0\ -\b0 \ +\f1\b0 \ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1\ \ 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software").\ @@ -91,9 +92,9 @@ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1\ \ \ -\b CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1\ +\f0\b CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1\ -\b0 \ +\f1\b0 \ 1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6.1 software in source or binary form and its associated documentation.\ \ 2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 1995-2001 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1013".\ @@ -114,9 +115,9 @@ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1\ \ \ -\b CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2\ +\f0\b CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2\ -\b0 \ +\f1\b0 \ Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved.\ \ Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.\ @@ -125,16 +126,16 @@ STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFT \ \ -\b \ul LICENSES AND ACKNOWLEDGEMENTS FOR INCORPORATED SOFTWARE\ +\f0\b \ul LICENSES AND ACKNOWLEDGEMENTS FOR INCORPORATED SOFTWARE\ -\b0 \ulnone \ +\f1\b0 \ulnone \ This installer incorporates portions of the following third-party software:\ \ -\f2 $THIRD_PARTY_LIBS\ +\f3 $THIRD_PARTY_LIBS\ \ -\f0 For licenses and acknowledgements for these and other third-party software incorporated in this Python distribution, please refer to the on-line documentation {\field{\*\fldinst{HYPERLINK "https://docs.python.org/$VERSION/license.html#licenses-and-acknowledgements-for-incorporated-software"}}{\fldrslt here}}.\ +\f1 For licenses and acknowledgements for these and other third-party software incorporated in this Python distribution, please refer to the on-line documentation {\field{\*\fldinst{HYPERLINK "https://docs.python.org/$VERSION/license.html#licenses-and-acknowledgements-for-incorporated-software"}}{\fldrslt here}}.\ \ \ \ From webhook-mailer at python.org Fri Jan 3 00:21:27 2020 From: webhook-mailer at python.org (Raymond Hettinger) Date: Fri, 03 Jan 2020 05:21:27 -0000 Subject: [Python-checkins] bpo-39158: ast.literal_eval() doesn't support empty sets (GH-17742) Message-ID: https://github.com/python/cpython/commit/4fcf5c12a37a8d3d8d6303c44c223dbc8d568cfd commit: 4fcf5c12a37a8d3d8d6303c44c223dbc8d568cfd branch: master author: Raymond Hettinger committer: GitHub date: 2020-01-02T22:21:18-07:00 summary: bpo-39158: ast.literal_eval() doesn't support empty sets (GH-17742) files: A Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst M Doc/library/ast.rst M Lib/ast.py M Lib/test/test_ast.py diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 190d9286effb0..c380a81bee6d2 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -194,6 +194,9 @@ and classes for traversing abstract syntax trees: .. versionchanged:: 3.2 Now allows bytes and set literals. + .. versionchanged:: 3.9 + Now supports creating empty sets with ``'set()'``. + .. function:: get_docstring(node, clean=True) diff --git a/Lib/ast.py b/Lib/ast.py index ece8b139e460e..495c0d618f12c 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -83,6 +83,9 @@ def _convert(node): return list(map(_convert, node.elts)) elif isinstance(node, Set): return set(map(_convert, node.elts)) + elif (isinstance(node, Call) and isinstance(node.func, Name) and + node.func.id == 'set' and node.args == node.keywords == []): + return set() elif isinstance(node, Dict): return dict(zip(map(_convert, node.keys), map(_convert, node.values))) diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 51a7c1af1ffe7..55b91cfa23bec 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -891,6 +891,7 @@ def test_literal_eval(self): self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None)) self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3}) self.assertEqual(ast.literal_eval('b"hi"'), b"hi") + self.assertEqual(ast.literal_eval('set()'), set()) self.assertRaises(ValueError, ast.literal_eval, 'foo()') self.assertEqual(ast.literal_eval('6'), 6) self.assertEqual(ast.literal_eval('+6'), 6) diff --git a/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst b/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst new file mode 100644 index 0000000000000..c41799bebaeb9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst @@ -0,0 +1 @@ +ast.literal_eval() now supports empty sets. From webhook-mailer at python.org Fri Jan 3 07:10:32 2020 From: webhook-mailer at python.org (T. Wouters) Date: Fri, 03 Jan 2020 12:10:32 -0000 Subject: [Python-checkins] Add link to zlib v1.1.3 vulnerability (GH-17156) Message-ID: https://github.com/python/cpython/commit/b789202cbedd93898c29b08a44ca085bf0723d81 commit: b789202cbedd93898c29b08a44ca085bf0723d81 branch: master author: Emmanuel Nosa E committer: T. Wouters date: 2020-01-03T13:10:16+01:00 summary: Add link to zlib v1.1.3 vulnerability (GH-17156) files: M Doc/library/zlib.rst diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index 339acfd0e5786..ec60ea24db662 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -9,9 +9,9 @@ For applications that require data compression, the functions in this module allow compression and decompression, using the zlib library. The zlib library -has its own home page at http://www.zlib.net. There are known +has its own home page at https://www.zlib.net. There are known incompatibilities between the Python module and versions of the zlib library -earlier than 1.1.3; 1.1.3 has a security vulnerability, so we recommend using +earlier than 1.1.3; 1.1.3 has a `security vulnerability `_, so we recommend using 1.1.4 or later. zlib's functions have many options and often need to be used in a particular @@ -337,4 +337,3 @@ the following constants: http://www.zlib.net/manual.html The zlib manual explains the semantics and usage of the library's many functions. - From webhook-mailer at python.org Fri Jan 3 07:16:16 2020 From: webhook-mailer at python.org (T. Wouters) Date: Fri, 03 Jan 2020 12:16:16 -0000 Subject: [Python-checkins] bpo-38532: Add missing decrefs in PyCFuncPtr_FromDll() (GH-16857) Message-ID: https://github.com/python/cpython/commit/e02ab59fdffa0bb841182c30ef1355c89578d945 commit: e02ab59fdffa0bb841182c30ef1355c89578d945 branch: master author: Zackery Spytz committer: T. Wouters date: 2020-01-03T13:16:12+01:00 summary: bpo-38532: Add missing decrefs in PyCFuncPtr_FromDll() (GH-16857) files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index d38d892be621c..93af497bda25f 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3554,10 +3554,12 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) if (PySys_Audit("ctypes.dlsym", ((uintptr_t)name & ~0xFFFF) ? "Os" : "On", dll, name) < 0) { + Py_DECREF(ftuple); return NULL; } #else if (PySys_Audit("ctypes.dlsym", "Os", dll, name) < 0) { + Py_DECREF(ftuple); return NULL; } #endif From webhook-mailer at python.org Fri Jan 3 07:50:20 2020 From: webhook-mailer at python.org (T. Wouters) Date: Fri, 03 Jan 2020 12:50:20 -0000 Subject: [Python-checkins] bpo-38532: Add missing decrefs in PyCFuncPtr_FromDll() (GH-17811) Message-ID: https://github.com/python/cpython/commit/aa3efea9c5f4d25afc3fa4cfd5e6d789943893c9 commit: aa3efea9c5f4d25afc3fa4cfd5e6d789943893c9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: T. Wouters date: 2020-01-03T13:50:11+01:00 summary: bpo-38532: Add missing decrefs in PyCFuncPtr_FromDll() (GH-17811) (cherry picked from commit e02ab59fdffa0bb841182c30ef1355c89578d945) Co-authored-by: Zackery Spytz files: M Modules/_ctypes/_ctypes.c diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 347a3656b6257..c6da0d804453e 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3554,10 +3554,12 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) if (PySys_Audit("ctypes.dlsym", ((uintptr_t)name & ~0xFFFF) ? "Os" : "On", dll, name) < 0) { + Py_DECREF(ftuple); return NULL; } #else if (PySys_Audit("ctypes.dlsym", "Os", dll, name) < 0) { + Py_DECREF(ftuple); return NULL; } #endif From webhook-mailer at python.org Fri Jan 3 21:14:23 2020 From: webhook-mailer at python.org (Senthil Kumaran) Date: Sat, 04 Jan 2020 02:14:23 -0000 Subject: [Python-checkins] bpo-27973 - Use test.support.temp_dir instead of NamedTemporaryFile for the (#17774) Message-ID: https://github.com/python/cpython/commit/5bba60290b4ac8c95ac46cfdaba5deee37be1fab commit: 5bba60290b4ac8c95ac46cfdaba5deee37be1fab branch: 2.7 author: Senthil Kumaran committer: GitHub date: 2020-01-03T18:14:18-08:00 summary: bpo-27973 - Use test.support.temp_dir instead of NamedTemporaryFile for the (#17774) desired behavior under windows platform. Suggestion by David Bolen files: M Lib/test/test_urllibnet.py diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index df118dc75d1b3..ef33e3a0ea617 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -1,4 +1,3 @@ -import tempfile import unittest from test import test_support from test.test_urllib2net import skip_ftp_test_on_travis @@ -224,9 +223,10 @@ def test_multiple_ftp_retrieves(self): with test_support.transient_internet(self.FTP_TEST_FILE): try: - for _ in range(self.NUM_FTP_RETRIEVES): - with tempfile.NamedTemporaryFile() as fp: - urllib.FancyURLopener().retrieve(self.FTP_TEST_FILE, fp.name) + for file_num in range(self.NUM_FTP_RETRIEVES): + with test_support.temp_dir() as td: + urllib.FancyURLopener().retrieve(self.FTP_TEST_FILE, + os.path.join(td, str(file_num))) except IOError as e: self.fail("Failed FTP retrieve while accessing ftp url " "multiple times.\n Error message was : %s" % e) From webhook-mailer at python.org Sat Jan 4 04:10:29 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 04 Jan 2020 09:10:29 -0000 Subject: [Python-checkins] Fix #39191: Don't spawn a task before failing (#17796) Message-ID: https://github.com/python/cpython/commit/3a5de511596f17575de082dcb8d43d63b2bd2da9 commit: 3a5de511596f17575de082dcb8d43d63b2bd2da9 branch: master author: Andrew Svetlov committer: GitHub date: 2020-01-04T11:10:14+02:00 summary: Fix #39191: Don't spawn a task before failing (#17796) files: A Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst M Lib/asyncio/base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index adcdec171b07a..e53ca73803463 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -573,14 +573,17 @@ def _do_shutdown(self, future): except Exception as ex: self.call_soon_threadsafe(future.set_exception, ex) - def run_forever(self): - """Run until stop() is called.""" - self._check_closed() + def _check_runnung(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: raise RuntimeError( 'Cannot run the event loop while another loop is running') + + def run_forever(self): + """Run until stop() is called.""" + self._check_closed() + self._check_runnung() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -612,6 +615,7 @@ def run_until_complete(self, future): Return the Future's result, or raise its exception. """ self._check_closed() + self._check_runnung() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst new file mode 100644 index 0000000000000..138c93c2e4877 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst @@ -0,0 +1,3 @@ +Perform a check for running loop before starting a new task in +``loop.run_until_complete()`` to fail fast; it prevents the side effect of +new task spawning before exception raising. From webhook-mailer at python.org Sat Jan 4 04:49:23 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 04 Jan 2020 09:49:23 -0000 Subject: [Python-checkins] [3.8] bpo-39191: Don't spawn a task before failing (GH-17796) (GH-17820) Message-ID: https://github.com/python/cpython/commit/867d8333ce6a7f74191ad464acc609d4a04e4acb commit: 867d8333ce6a7f74191ad464acc609d4a04e4acb branch: 3.8 author: Andrew Svetlov committer: GitHub date: 2020-01-04T11:49:11+02:00 summary: [3.8] bpo-39191: Don't spawn a task before failing (GH-17796) (GH-17820) (cherry picked from commit 3a5de511596f17575de082dcb8d43d63b2bd2da9) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst M Lib/asyncio/base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index bfd40115bed38..aedf0c5e6d3d2 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -547,14 +547,17 @@ def _asyncgen_firstiter_hook(self, agen): 'asyncgen': agen }) - def run_forever(self): - """Run until stop() is called.""" - self._check_closed() + def _check_runnung(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: raise RuntimeError( 'Cannot run the event loop while another loop is running') + + def run_forever(self): + """Run until stop() is called.""" + self._check_closed() + self._check_runnung() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -586,6 +589,7 @@ def run_until_complete(self, future): Return the Future's result, or raise its exception. """ self._check_closed() + self._check_runnung() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst new file mode 100644 index 0000000000000..138c93c2e4877 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst @@ -0,0 +1,3 @@ +Perform a check for running loop before starting a new task in +``loop.run_until_complete()`` to fail fast; it prevents the side effect of +new task spawning before exception raising. From webhook-mailer at python.org Sat Jan 4 04:49:37 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 04 Jan 2020 09:49:37 -0000 Subject: [Python-checkins] [3.7] bpo-39191: Don't spawn a task before failing (GH-17796) (#17821) Message-ID: https://github.com/python/cpython/commit/9c145e19fba53369da5cd23a1e71de489836f827 commit: 9c145e19fba53369da5cd23a1e71de489836f827 branch: 3.7 author: Andrew Svetlov committer: GitHub date: 2020-01-04T11:49:32+02:00 summary: [3.7] bpo-39191: Don't spawn a task before failing (GH-17796) (#17821) (cherry picked from commit 3a5de511596f17575de082dcb8d43d63b2bd2da9) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst M Lib/asyncio/base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index fdd80bcfdd906..f7233563446d2 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -518,14 +518,17 @@ def _asyncgen_firstiter_hook(self, agen): 'asyncgen': agen }) - def run_forever(self): - """Run until stop() is called.""" - self._check_closed() + def _check_runnung(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: raise RuntimeError( 'Cannot run the event loop while another loop is running') + + def run_forever(self): + """Run until stop() is called.""" + self._check_closed() + self._check_runnung() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -557,6 +560,7 @@ def run_until_complete(self, future): Return the Future's result, or raise its exception. """ self._check_closed() + self._check_runnung() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst new file mode 100644 index 0000000000000..138c93c2e4877 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst @@ -0,0 +1,3 @@ +Perform a check for running loop before starting a new task in +``loop.run_until_complete()`` to fail fast; it prevents the side effect of +new task spawning before exception raising. From webhook-mailer at python.org Sat Jan 4 07:56:48 2020 From: webhook-mailer at python.org (T. Wouters) Date: Sat, 04 Jan 2020 12:56:48 -0000 Subject: [Python-checkins] bpo-28367: Add additional baud rates for termios (GH-13142) Message-ID: https://github.com/python/cpython/commit/7dc72b8d4f2c9d1eed20f314fd6425eab66cbc89 commit: 7dc72b8d4f2c9d1eed20f314fd6425eab66cbc89 branch: master author: Anthony Shaw committer: T. Wouters date: 2020-01-04T13:56:31+01:00 summary: bpo-28367: Add additional baud rates for termios (GH-13142) Co-authored-by: Andrey Smirnov . Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst M Modules/termios.c diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst b/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst new file mode 100644 index 0000000000000..115f458bfbf3e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst @@ -0,0 +1,13 @@ +Termios magic constants for the following baud rates: + - B500000 + - B576000 + - B921600 + - B1000000 + - B1152000 + - B1500000 + - B2000000 + - B2500000 + - B3000000 + - B3500000 + - B4000000 +Patch by Andrey Smirnov \ No newline at end of file diff --git a/Modules/termios.c b/Modules/termios.c index b3b8c72bf6b84..0fd93c06c7203 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -613,6 +613,39 @@ static struct constant { #ifdef B460800 {"B460800", B460800}, #endif +#ifdef B500000 + {"B500000", B500000}, +#endif +#ifdef B576000 + { "B576000", B576000}, +#endif +#ifdef B921600 + { "B921600", B921600}, +#endif +#ifdef B1000000 + { "B1000000", B1000000}, +#endif +#ifdef B1152000 + { "B1152000", B1152000}, +#endif +#ifdef B1500000 + { "B1500000", B1500000}, +#endif +#ifdef B2000000 + { "B2000000", B2000000}, +#endif +#ifdef B2500000 + { "B2500000", B2500000}, +#endif +#ifdef B3000000 + { "B3000000", B3000000}, +#endif +#ifdef B3500000 + { "B3500000", B3500000}, +#endif +#ifdef B4000000 + { "B4000000", B4000000}, +#endif #ifdef CBAUD {"CBAUD", CBAUD}, #endif From webhook-mailer at python.org Sat Jan 4 20:57:28 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 05 Jan 2020 01:57:28 -0000 Subject: [Python-checkins] Fix SystemError when nested function has annotation on positional-only argument (GH-17826) Message-ID: https://github.com/python/cpython/commit/ec007cb43faf5f33d06efbc28152c7fdcb2edb9c commit: ec007cb43faf5f33d06efbc28152c7fdcb2edb9c branch: master author: Anthony Sottile committer: Pablo Galindo date: 2020-01-05T01:57:21Z summary: Fix SystemError when nested function has annotation on positional-only argument (GH-17826) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst M Lib/test/test_positional_only_arg.py M Python/symtable.c diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 59b0b8fb55621..63dee7ca434b2 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -15,6 +15,10 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b +def global_inner_has_pos_only(): + def f(x: int, /): ... + return f + class PositionalOnlyTestCase(unittest.TestCase): @@ -412,6 +416,9 @@ def method(self, /): self.assertEqual(C().method(), sentinel) + def test_annotations(self): + assert global_inner_has_pos_only().__annotations__ == {'x': int} + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst new file mode 100644 index 0000000000000..9a3178f9c6218 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst @@ -0,0 +1,2 @@ +Fix ``SystemError`` when nested function has annotation on positional-only +argument - by Anthony Sottile. diff --git a/Python/symtable.c b/Python/symtable.c index b8713588b9a91..30482d99b3ca9 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1717,6 +1717,8 @@ static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty a, expr_ty returns) { + if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs)) + return 0; if (a->args && !symtable_visit_argannotations(st, a->args)) return 0; if (a->vararg && a->vararg->annotation) From webhook-mailer at python.org Sat Jan 4 21:15:02 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 02:15:02 -0000 Subject: [Python-checkins] Fix SystemError when nested function has annotation on positional-only argument (GH-17826) Message-ID: https://github.com/python/cpython/commit/859525590c7aad210ae5f2557140a52033c498cd commit: 859525590c7aad210ae5f2557140a52033c498cd branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-04T18:14:58-08:00 summary: Fix SystemError when nested function has annotation on positional-only argument (GH-17826) (cherry picked from commit ec007cb43faf5f33d06efbc28152c7fdcb2edb9c) Co-authored-by: Anthony Sottile files: A Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst M Lib/test/test_positional_only_arg.py M Python/symtable.c diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 59b0b8fb55621..63dee7ca434b2 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -15,6 +15,10 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b +def global_inner_has_pos_only(): + def f(x: int, /): ... + return f + class PositionalOnlyTestCase(unittest.TestCase): @@ -412,6 +416,9 @@ def method(self, /): self.assertEqual(C().method(), sentinel) + def test_annotations(self): + assert global_inner_has_pos_only().__annotations__ == {'x': int} + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst new file mode 100644 index 0000000000000..9a3178f9c6218 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst @@ -0,0 +1,2 @@ +Fix ``SystemError`` when nested function has annotation on positional-only +argument - by Anthony Sottile. diff --git a/Python/symtable.c b/Python/symtable.c index b8713588b9a91..30482d99b3ca9 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1717,6 +1717,8 @@ static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty a, expr_ty returns) { + if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs)) + return 0; if (a->args && !symtable_visit_argannotations(st, a->args)) return 0; if (a->vararg && a->vararg->annotation) From webhook-mailer at python.org Sun Jan 5 07:14:39 2020 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 05 Jan 2020 12:14:39 -0000 Subject: [Python-checkins] bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Message-ID: https://github.com/python/cpython/commit/6a265f0d0c0a4b3b8fecf4275d49187a384167f4 commit: 6a265f0d0c0a4b3b8fecf4275d49187a384167f4 branch: master author: Serhiy Storchaka committer: GitHub date: 2020-01-05T14:14:31+02:00 summary: bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Ignore leading dots and no longer ignore a trailing newline. files: A Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst M Lib/test/test_urllib.py M Lib/urllib/parse.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 95c4ecc4dcf29..2e82fc7b7b861 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -270,14 +270,36 @@ def test_proxy_bypass_environment_host_match(self): self.assertTrue(bypass('localhost')) self.assertTrue(bypass('LocalHost')) # MixedCase self.assertTrue(bypass('LOCALHOST')) # UPPERCASE + self.assertTrue(bypass('.localhost')) self.assertTrue(bypass('newdomain.com:1234')) + self.assertTrue(bypass('.newdomain.com:1234')) self.assertTrue(bypass('foo.d.o.t')) # issue 29142 + self.assertTrue(bypass('d.o.t')) self.assertTrue(bypass('anotherdomain.com:8888')) + self.assertTrue(bypass('.anotherdomain.com:8888')) self.assertTrue(bypass('www.newdomain.com:1234')) self.assertFalse(bypass('prelocalhost')) self.assertFalse(bypass('newdomain.com')) # no port self.assertFalse(bypass('newdomain.com:1235')) # wrong port + def test_proxy_bypass_environment_always_match(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', '*') + self.assertTrue(bypass('newdomain.com')) + self.assertTrue(bypass('newdomain.com:1234')) + self.env.set('NO_PROXY', '*, anotherdomain.com') + self.assertTrue(bypass('anotherdomain.com')) + self.assertFalse(bypass('newdomain.com')) + self.assertFalse(bypass('newdomain.com:1234')) + + def test_proxy_bypass_environment_newline(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', + 'localhost, anotherdomain.com, newdomain.com:1234') + self.assertFalse(bypass('localhost\n')) + self.assertFalse(bypass('anotherdomain.com:8888\n')) + self.assertFalse(bypass('newdomain.com:1234\n')) + class ProxyTests_withOrderedEnv(unittest.TestCase): diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 31fd7e16ee72c..34d5f95dd79bd 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -1056,9 +1056,9 @@ def _splitport(host): """splitport('host:port') --> 'host', 'port'.""" global _portprog if _portprog is None: - _portprog = re.compile('(.*):([0-9]*)$', re.DOTALL) + _portprog = re.compile('(.*):([0-9]*)', re.DOTALL) - match = _portprog.match(host) + match = _portprog.fullmatch(host) if match: host, port = match.groups() if port: diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 39553d809a3f1..a6d350a97a452 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2492,24 +2492,26 @@ def proxy_bypass_environment(host, proxies=None): try: no_proxy = proxies['no'] except KeyError: - return 0 + return False # '*' is special case for always bypass if no_proxy == '*': - return 1 + return True + host = host.lower() # strip port off host hostonly, port = _splitport(host) # check if the host ends with any of the DNS suffixes - no_proxy_list = [proxy.strip() for proxy in no_proxy.split(',')] - for name in no_proxy_list: + for name in no_proxy.split(','): + name = name.strip() if name: name = name.lstrip('.') # ignore leading dots - name = re.escape(name) - pattern = r'(.+\.)?%s$' % name - if (re.match(pattern, hostonly, re.I) - or re.match(pattern, host, re.I)): - return 1 + name = name.lower() + if hostonly == name or host == name: + return True + name = '.' + name + if hostonly.endswith(name) or host.endswith(name): + return True # otherwise, don't bypass - return 0 + return False # This code tests an OSX specific data structure but is testable on all @@ -2635,7 +2637,7 @@ def getproxies_registry(): for p in proxyServer.split(';'): protocol, address = p.split('=', 1) # See if address has a type:// prefix - if not re.match('^([^/:]+)://', address): + if not re.match('(?:[^/:]+)://', address): address = '%s://%s' % (protocol, address) proxies[protocol] = address else: diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst new file mode 100644 index 0000000000000..24a17444b97da --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst @@ -0,0 +1,2 @@ +:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and +no longer ignores a trailing newline. From webhook-mailer at python.org Sun Jan 5 07:15:31 2020 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 05 Jan 2020 12:15:31 -0000 Subject: [Python-checkins] bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) Message-ID: https://github.com/python/cpython/commit/41ec17e45d54473d32f543396293256f1581e44d commit: 41ec17e45d54473d32f543396293256f1581e44d branch: master author: Serhiy Storchaka committer: GitHub date: 2020-01-05T14:15:27+02:00 summary: bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) No longer import the re module if it is not needed. files: A Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst M Lib/test/test_warnings/__init__.py M Lib/warnings.py diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 3a6d64eaad1f8..c6fb097ae6dd2 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -43,6 +43,10 @@ def warnings_state(module): module.filters = original_filters +class TestWarning(Warning): + pass + + class BaseTest: """Basic bookkeeping required for testing.""" @@ -566,9 +570,28 @@ def test_improper_input(self): self.module._setoption, 'bogus::Warning') self.assertRaises(self.module._OptionError, self.module._setoption, 'ignore:2::4:-5') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123abc') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::===') + with self.assertRaisesRegex(self.module._OptionError, 'W?rning'): + self.module._setoption('ignore::W?rning') self.module._setoption('error::Warning::0') self.assertRaises(UserWarning, self.module.warn, 'convert to error') + def test_import_from_module(self): + with original_warnings.catch_warnings(module=self.module): + self.module._setoption('ignore::Warning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::TestWarning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::test.test_warnings.bogus') + self.module._setoption('error::test.test_warnings.TestWarning') + with self.assertRaises(TestWarning): + self.module.warn('test warning', TestWarning) + class CWCmdLineTests(WCmdLineTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py index 00f740ca3a95b..691ccddfa450a 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -211,7 +211,6 @@ def _processoptions(args): # Helper for _processoptions() def _setoption(arg): - import re parts = arg.split(':') if len(parts) > 5: raise _OptionError("too many fields (max 5): %r" % (arg,)) @@ -220,11 +219,13 @@ def _setoption(arg): action, message, category, module, lineno = [s.strip() for s in parts] action = _getaction(action) - message = re.escape(message) category = _getcategory(category) - module = re.escape(module) + if message or module: + import re + if message: + message = re.escape(message) if module: - module = module + '$' + module = re.escape(module) + r'\Z' if lineno: try: lineno = int(lineno) @@ -248,26 +249,21 @@ def _getaction(action): # Helper for _setoption() def _getcategory(category): - import re if not category: return Warning - if re.match("^[a-zA-Z0-9_]+$", category): - try: - cat = eval(category) - except NameError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + if '.' not in category: + import builtins as m + klass = category else: - i = category.rfind(".") - module = category[:i] - klass = category[i+1:] + module, _, klass = category.rpartition('.') try: m = __import__(module, None, None, [klass]) except ImportError: raise _OptionError("invalid module name: %r" % (module,)) from None - try: - cat = getattr(m, klass) - except AttributeError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) from None if not issubclass(cat, Warning): raise _OptionError("invalid warning category: %r" % (category,)) return cat diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst new file mode 100644 index 0000000000000..d5d2b98e9b0b3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst @@ -0,0 +1,2 @@ +Fixed handling invalid warning category in the -W option. No longer import +the re module if it is not needed. From webhook-mailer at python.org Sun Jan 5 07:15:54 2020 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 05 Jan 2020 12:15:54 -0000 Subject: [Python-checkins] bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) Message-ID: https://github.com/python/cpython/commit/b19c0d77e6f25ea831ab608c71f15d0d9266c8c4 commit: b19c0d77e6f25ea831ab608c71f15d0d9266c8c4 branch: master author: Serhiy Storchaka committer: GitHub date: 2020-01-05T14:15:50+02:00 summary: bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) files: A Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst M Lib/base64.py M Lib/test/test_base64.py diff --git a/Lib/base64.py b/Lib/base64.py index 2be9c395a9667..2e70223dfe782 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -82,7 +82,7 @@ def b64decode(s, altchars=None, validate=False): altchars = _bytes_from_decode_data(altchars) assert len(altchars) == 2, repr(altchars) s = s.translate(bytes.maketrans(altchars, b'+/')) - if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s): raise binascii.Error('Non-base64 digit found') return binascii.a2b_base64(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 2a4cc2acad24b..7dba6635d4eae 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -250,6 +250,7 @@ def test_b64decode_invalid_chars(self): (b'3d}==', b'\xdd'), (b'@@', b''), (b'!', b''), + (b"YWJj\n", b"abc"), (b'YWJj\nYWI=', b'abcab')) funcs = ( base64.b64decode, diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst new file mode 100644 index 0000000000000..83b1431e92fcb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst @@ -0,0 +1,2 @@ +:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error +if the input ends with a single ``\n``. From webhook-mailer at python.org Sun Jan 5 07:31:48 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 12:31:48 -0000 Subject: [Python-checkins] bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Message-ID: https://github.com/python/cpython/commit/880a17af7d063fcef225a46b7f4ae35d792b2f11 commit: 880a17af7d063fcef225a46b7f4ae35d792b2f11 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T04:31:44-08:00 summary: bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Ignore leading dots and no longer ignore a trailing newline. (cherry picked from commit 6a265f0d0c0a4b3b8fecf4275d49187a384167f4) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst M Lib/test/test_urllib.py M Lib/urllib/parse.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 7ec365b928a5c..113c678dc1a6d 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -253,14 +253,36 @@ def test_proxy_bypass_environment_host_match(self): self.assertTrue(bypass('localhost')) self.assertTrue(bypass('LocalHost')) # MixedCase self.assertTrue(bypass('LOCALHOST')) # UPPERCASE + self.assertTrue(bypass('.localhost')) self.assertTrue(bypass('newdomain.com:1234')) + self.assertTrue(bypass('.newdomain.com:1234')) self.assertTrue(bypass('foo.d.o.t')) # issue 29142 + self.assertTrue(bypass('d.o.t')) self.assertTrue(bypass('anotherdomain.com:8888')) + self.assertTrue(bypass('.anotherdomain.com:8888')) self.assertTrue(bypass('www.newdomain.com:1234')) self.assertFalse(bypass('prelocalhost')) self.assertFalse(bypass('newdomain.com')) # no port self.assertFalse(bypass('newdomain.com:1235')) # wrong port + def test_proxy_bypass_environment_always_match(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', '*') + self.assertTrue(bypass('newdomain.com')) + self.assertTrue(bypass('newdomain.com:1234')) + self.env.set('NO_PROXY', '*, anotherdomain.com') + self.assertTrue(bypass('anotherdomain.com')) + self.assertFalse(bypass('newdomain.com')) + self.assertFalse(bypass('newdomain.com:1234')) + + def test_proxy_bypass_environment_newline(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', + 'localhost, anotherdomain.com, newdomain.com:1234') + self.assertFalse(bypass('localhost\n')) + self.assertFalse(bypass('anotherdomain.com:8888\n')) + self.assertFalse(bypass('newdomain.com:1234\n')) + class ProxyTests_withOrderedEnv(unittest.TestCase): diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 1d4dc74b040ed..dc3de51a5c2cb 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -997,9 +997,9 @@ def splitport(host): """splitport('host:port') --> 'host', 'port'.""" global _portprog if _portprog is None: - _portprog = re.compile('(.*):([0-9]*)$', re.DOTALL) + _portprog = re.compile('(.*):([0-9]*)', re.DOTALL) - match = _portprog.match(host) + match = _portprog.fullmatch(host) if match: host, port = match.groups() if port: diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 1ec484ed249c6..211cb6857f728 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2499,24 +2499,26 @@ def proxy_bypass_environment(host, proxies=None): try: no_proxy = proxies['no'] except KeyError: - return 0 + return False # '*' is special case for always bypass if no_proxy == '*': - return 1 + return True + host = host.lower() # strip port off host hostonly, port = splitport(host) # check if the host ends with any of the DNS suffixes - no_proxy_list = [proxy.strip() for proxy in no_proxy.split(',')] - for name in no_proxy_list: + for name in no_proxy.split(','): + name = name.strip() if name: name = name.lstrip('.') # ignore leading dots - name = re.escape(name) - pattern = r'(.+\.)?%s$' % name - if (re.match(pattern, hostonly, re.I) - or re.match(pattern, host, re.I)): - return 1 + name = name.lower() + if hostonly == name or host == name: + return True + name = '.' + name + if hostonly.endswith(name) or host.endswith(name): + return True # otherwise, don't bypass - return 0 + return False # This code tests an OSX specific data structure but is testable on all @@ -2642,7 +2644,7 @@ def getproxies_registry(): for p in proxyServer.split(';'): protocol, address = p.split('=', 1) # See if address has a type:// prefix - if not re.match('^([^/:]+)://', address): + if not re.match('(?:[^/:]+)://', address): address = '%s://%s' % (protocol, address) proxies[protocol] = address else: diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst new file mode 100644 index 0000000000000..24a17444b97da --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst @@ -0,0 +1,2 @@ +:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and +no longer ignores a trailing newline. From webhook-mailer at python.org Sun Jan 5 07:32:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 12:32:05 -0000 Subject: [Python-checkins] bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Message-ID: https://github.com/python/cpython/commit/fc84d501b9d77701cbdd485de45e200bf027c0e9 commit: fc84d501b9d77701cbdd485de45e200bf027c0e9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T04:32:00-08:00 summary: bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Ignore leading dots and no longer ignore a trailing newline. (cherry picked from commit 6a265f0d0c0a4b3b8fecf4275d49187a384167f4) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst M Lib/test/test_urllib.py M Lib/urllib/parse.py M Lib/urllib/request.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 801f0fd647f4a..e9c656c583bbd 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -261,14 +261,36 @@ def test_proxy_bypass_environment_host_match(self): self.assertTrue(bypass('localhost')) self.assertTrue(bypass('LocalHost')) # MixedCase self.assertTrue(bypass('LOCALHOST')) # UPPERCASE + self.assertTrue(bypass('.localhost')) self.assertTrue(bypass('newdomain.com:1234')) + self.assertTrue(bypass('.newdomain.com:1234')) self.assertTrue(bypass('foo.d.o.t')) # issue 29142 + self.assertTrue(bypass('d.o.t')) self.assertTrue(bypass('anotherdomain.com:8888')) + self.assertTrue(bypass('.anotherdomain.com:8888')) self.assertTrue(bypass('www.newdomain.com:1234')) self.assertFalse(bypass('prelocalhost')) self.assertFalse(bypass('newdomain.com')) # no port self.assertFalse(bypass('newdomain.com:1235')) # wrong port + def test_proxy_bypass_environment_always_match(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', '*') + self.assertTrue(bypass('newdomain.com')) + self.assertTrue(bypass('newdomain.com:1234')) + self.env.set('NO_PROXY', '*, anotherdomain.com') + self.assertTrue(bypass('anotherdomain.com')) + self.assertFalse(bypass('newdomain.com')) + self.assertFalse(bypass('newdomain.com:1234')) + + def test_proxy_bypass_environment_newline(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', + 'localhost, anotherdomain.com, newdomain.com:1234') + self.assertFalse(bypass('localhost\n')) + self.assertFalse(bypass('anotherdomain.com:8888\n')) + self.assertFalse(bypass('newdomain.com:1234\n')) + class ProxyTests_withOrderedEnv(unittest.TestCase): diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index d497925b943f4..0b39b6eaf7ded 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -1054,9 +1054,9 @@ def _splitport(host): """splitport('host:port') --> 'host', 'port'.""" global _portprog if _portprog is None: - _portprog = re.compile('(.*):([0-9]*)$', re.DOTALL) + _portprog = re.compile('(.*):([0-9]*)', re.DOTALL) - match = _portprog.match(host) + match = _portprog.fullmatch(host) if match: host, port = match.groups() if port: diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 51c4759629fd1..6f6577bf1d902 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2500,24 +2500,26 @@ def proxy_bypass_environment(host, proxies=None): try: no_proxy = proxies['no'] except KeyError: - return 0 + return False # '*' is special case for always bypass if no_proxy == '*': - return 1 + return True + host = host.lower() # strip port off host hostonly, port = _splitport(host) # check if the host ends with any of the DNS suffixes - no_proxy_list = [proxy.strip() for proxy in no_proxy.split(',')] - for name in no_proxy_list: + for name in no_proxy.split(','): + name = name.strip() if name: name = name.lstrip('.') # ignore leading dots - name = re.escape(name) - pattern = r'(.+\.)?%s$' % name - if (re.match(pattern, hostonly, re.I) - or re.match(pattern, host, re.I)): - return 1 + name = name.lower() + if hostonly == name or host == name: + return True + name = '.' + name + if hostonly.endswith(name) or host.endswith(name): + return True # otherwise, don't bypass - return 0 + return False # This code tests an OSX specific data structure but is testable on all @@ -2643,7 +2645,7 @@ def getproxies_registry(): for p in proxyServer.split(';'): protocol, address = p.split('=', 1) # See if address has a type:// prefix - if not re.match('^([^/:]+)://', address): + if not re.match('(?:[^/:]+)://', address): address = '%s://%s' % (protocol, address) proxies[protocol] = address else: diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst new file mode 100644 index 0000000000000..24a17444b97da --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst @@ -0,0 +1,2 @@ +:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and +no longer ignores a trailing newline. From webhook-mailer at python.org Sun Jan 5 07:32:49 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 12:32:49 -0000 Subject: [Python-checkins] bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) Message-ID: https://github.com/python/cpython/commit/3bdb2d9daf3ce41b325bd508e3dd29041e85dd1f commit: 3bdb2d9daf3ce41b325bd508e3dd29041e85dd1f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T04:32:45-08:00 summary: bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) (cherry picked from commit b19c0d77e6f25ea831ab608c71f15d0d9266c8c4) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst M Lib/base64.py M Lib/test/test_base64.py diff --git a/Lib/base64.py b/Lib/base64.py index 2be9c395a9667..2e70223dfe782 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -82,7 +82,7 @@ def b64decode(s, altchars=None, validate=False): altchars = _bytes_from_decode_data(altchars) assert len(altchars) == 2, repr(altchars) s = s.translate(bytes.maketrans(altchars, b'+/')) - if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s): raise binascii.Error('Non-base64 digit found') return binascii.a2b_base64(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 2a4cc2acad24b..7dba6635d4eae 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -250,6 +250,7 @@ def test_b64decode_invalid_chars(self): (b'3d}==', b'\xdd'), (b'@@', b''), (b'!', b''), + (b"YWJj\n", b"abc"), (b'YWJj\nYWI=', b'abcab')) funcs = ( base64.b64decode, diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst new file mode 100644 index 0000000000000..83b1431e92fcb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst @@ -0,0 +1,2 @@ +:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error +if the input ends with a single ``\n``. From webhook-mailer at python.org Sun Jan 5 07:33:12 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 12:33:12 -0000 Subject: [Python-checkins] bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) Message-ID: https://github.com/python/cpython/commit/e1caa49f68dd63b534774aebad0c240143e6fb5d commit: e1caa49f68dd63b534774aebad0c240143e6fb5d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T04:33:08-08:00 summary: bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) No longer import the re module if it is not needed. (cherry picked from commit 41ec17e45d54473d32f543396293256f1581e44d) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst M Lib/test/test_warnings/__init__.py M Lib/warnings.py diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index fc3f8f6fe7f0c..985adc1cda781 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -43,6 +43,10 @@ def warnings_state(module): module.filters = original_filters +class TestWarning(Warning): + pass + + class BaseTest: """Basic bookkeeping required for testing.""" @@ -566,9 +570,28 @@ def test_improper_input(self): self.module._setoption, 'bogus::Warning') self.assertRaises(self.module._OptionError, self.module._setoption, 'ignore:2::4:-5') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123abc') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::===') + with self.assertRaisesRegex(self.module._OptionError, 'W?rning'): + self.module._setoption('ignore::W?rning') self.module._setoption('error::Warning::0') self.assertRaises(UserWarning, self.module.warn, 'convert to error') + def test_import_from_module(self): + with original_warnings.catch_warnings(module=self.module): + self.module._setoption('ignore::Warning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::TestWarning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::test.test_warnings.bogus') + self.module._setoption('error::test.test_warnings.TestWarning') + with self.assertRaises(TestWarning): + self.module.warn('test warning', TestWarning) + class CWCmdLineTests(WCmdLineTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py index 00f740ca3a95b..691ccddfa450a 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -211,7 +211,6 @@ def _processoptions(args): # Helper for _processoptions() def _setoption(arg): - import re parts = arg.split(':') if len(parts) > 5: raise _OptionError("too many fields (max 5): %r" % (arg,)) @@ -220,11 +219,13 @@ def _setoption(arg): action, message, category, module, lineno = [s.strip() for s in parts] action = _getaction(action) - message = re.escape(message) category = _getcategory(category) - module = re.escape(module) + if message or module: + import re + if message: + message = re.escape(message) if module: - module = module + '$' + module = re.escape(module) + r'\Z' if lineno: try: lineno = int(lineno) @@ -248,26 +249,21 @@ def _getaction(action): # Helper for _setoption() def _getcategory(category): - import re if not category: return Warning - if re.match("^[a-zA-Z0-9_]+$", category): - try: - cat = eval(category) - except NameError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + if '.' not in category: + import builtins as m + klass = category else: - i = category.rfind(".") - module = category[:i] - klass = category[i+1:] + module, _, klass = category.rpartition('.') try: m = __import__(module, None, None, [klass]) except ImportError: raise _OptionError("invalid module name: %r" % (module,)) from None - try: - cat = getattr(m, klass) - except AttributeError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) from None if not issubclass(cat, Warning): raise _OptionError("invalid warning category: %r" % (category,)) return cat diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst new file mode 100644 index 0000000000000..d5d2b98e9b0b3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst @@ -0,0 +1,2 @@ +Fixed handling invalid warning category in the -W option. No longer import +the re module if it is not needed. From webhook-mailer at python.org Sun Jan 5 07:35:03 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 12:35:03 -0000 Subject: [Python-checkins] bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) Message-ID: https://github.com/python/cpython/commit/43fbc70360b2a934ea809b2175d7e99031db2df3 commit: 43fbc70360b2a934ea809b2175d7e99031db2df3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T04:34:58-08:00 summary: bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) No longer import the re module if it is not needed. (cherry picked from commit 41ec17e45d54473d32f543396293256f1581e44d) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst M Lib/test/test_warnings/__init__.py M Lib/warnings.py diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 87cc3a7e36ae6..d41f3dff02125 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -43,6 +43,10 @@ def warnings_state(module): module.filters = original_filters +class TestWarning(Warning): + pass + + class BaseTest: """Basic bookkeeping required for testing.""" @@ -629,9 +633,28 @@ def test_improper_input(self): self.module._setoption, 'bogus::Warning') self.assertRaises(self.module._OptionError, self.module._setoption, 'ignore:2::4:-5') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123abc') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::===') + with self.assertRaisesRegex(self.module._OptionError, 'W?rning'): + self.module._setoption('ignore::W?rning') self.module._setoption('error::Warning::0') self.assertRaises(UserWarning, self.module.warn, 'convert to error') + def test_import_from_module(self): + with original_warnings.catch_warnings(module=self.module): + self.module._setoption('ignore::Warning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::TestWarning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::test.test_warnings.bogus') + self.module._setoption('error::test.test_warnings.TestWarning') + with self.assertRaises(TestWarning): + self.module.warn('test warning', TestWarning) + class CWCmdLineTests(WCmdLineTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py index 9064f56827df3..3e1715c4b4935 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -211,7 +211,6 @@ def _processoptions(args): # Helper for _processoptions() def _setoption(arg): - import re parts = arg.split(':') if len(parts) > 5: raise _OptionError("too many fields (max 5): %r" % (arg,)) @@ -220,11 +219,13 @@ def _setoption(arg): action, message, category, module, lineno = [s.strip() for s in parts] action = _getaction(action) - message = re.escape(message) category = _getcategory(category) - module = re.escape(module) + if message or module: + import re + if message: + message = re.escape(message) if module: - module = module + '$' + module = re.escape(module) + r'\Z' if lineno: try: lineno = int(lineno) @@ -248,26 +249,21 @@ def _getaction(action): # Helper for _setoption() def _getcategory(category): - import re if not category: return Warning - if re.match("^[a-zA-Z0-9_]+$", category): - try: - cat = eval(category) - except NameError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + if '.' not in category: + import builtins as m + klass = category else: - i = category.rfind(".") - module = category[:i] - klass = category[i+1:] + module, _, klass = category.rpartition('.') try: m = __import__(module, None, None, [klass]) except ImportError: raise _OptionError("invalid module name: %r" % (module,)) from None - try: - cat = getattr(m, klass) - except AttributeError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) from None if not issubclass(cat, Warning): raise _OptionError("invalid warning category: %r" % (category,)) return cat diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst new file mode 100644 index 0000000000000..d5d2b98e9b0b3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst @@ -0,0 +1,2 @@ +Fixed handling invalid warning category in the -W option. No longer import +the re module if it is not needed. From webhook-mailer at python.org Sun Jan 5 07:36:52 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 12:36:52 -0000 Subject: [Python-checkins] bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) Message-ID: https://github.com/python/cpython/commit/34aa3e71dc52c1a31336302905b9ac011a310412 commit: 34aa3e71dc52c1a31336302905b9ac011a310412 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T04:36:48-08:00 summary: bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) (cherry picked from commit b19c0d77e6f25ea831ab608c71f15d0d9266c8c4) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst M Lib/base64.py M Lib/test/test_base64.py diff --git a/Lib/base64.py b/Lib/base64.py index 2be9c395a9667..2e70223dfe782 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -82,7 +82,7 @@ def b64decode(s, altchars=None, validate=False): altchars = _bytes_from_decode_data(altchars) assert len(altchars) == 2, repr(altchars) s = s.translate(bytes.maketrans(altchars, b'+/')) - if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s): raise binascii.Error('Non-base64 digit found') return binascii.a2b_base64(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 2a4cc2acad24b..7dba6635d4eae 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -250,6 +250,7 @@ def test_b64decode_invalid_chars(self): (b'3d}==', b'\xdd'), (b'@@', b''), (b'!', b''), + (b"YWJj\n", b"abc"), (b'YWJj\nYWI=', b'abcab')) funcs = ( base64.b64decode, diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst new file mode 100644 index 0000000000000..83b1431e92fcb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst @@ -0,0 +1,2 @@ +:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error +if the input ends with a single ``\n``. From webhook-mailer at python.org Sun Jan 5 11:24:06 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 05 Jan 2020 16:24:06 -0000 Subject: [Python-checkins] bpo-39152: add missing ttk.Scale.configure return value (GH-17815) Message-ID: https://github.com/python/cpython/commit/5ea7bb25e3b192d6c49a49c9e3b316f8559602aa commit: 5ea7bb25e3b192d6c49a49c9e3b316f8559602aa branch: master author: Terry Jan Reedy committer: GitHub date: 2020-01-05T11:23:58-05:00 summary: bpo-39152: add missing ttk.Scale.configure return value (GH-17815) tkinter.ttk.Scale().configure([name]) now returns a configuration tuple for name or a list thereof for all options. Based on patch Giovanni Lombardo. files: A Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst M Lib/tkinter/test/widget_tests.py M Lib/tkinter/ttk.py diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index 75a068fbbf26b..b42ff52178f29 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -3,7 +3,6 @@ import unittest import sys import tkinter -from tkinter.ttk import Scale from tkinter.test.support import (AbstractTkTest, tcl_version, requires_tcl, get_tk_patchlevel, pixels_conv, tcl_obj_eq) import test.support @@ -63,11 +62,9 @@ def checkParam(self, widget, name, value, *, expected=_sentinel, eq = tcl_obj_eq self.assertEqual2(widget[name], expected, eq=eq) self.assertEqual2(widget.cget(name), expected, eq=eq) - # XXX - if not isinstance(widget, Scale): - t = widget.configure(name) - self.assertEqual(len(t), 5) - self.assertEqual2(t[4], expected, eq=eq) + t = widget.configure(name) + self.assertEqual(len(t), 5) + self.assertEqual2(t[4], expected, eq=eq) def checkInvalidParam(self, widget, name, value, errmsg=None, *, keep_orig=True): @@ -209,9 +206,7 @@ def assertIsBoundingBox(self, bbox): def test_keys(self): widget = self.create() keys = widget.keys() - # XXX - if not isinstance(widget, Scale): - self.assertEqual(sorted(keys), sorted(widget.configure())) + self.assertEqual(sorted(keys), sorted(widget.configure())) for k in keys: widget[k] # Test if OPTIONS contains all keys diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index 573544dd84a39..c7c71cd5a559c 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -1084,11 +1084,12 @@ def configure(self, cnf=None, **kw): Setting a value for any of the "from", "from_" or "to" options generates a <> event.""" - if cnf: + retval = Widget.configure(self, cnf, **kw) + if not isinstance(cnf, (type(None), str)): kw.update(cnf) - Widget.configure(self, **kw) if any(['from' in kw, 'from_' in kw, 'to' in kw]): self.event_generate('<>') + return retval def get(self, x=None, y=None): diff --git a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst new file mode 100644 index 0000000000000..abb3df0da0fe4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst @@ -0,0 +1,2 @@ +Fix ttk.Scale.configure([name]) to return configuration tuple for name +or all options. Giovanni Lombardo contributed part of the patch. From webhook-mailer at python.org Sun Jan 5 11:49:52 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 16:49:52 -0000 Subject: [Python-checkins] bpo-39152: add missing ttk.Scale.configure return value (GH-17815) Message-ID: https://github.com/python/cpython/commit/6234301bb56a9b388a1c3bf51169a2762ea09172 commit: 6234301bb56a9b388a1c3bf51169a2762ea09172 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T08:49:48-08:00 summary: bpo-39152: add missing ttk.Scale.configure return value (GH-17815) tkinter.ttk.Scale().configure([name]) now returns a configuration tuple for name or a list thereof for all options. Based on patch Giovanni Lombardo. (cherry picked from commit 5ea7bb25e3b192d6c49a49c9e3b316f8559602aa) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst M Lib/tkinter/test/widget_tests.py M Lib/tkinter/ttk.py diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index 75a068fbbf26b..b42ff52178f29 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -3,7 +3,6 @@ import unittest import sys import tkinter -from tkinter.ttk import Scale from tkinter.test.support import (AbstractTkTest, tcl_version, requires_tcl, get_tk_patchlevel, pixels_conv, tcl_obj_eq) import test.support @@ -63,11 +62,9 @@ def checkParam(self, widget, name, value, *, expected=_sentinel, eq = tcl_obj_eq self.assertEqual2(widget[name], expected, eq=eq) self.assertEqual2(widget.cget(name), expected, eq=eq) - # XXX - if not isinstance(widget, Scale): - t = widget.configure(name) - self.assertEqual(len(t), 5) - self.assertEqual2(t[4], expected, eq=eq) + t = widget.configure(name) + self.assertEqual(len(t), 5) + self.assertEqual2(t[4], expected, eq=eq) def checkInvalidParam(self, widget, name, value, errmsg=None, *, keep_orig=True): @@ -209,9 +206,7 @@ def assertIsBoundingBox(self, bbox): def test_keys(self): widget = self.create() keys = widget.keys() - # XXX - if not isinstance(widget, Scale): - self.assertEqual(sorted(keys), sorted(widget.configure())) + self.assertEqual(sorted(keys), sorted(widget.configure())) for k in keys: widget[k] # Test if OPTIONS contains all keys diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index 12f4ac0bd9086..52b1a30928c6e 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -1086,11 +1086,12 @@ def configure(self, cnf=None, **kw): Setting a value for any of the "from", "from_" or "to" options generates a <> event.""" - if cnf: + retval = Widget.configure(self, cnf, **kw) + if not isinstance(cnf, (type(None), str)): kw.update(cnf) - Widget.configure(self, **kw) if any(['from' in kw, 'from_' in kw, 'to' in kw]): self.event_generate('<>') + return retval def get(self, x=None, y=None): diff --git a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst new file mode 100644 index 0000000000000..abb3df0da0fe4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst @@ -0,0 +1,2 @@ +Fix ttk.Scale.configure([name]) to return configuration tuple for name +or all options. Giovanni Lombardo contributed part of the patch. From webhook-mailer at python.org Sun Jan 5 12:04:03 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 05 Jan 2020 17:04:03 -0000 Subject: [Python-checkins] Fix constant folding optimization for positional only arguments (GH-17837) Message-ID: https://github.com/python/cpython/commit/b121a4a45ff4bab8812a9b26ceffe5ad642f5d5a commit: b121a4a45ff4bab8812a9b26ceffe5ad642f5d5a branch: master author: Anthony Sottile committer: Pablo Galindo date: 2020-01-05T17:03:56Z summary: Fix constant folding optimization for positional only arguments (GH-17837) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst M Lib/test/test_positional_only_arg.py M Python/ast_opt.c diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 63dee7ca434b2..2ef40e3a5a113 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -1,5 +1,6 @@ """Unit tests for the positional only argument syntax specified in PEP 570.""" +import dis import pickle import unittest @@ -419,6 +420,17 @@ def method(self, /): def test_annotations(self): assert global_inner_has_pos_only().__annotations__ == {'x': int} + def test_annotations_constant_fold(self): + def g(): + def f(x: not (int is int), /): ... + + # without constant folding we end up with + # COMPARE_OP(is), UNARY_NOT + # with constant folding we should expect a COMPARE_OP(is not) + codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] + self.assertNotIn(('UNARY_NOT', None), codes) + self.assertIn(('COMPARE_OP', 'is not'), codes) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst new file mode 100644 index 0000000000000..971b06552973e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst @@ -0,0 +1,2 @@ +Fix constant folding optimization for positional only arguments - by Anthony +Sottile. diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 96c766fc0957d..f2a2c25914993 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -617,6 +617,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) static int astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) { + CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs); CALL_SEQ(astfold_arg, arg_ty, node_->args); CALL_OPT(astfold_arg, arg_ty, node_->vararg); CALL_SEQ(astfold_arg, arg_ty, node_->kwonlyargs); From webhook-mailer at python.org Sun Jan 5 12:07:37 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 17:07:37 -0000 Subject: [Python-checkins] bpo-39152: add missing ttk.Scale.configure return value (GH-17815) Message-ID: https://github.com/python/cpython/commit/636a850ed81cf9b8feed523f277b1538bfc5230b commit: 636a850ed81cf9b8feed523f277b1538bfc5230b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T09:07:30-08:00 summary: bpo-39152: add missing ttk.Scale.configure return value (GH-17815) tkinter.ttk.Scale().configure([name]) now returns a configuration tuple for name or a list thereof for all options. Based on patch Giovanni Lombardo. (cherry picked from commit 5ea7bb25e3b192d6c49a49c9e3b316f8559602aa) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst M Lib/tkinter/test/widget_tests.py M Lib/tkinter/ttk.py diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index 75a068fbbf26b..b42ff52178f29 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -3,7 +3,6 @@ import unittest import sys import tkinter -from tkinter.ttk import Scale from tkinter.test.support import (AbstractTkTest, tcl_version, requires_tcl, get_tk_patchlevel, pixels_conv, tcl_obj_eq) import test.support @@ -63,11 +62,9 @@ def checkParam(self, widget, name, value, *, expected=_sentinel, eq = tcl_obj_eq self.assertEqual2(widget[name], expected, eq=eq) self.assertEqual2(widget.cget(name), expected, eq=eq) - # XXX - if not isinstance(widget, Scale): - t = widget.configure(name) - self.assertEqual(len(t), 5) - self.assertEqual2(t[4], expected, eq=eq) + t = widget.configure(name) + self.assertEqual(len(t), 5) + self.assertEqual2(t[4], expected, eq=eq) def checkInvalidParam(self, widget, name, value, errmsg=None, *, keep_orig=True): @@ -209,9 +206,7 @@ def assertIsBoundingBox(self, bbox): def test_keys(self): widget = self.create() keys = widget.keys() - # XXX - if not isinstance(widget, Scale): - self.assertEqual(sorted(keys), sorted(widget.configure())) + self.assertEqual(sorted(keys), sorted(widget.configure())) for k in keys: widget[k] # Test if OPTIONS contains all keys diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index 573544dd84a39..c7c71cd5a559c 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -1084,11 +1084,12 @@ def configure(self, cnf=None, **kw): Setting a value for any of the "from", "from_" or "to" options generates a <> event.""" - if cnf: + retval = Widget.configure(self, cnf, **kw) + if not isinstance(cnf, (type(None), str)): kw.update(cnf) - Widget.configure(self, **kw) if any(['from' in kw, 'from_' in kw, 'to' in kw]): self.event_generate('<>') + return retval def get(self, x=None, y=None): diff --git a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst new file mode 100644 index 0000000000000..abb3df0da0fe4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst @@ -0,0 +1,2 @@ +Fix ttk.Scale.configure([name]) to return configuration tuple for name +or all options. Giovanni Lombardo contributed part of the patch. From webhook-mailer at python.org Sun Jan 5 12:21:51 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 17:21:51 -0000 Subject: [Python-checkins] Fix constant folding optimization for positional only arguments (GH-17837) Message-ID: https://github.com/python/cpython/commit/49c108c8324c14e41ddf2a909dcab687f3d34b14 commit: 49c108c8324c14e41ddf2a909dcab687f3d34b14 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T09:21:47-08:00 summary: Fix constant folding optimization for positional only arguments (GH-17837) (cherry picked from commit b121a4a45ff4bab8812a9b26ceffe5ad642f5d5a) Co-authored-by: Anthony Sottile files: A Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst M Lib/test/test_positional_only_arg.py M Python/ast_opt.c diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 63dee7ca434b2..2ef40e3a5a113 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -1,5 +1,6 @@ """Unit tests for the positional only argument syntax specified in PEP 570.""" +import dis import pickle import unittest @@ -419,6 +420,17 @@ def method(self, /): def test_annotations(self): assert global_inner_has_pos_only().__annotations__ == {'x': int} + def test_annotations_constant_fold(self): + def g(): + def f(x: not (int is int), /): ... + + # without constant folding we end up with + # COMPARE_OP(is), UNARY_NOT + # with constant folding we should expect a COMPARE_OP(is not) + codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] + self.assertNotIn(('UNARY_NOT', None), codes) + self.assertIn(('COMPARE_OP', 'is not'), codes) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst new file mode 100644 index 0000000000000..971b06552973e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst @@ -0,0 +1,2 @@ +Fix constant folding optimization for positional only arguments - by Anthony +Sottile. diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 96c766fc0957d..f2a2c25914993 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -617,6 +617,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) static int astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) { + CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs); CALL_SEQ(astfold_arg, arg_ty, node_->args); CALL_OPT(astfold_arg, arg_ty, node_->vararg); CALL_SEQ(astfold_arg, arg_ty, node_->kwonlyargs); From webhook-mailer at python.org Sun Jan 5 12:30:58 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 05 Jan 2020 17:30:58 -0000 Subject: [Python-checkins] bpo-39200: Correct the error message for range() empty constructor (GH-17813) Message-ID: https://github.com/python/cpython/commit/4b66fa6ce9c37e70b55af220d0e07368319de803 commit: 4b66fa6ce9c37e70b55af220d0e07368319de803 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-05T17:30:53Z summary: bpo-39200: Correct the error message for range() empty constructor (GH-17813) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst M Lib/test/test_range.py M Objects/rangeobject.c diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 73cbcc4717d7d..30fa129b50ecb 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -91,6 +91,19 @@ def test_range(self): r = range(-sys.maxsize, sys.maxsize, 2) self.assertEqual(len(r), sys.maxsize) + def test_range_constructor_error_messages(self): + with self.assertRaisesRegex( + TypeError, + "range expected at least 1 argument, got 0" + ): + range() + + with self.assertRaisesRegex( + TypeError, + "range expected at most 3 arguments, got 6" + ): + range(1, 2, 3, 4, 5, 6) + def test_large_operands(self): x = range(10**20, 10**20+10, 3) self.assertEqual(len(x), 4) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst new file mode 100644 index 0000000000000..e5cb396643fe0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst @@ -0,0 +1,2 @@ +Correct the error message when trying to construct :class:`range` objects +with no arguments. Patch by Pablo Galindo. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 239ace6f4235e..9311f8b1f174c 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -77,37 +77,52 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (!_PyArg_NoKeywords("range", kw)) return NULL; - if (PyTuple_Size(args) <= 1) { - if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop)) + Py_ssize_t num_args = PyTuple_GET_SIZE(args); + switch (num_args) { + case 3: + step = PyTuple_GET_ITEM(args, 2); + /* fallthrough */ + case 2: + start = PyTuple_GET_ITEM(args, 0); + start = PyNumber_Index(start); + if (!start) { + return NULL; + } + + stop = PyTuple_GET_ITEM(args, 1); + stop = PyNumber_Index(stop); + if (!stop) { + Py_DECREF(start); + return NULL; + } + + step = validate_step(step); + if (!step) { + Py_DECREF(start); + Py_DECREF(stop); + return NULL; + } + break; + case 1: + stop = PyTuple_GET_ITEM(args, 0); + stop = PyNumber_Index(stop); + if (!stop) { + return NULL; + } + Py_INCREF(_PyLong_Zero); + start = _PyLong_Zero; + Py_INCREF(_PyLong_One); + step = _PyLong_One; + break; + case 0: + PyErr_SetString(PyExc_TypeError, + "range expected at least 1 argument, got 0"); return NULL; - stop = PyNumber_Index(stop); - if (!stop) + default: + PyErr_Format(PyExc_TypeError, + "range expected at most 3 arguments, got %zd", + num_args); return NULL; - Py_INCREF(_PyLong_Zero); - start = _PyLong_Zero; - Py_INCREF(_PyLong_One); - step = _PyLong_One; - } - else { - if (!PyArg_UnpackTuple(args, "range", 2, 3, - &start, &stop, &step)) - return NULL; - - /* Convert borrowed refs to owned refs */ - start = PyNumber_Index(start); - if (!start) - return NULL; - stop = PyNumber_Index(stop); - if (!stop) { - Py_DECREF(start); - return NULL; - } - step = validate_step(step); /* Caution, this can clear exceptions */ - if (!step) { - Py_DECREF(start); - Py_DECREF(stop); - return NULL; - } } obj = make_range_object(type, start, stop, step); From webhook-mailer at python.org Sun Jan 5 13:52:46 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 05 Jan 2020 18:52:46 -0000 Subject: [Python-checkins] Organise and clean test_positional_only_arg and add more tests (GH-17842) Message-ID: https://github.com/python/cpython/commit/422ed16fb846eec0b5b2a4eb3a978c9862615665 commit: 422ed16fb846eec0b5b2a4eb3a978c9862615665 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-05T18:52:39Z summary: Organise and clean test_positional_only_arg and add more tests (GH-17842) files: M Lib/test/test_positional_only_arg.py diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 2ef40e3a5a113..bf332e552590b 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -16,11 +16,6 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b -def global_inner_has_pos_only(): - def f(x: int, /): ... - return f - - class PositionalOnlyTestCase(unittest.TestCase): def assertRaisesSyntaxError(self, codestr, regex="invalid syntax"): @@ -266,12 +261,6 @@ def f(self, a, b, /): with self.assertRaisesRegex(TypeError, expected): Example().f(1, b=2) - def test_mangling(self): - class X: - def f(self, *, __a=42): - return __a - self.assertEqual(X().f(), 42) - def test_module_function(self): with self.assertRaisesRegex(TypeError, r"f\(\) missing 2 required positional arguments: 'a' and 'b'"): global_pos_only_f() @@ -307,6 +296,29 @@ def g(x2,/,y2): with self.assertRaisesRegex(TypeError, r"g\(\) takes 2 positional arguments but 3 were given"): f(1,2)(3,4,5) + def test_annotations_in_closures(self): + + def inner_has_pos_only(): + def f(x: int, /): ... + return f + + assert inner_has_pos_only().__annotations__ == {'x': int} + + class Something: + def method(self): + def f(x: int, /): ... + return f + + assert Something().method().__annotations__ == {'x': int} + + def multiple_levels(): + def inner_has_pos_only(): + def f(x: int, /): ... + return f + return inner_has_pos_only() + + assert multiple_levels().__annotations__ == {'x': int} + def test_same_keyword_as_positional_with_kwargs(self): def f(something,/,**kwargs): return (something, kwargs) @@ -417,9 +429,6 @@ def method(self, /): self.assertEqual(C().method(), sentinel) - def test_annotations(self): - assert global_inner_has_pos_only().__annotations__ == {'x': int} - def test_annotations_constant_fold(self): def g(): def f(x: not (int is int), /): ... From webhook-mailer at python.org Sun Jan 5 17:08:37 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 05 Jan 2020 22:08:37 -0000 Subject: [Python-checkins] Replace links in howto/pyporting.rst with sphinx references (GH-17781) Message-ID: https://github.com/python/cpython/commit/e6ae90dede07e8599cc6906417ca4aa99d8aa6e4 commit: e6ae90dede07e8599cc6906417ca4aa99d8aa6e4 branch: master author: Oleg H?fling committer: Cheryl Sabella date: 2020-01-05T17:08:14-05:00 summary: Replace links in howto/pyporting.rst with sphinx references (GH-17781) Signed-off-by: Oleg H?fling files: M Doc/howto/pyporting.rst diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index f7d12a1565c17..1543823c104c2 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -125,7 +125,7 @@ Once you have your code well-tested you are ready to begin porting your code to Python 3! But to fully understand how your code is going to change and what you want to look out for while you code, you will want to learn what changes Python 3 makes in terms of Python 2. Typically the two best ways of doing that -is reading the `"What's New"`_ doc for each release of Python 3 and the +is reading the :ref:`"What's New" ` doc for each release of Python 3 and the `Porting to Python 3`_ book (which is free online). There is also a handy `cheat sheet`_ from the Python-Future project. @@ -308,10 +308,10 @@ If for some reason that doesn't work then you should make the version check be against Python 2 and not Python 3. To help explain this, let's look at an example. -Let's pretend that you need access to a feature of importlib_ that +Let's pretend that you need access to a feature of :mod:`importlib` that is available in Python's standard library since Python 3.3 and available for Python 2 through importlib2_ on PyPI. You might be tempted to write code to -access e.g. the ``importlib.abc`` module by doing the following:: +access e.g. the :mod:`importlib.abc` module by doing the following:: import sys @@ -432,12 +432,10 @@ can also explicitly state whether your APIs use textual or binary data, helping to make sure everything functions as expected in both versions of Python. -.. _2to3: https://docs.python.org/3/library/2to3.html .. _caniusepython3: https://pypi.org/project/caniusepython3 .. _cheat sheet: http://python-future.org/compatible_idioms.html .. _coverage.py: https://pypi.org/project/coverage .. _Futurize: http://python-future.org/automatic_conversion.html -.. _importlib: https://docs.python.org/3/library/importlib.html#module-importlib .. _importlib2: https://pypi.org/project/importlib2 .. _Modernize: https://python-modernize.readthedocs.io/ .. _mypy: http://mypy-lang.org/ @@ -453,6 +451,4 @@ to make sure everything functions as expected in both versions of Python. .. _tox: https://pypi.org/project/tox .. _trove classifier: https://pypi.org/classifiers -.. _"What's New": https://docs.python.org/3/whatsnew/index.html - .. _Why Python 3 exists: https://snarky.ca/why-python-3-exists From webhook-mailer at python.org Sun Jan 5 17:13:49 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 22:13:49 -0000 Subject: [Python-checkins] Replace links in howto/pyporting.rst with sphinx references (GH-17781) Message-ID: https://github.com/python/cpython/commit/cb4ed24a384b67ea07f0aae185c6e65049166ff8 commit: cb4ed24a384b67ea07f0aae185c6e65049166ff8 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T14:13:44-08:00 summary: Replace links in howto/pyporting.rst with sphinx references (GH-17781) Signed-off-by: Oleg H?fling (cherry picked from commit e6ae90dede07e8599cc6906417ca4aa99d8aa6e4) Co-authored-by: Oleg H?fling files: M Doc/howto/pyporting.rst diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index 3be6bb380d663..8608162bace35 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -119,7 +119,7 @@ Once you have your code well-tested you are ready to begin porting your code to Python 3! But to fully understand how your code is going to change and what you want to look out for while you code, you will want to learn what changes Python 3 makes in terms of Python 2. Typically the two best ways of doing that -is reading the `"What's New"`_ doc for each release of Python 3 and the +is reading the :ref:`"What's New" ` doc for each release of Python 3 and the `Porting to Python 3`_ book (which is free online). There is also a handy `cheat sheet`_ from the Python-Future project. @@ -302,10 +302,10 @@ If for some reason that doesn't work then you should make the version check be against Python 2 and not Python 3. To help explain this, let's look at an example. -Let's pretend that you need access to a feature of importlib_ that +Let's pretend that you need access to a feature of :mod:`importlib` that is available in Python's standard library since Python 3.3 and available for Python 2 through importlib2_ on PyPI. You might be tempted to write code to -access e.g. the ``importlib.abc`` module by doing the following:: +access e.g. the :mod:`importlib.abc` module by doing the following:: import sys @@ -426,12 +426,10 @@ can also explicitly state whether your APIs use textual or binary data, helping to make sure everything functions as expected in both versions of Python. -.. _2to3: https://docs.python.org/3/library/2to3.html .. _caniusepython3: https://pypi.org/project/caniusepython3 .. _cheat sheet: http://python-future.org/compatible_idioms.html .. _coverage.py: https://pypi.org/project/coverage .. _Futurize: http://python-future.org/automatic_conversion.html -.. _importlib: https://docs.python.org/3/library/importlib.html#module-importlib .. _importlib2: https://pypi.org/project/importlib2 .. _Modernize: https://python-modernize.readthedocs.io/ .. _mypy: http://mypy-lang.org/ @@ -447,6 +445,4 @@ to make sure everything functions as expected in both versions of Python. .. _tox: https://pypi.org/project/tox .. _trove classifier: https://pypi.org/classifiers -.. _"What's New": https://docs.python.org/3/whatsnew/index.html - .. _Why Python 3 exists: https://snarky.ca/why-python-3-exists From webhook-mailer at python.org Sun Jan 5 17:14:01 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 22:14:01 -0000 Subject: [Python-checkins] Replace links in howto/pyporting.rst with sphinx references (GH-17781) Message-ID: https://github.com/python/cpython/commit/183fbd1982a24465487b391debc0940b9bad20b3 commit: 183fbd1982a24465487b391debc0940b9bad20b3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T14:13:57-08:00 summary: Replace links in howto/pyporting.rst with sphinx references (GH-17781) Signed-off-by: Oleg H?fling (cherry picked from commit e6ae90dede07e8599cc6906417ca4aa99d8aa6e4) Co-authored-by: Oleg H?fling files: M Doc/howto/pyporting.rst diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index 3be6bb380d663..8608162bace35 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -119,7 +119,7 @@ Once you have your code well-tested you are ready to begin porting your code to Python 3! But to fully understand how your code is going to change and what you want to look out for while you code, you will want to learn what changes Python 3 makes in terms of Python 2. Typically the two best ways of doing that -is reading the `"What's New"`_ doc for each release of Python 3 and the +is reading the :ref:`"What's New" ` doc for each release of Python 3 and the `Porting to Python 3`_ book (which is free online). There is also a handy `cheat sheet`_ from the Python-Future project. @@ -302,10 +302,10 @@ If for some reason that doesn't work then you should make the version check be against Python 2 and not Python 3. To help explain this, let's look at an example. -Let's pretend that you need access to a feature of importlib_ that +Let's pretend that you need access to a feature of :mod:`importlib` that is available in Python's standard library since Python 3.3 and available for Python 2 through importlib2_ on PyPI. You might be tempted to write code to -access e.g. the ``importlib.abc`` module by doing the following:: +access e.g. the :mod:`importlib.abc` module by doing the following:: import sys @@ -426,12 +426,10 @@ can also explicitly state whether your APIs use textual or binary data, helping to make sure everything functions as expected in both versions of Python. -.. _2to3: https://docs.python.org/3/library/2to3.html .. _caniusepython3: https://pypi.org/project/caniusepython3 .. _cheat sheet: http://python-future.org/compatible_idioms.html .. _coverage.py: https://pypi.org/project/coverage .. _Futurize: http://python-future.org/automatic_conversion.html -.. _importlib: https://docs.python.org/3/library/importlib.html#module-importlib .. _importlib2: https://pypi.org/project/importlib2 .. _Modernize: https://python-modernize.readthedocs.io/ .. _mypy: http://mypy-lang.org/ @@ -447,6 +445,4 @@ to make sure everything functions as expected in both versions of Python. .. _tox: https://pypi.org/project/tox .. _trove classifier: https://pypi.org/classifiers -.. _"What's New": https://docs.python.org/3/whatsnew/index.html - .. _Why Python 3 exists: https://snarky.ca/why-python-3-exists From webhook-mailer at python.org Sun Jan 5 17:20:34 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 05 Jan 2020 22:20:34 -0000 Subject: [Python-checkins] Fix the parameter list of object. _rpow_ (#GH-16477) Message-ID: https://github.com/python/cpython/commit/abc0c4fa9970931849b3da598c5980a5b170661e commit: abc0c4fa9970931849b3da598c5980a5b170661e branch: master author: HongWeipeng <961365124 at qq.com> committer: Cheryl Sabella date: 2020-01-05T17:20:29-05:00 summary: Fix the parameter list of object. _rpow_ (#GH-16477) files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c242041c73d41..1442fbeb33d76 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2331,7 +2331,7 @@ left undefined. object.__rfloordiv__(self, other) object.__rmod__(self, other) object.__rdivmod__(self, other) - object.__rpow__(self, other) + object.__rpow__(self, other[, modulo]) object.__rlshift__(self, other) object.__rrshift__(self, other) object.__rand__(self, other) From webhook-mailer at python.org Sun Jan 5 17:37:45 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 22:37:45 -0000 Subject: [Python-checkins] Fix the parameter list of object. _rpow_ (GH-GH-16477) Message-ID: https://github.com/python/cpython/commit/b853a7c6c0cf19c081efcc07336d9e9b8d2a7fae commit: b853a7c6c0cf19c081efcc07336d9e9b8d2a7fae branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T14:37:37-08:00 summary: Fix the parameter list of object. _rpow_ (GH-GH-16477) (cherry picked from commit abc0c4fa9970931849b3da598c5980a5b170661e) Co-authored-by: HongWeipeng <961365124 at qq.com> files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c38dcdc4e512d..7d6cc34373b6c 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2318,7 +2318,7 @@ left undefined. object.__rfloordiv__(self, other) object.__rmod__(self, other) object.__rdivmod__(self, other) - object.__rpow__(self, other) + object.__rpow__(self, other[, modulo]) object.__rlshift__(self, other) object.__rrshift__(self, other) object.__rand__(self, other) From webhook-mailer at python.org Sun Jan 5 17:37:51 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 22:37:51 -0000 Subject: [Python-checkins] Fix the parameter list of object. _rpow_ (GH-GH-16477) Message-ID: https://github.com/python/cpython/commit/cfeacf228924bed5e79d420eac682708b7fad727 commit: cfeacf228924bed5e79d420eac682708b7fad727 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T14:37:44-08:00 summary: Fix the parameter list of object. _rpow_ (GH-GH-16477) (cherry picked from commit abc0c4fa9970931849b3da598c5980a5b170661e) Co-authored-by: HongWeipeng <961365124 at qq.com> files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c530e4117af97..e801ee392f195 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2331,7 +2331,7 @@ left undefined. object.__rfloordiv__(self, other) object.__rmod__(self, other) object.__rdivmod__(self, other) - object.__rpow__(self, other) + object.__rpow__(self, other[, modulo]) object.__rlshift__(self, other) object.__rrshift__(self, other) object.__rand__(self, other) From webhook-mailer at python.org Sun Jan 5 17:39:47 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 22:39:47 -0000 Subject: [Python-checkins] bpo-39130: Dict reversed was added in v3.8 so should say in the doc as well (GH-17694) Message-ID: https://github.com/python/cpython/commit/94d9cfc4ed9dd3c4a3a359bc194b4dc3f6ba63eb commit: 94d9cfc4ed9dd3c4a3a359bc194b4dc3f6ba63eb branch: master author: Khalid Mammadov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-05T14:39:38-08:00 summary: bpo-39130: Dict reversed was added in v3.8 so should say in the doc as well (GH-17694) To be consistent with document layout, it should say when the feature was added. Although it's mentioned few other places in the doc but it's not explicitly say that at that place. https://bugs.python.org/issue39130 files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index c4588f89c0662..3e25faaa42714 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4351,6 +4351,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: Return a reverse iterator over the keys of the dictionary. This is a shortcut for ``reversed(d.keys())``. + .. versionadded:: 3.8 + .. method:: setdefault(key[, default]) If *key* is in the dictionary, return its value. If not, insert *key* From webhook-mailer at python.org Sun Jan 5 17:45:39 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 05 Jan 2020 22:45:39 -0000 Subject: [Python-checkins] bpo-39130: Dict reversed was added in v3.8 so should say in the doc as well (GH-17694) Message-ID: https://github.com/python/cpython/commit/89947881ac36324148fab75190af453dc09fd862 commit: 89947881ac36324148fab75190af453dc09fd862 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T14:45:35-08:00 summary: bpo-39130: Dict reversed was added in v3.8 so should say in the doc as well (GH-17694) To be consistent with document layout, it should say when the feature was added. Although it's mentioned few other places in the doc but it's not explicitly say that at that place. https://bugs.python.org/issue39130 (cherry picked from commit 94d9cfc4ed9dd3c4a3a359bc194b4dc3f6ba63eb) Co-authored-by: Khalid Mammadov files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index be72695462c7b..d6db9b5411d8a 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4326,6 +4326,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: Return a reverse iterator over the keys of the dictionary. This is a shortcut for ``reversed(d.keys())``. + .. versionadded:: 3.8 + .. method:: setdefault(key[, default]) If *key* is in the dictionary, return its value. If not, insert *key* From webhook-mailer at python.org Sun Jan 5 18:51:55 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 05 Jan 2020 23:51:55 -0000 Subject: [Python-checkins] Minor formatting improvements and fixes to idle.rst (GH-17165) Message-ID: https://github.com/python/cpython/commit/d6c08db8538d046d783db44fe4e70a60af0fb02e commit: d6c08db8538d046d783db44fe4e70a60af0fb02e branch: master author: Tal Einat committer: Terry Jan Reedy date: 2020-01-05T18:51:48-05:00 summary: Minor formatting improvements and fixes to idle.rst (GH-17165) files: M Doc/library/idle.rst M Lib/idlelib/help.html diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 273b5830e4293..f15f46b788b36 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -370,7 +370,8 @@ Paste Editor windows also have breakpoint functions. Lines with a breakpoint set are specially marked. Breakpoints only have an effect when running under the -debugger. Breakpoints for a file are saved in the user's .idlerc directory. +debugger. Breakpoints for a file are saved in the user's ``.idlerc`` +directory. Set Breakpoint Set a breakpoint on the current line. @@ -685,14 +686,14 @@ crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing the error box or Restart Shell on the Shell menu may fix a temporary problem. When IDLE first starts, it attempts to read user configuration files in -~/.idlerc/ (~ is one's home directory). If there is a problem, an error +``~/.idlerc/`` (~ is one's home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files. If IDLE quits with no message, and it was not started from a console, try -starting from a console (``python -m idlelib)`` and see if a message appears. +starting from a console (``python -m idlelib``) and see if a message appears. Running user code ^^^^^^^^^^^^^^^^^ @@ -863,13 +864,13 @@ Or click the TOC (Table of Contents) button and select a section header in the opened box. Help menu entry "Python Docs" opens the extensive sources of help, -including tutorials, available at docs.python.org/x.y, where 'x.y' +including tutorials, available at ``docs.python.org/x.y``, where 'x.y' is the currently running Python version. If your system has an off-line copy of the docs (this may be an installation option), that will be opened instead. Selected URLs can be added or removed from the help menu at any time using the -General tab of the Configure IDLE dialog . +General tab of the Configure IDLE dialog. .. _preferences: @@ -878,9 +879,9 @@ Setting preferences The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user's +Non-default user settings are saved in a ``.idlerc`` directory in the user's home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc. +by editing or deleting one or more of the files in ``.idlerc``. On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 09dc4c57bcdc0..0b2bdd2e174cc 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -382,7 +382,8 @@

Help menu (Shell and Editor).idlerc +directory.

Set Breakpoint

Set a breakpoint on the current line.

@@ -638,13 +639,13 @@

Startup failure~/.idlerc/ (~ is one?s home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files.

If IDLE quits with no message, and it was not started from a console, try -starting from a console (python -m idlelib) and see if a message appears.

+starting from a console (python -m idlelib) and see if a message appears.

Setting preferences?

The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user?s +Non-default user settings are saved in a .idlerc directory in the user?s home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc.

+by editing or deleting one or more of the files in .idlerc.

On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add other characters of personal interest. Use the sample to select From webhook-mailer at python.org Sun Jan 5 19:10:00 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 00:10:00 -0000 Subject: [Python-checkins] Minor formatting improvements and fixes to idle.rst (GH-17165) Message-ID: https://github.com/python/cpython/commit/5a065ac1811f07fcea955be402b1a264fbcc43d5 commit: 5a065ac1811f07fcea955be402b1a264fbcc43d5 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-05T16:09:56-08:00 summary: Minor formatting improvements and fixes to idle.rst (GH-17165) (cherry picked from commit d6c08db8538d046d783db44fe4e70a60af0fb02e) Co-authored-by: Tal Einat files: M Doc/library/idle.rst M Lib/idlelib/help.html diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 273b5830e4293..f15f46b788b36 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -370,7 +370,8 @@ Paste Editor windows also have breakpoint functions. Lines with a breakpoint set are specially marked. Breakpoints only have an effect when running under the -debugger. Breakpoints for a file are saved in the user's .idlerc directory. +debugger. Breakpoints for a file are saved in the user's ``.idlerc`` +directory. Set Breakpoint Set a breakpoint on the current line. @@ -685,14 +686,14 @@ crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing the error box or Restart Shell on the Shell menu may fix a temporary problem. When IDLE first starts, it attempts to read user configuration files in -~/.idlerc/ (~ is one's home directory). If there is a problem, an error +``~/.idlerc/`` (~ is one's home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files. If IDLE quits with no message, and it was not started from a console, try -starting from a console (``python -m idlelib)`` and see if a message appears. +starting from a console (``python -m idlelib``) and see if a message appears. Running user code ^^^^^^^^^^^^^^^^^ @@ -863,13 +864,13 @@ Or click the TOC (Table of Contents) button and select a section header in the opened box. Help menu entry "Python Docs" opens the extensive sources of help, -including tutorials, available at docs.python.org/x.y, where 'x.y' +including tutorials, available at ``docs.python.org/x.y``, where 'x.y' is the currently running Python version. If your system has an off-line copy of the docs (this may be an installation option), that will be opened instead. Selected URLs can be added or removed from the help menu at any time using the -General tab of the Configure IDLE dialog . +General tab of the Configure IDLE dialog. .. _preferences: @@ -878,9 +879,9 @@ Setting preferences The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user's +Non-default user settings are saved in a ``.idlerc`` directory in the user's home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc. +by editing or deleting one or more of the files in ``.idlerc``. On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 09dc4c57bcdc0..0b2bdd2e174cc 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -382,7 +382,8 @@

Help menu (Shell and Editor).idlerc +directory.

Set Breakpoint

Set a breakpoint on the current line.

@@ -638,13 +639,13 @@

Startup failure~/.idlerc/ (~ is one?s home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files.

If IDLE quits with no message, and it was not started from a console, try -starting from a console (python -m idlelib) and see if a message appears.

+starting from a console (python -m idlelib) and see if a message appears.

Setting preferences?

The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user?s +Non-default user settings are saved in a .idlerc directory in the user?s home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc.

+by editing or deleting one or more of the files in .idlerc.

On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add other characters of personal interest. Use the sample to select From webhook-mailer at python.org Sun Jan 5 22:32:27 2020 From: webhook-mailer at python.org (Jason R. Coombs) Date: Mon, 06 Jan 2020 03:32:27 -0000 Subject: [Python-checkins] bpo-38907: In http.server script, restore binding to IPv4 on Windows. (GH-17851) Message-ID: https://github.com/python/cpython/commit/ee94bdb0598f9bc47d6a49e58fffc97aa617be96 commit: ee94bdb0598f9bc47d6a49e58fffc97aa617be96 branch: master author: Jason R. Coombs committer: GitHub date: 2020-01-05T22:32:19-05:00 summary: bpo-38907: In http.server script, restore binding to IPv4 on Windows. (GH-17851) files: A Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst M Lib/http/server.py diff --git a/Lib/http/server.py b/Lib/http/server.py index 47a4fcf9a6518..b9a2717681f53 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1282,4 +1282,16 @@ def test(HandlerClass=BaseHTTPRequestHandler, else: handler_class = partial(SimpleHTTPRequestHandler, directory=args.directory) - test(HandlerClass=handler_class, port=args.port, bind=args.bind) + + # ensure dual-stack is not disabled; ref #38907 + class DualStackServer(ThreadingHTTPServer): + def server_bind(self): + self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + return super().server_bind() + + test( + HandlerClass=handler_class, + ServerClass=DualStackServer, + port=args.port, + bind=args.bind, + ) diff --git a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst new file mode 100644 index 0000000000000..a6e79f7809521 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst @@ -0,0 +1 @@ +In http.server script, restore binding to IPv4 on Windows. \ No newline at end of file From webhook-mailer at python.org Mon Jan 6 03:24:33 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 08:24:33 -0000 Subject: [Python-checkins] Minor formatting improvements and fixes to idle.rst (GH-17165) Message-ID: https://github.com/python/cpython/commit/54bcd656a2d2b7559423d75443a086730b46da42 commit: 54bcd656a2d2b7559423d75443a086730b46da42 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T00:24:25-08:00 summary: Minor formatting improvements and fixes to idle.rst (GH-17165) (cherry picked from commit d6c08db8538d046d783db44fe4e70a60af0fb02e) Co-authored-by: Tal Einat files: M Doc/library/idle.rst M Lib/idlelib/help.html diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 273b5830e4293..f15f46b788b36 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -370,7 +370,8 @@ Paste Editor windows also have breakpoint functions. Lines with a breakpoint set are specially marked. Breakpoints only have an effect when running under the -debugger. Breakpoints for a file are saved in the user's .idlerc directory. +debugger. Breakpoints for a file are saved in the user's ``.idlerc`` +directory. Set Breakpoint Set a breakpoint on the current line. @@ -685,14 +686,14 @@ crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing the error box or Restart Shell on the Shell menu may fix a temporary problem. When IDLE first starts, it attempts to read user configuration files in -~/.idlerc/ (~ is one's home directory). If there is a problem, an error +``~/.idlerc/`` (~ is one's home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files. If IDLE quits with no message, and it was not started from a console, try -starting from a console (``python -m idlelib)`` and see if a message appears. +starting from a console (``python -m idlelib``) and see if a message appears. Running user code ^^^^^^^^^^^^^^^^^ @@ -863,13 +864,13 @@ Or click the TOC (Table of Contents) button and select a section header in the opened box. Help menu entry "Python Docs" opens the extensive sources of help, -including tutorials, available at docs.python.org/x.y, where 'x.y' +including tutorials, available at ``docs.python.org/x.y``, where 'x.y' is the currently running Python version. If your system has an off-line copy of the docs (this may be an installation option), that will be opened instead. Selected URLs can be added or removed from the help menu at any time using the -General tab of the Configure IDLE dialog . +General tab of the Configure IDLE dialog. .. _preferences: @@ -878,9 +879,9 @@ Setting preferences The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user's +Non-default user settings are saved in a ``.idlerc`` directory in the user's home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc. +by editing or deleting one or more of the files in ``.idlerc``. On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 09dc4c57bcdc0..0b2bdd2e174cc 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -382,7 +382,8 @@

Help menu (Shell and Editor).idlerc +directory.

Set Breakpoint

Set a breakpoint on the current line.

@@ -638,13 +639,13 @@

Startup failure~/.idlerc/ (~ is one?s home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files.

If IDLE quits with no message, and it was not started from a console, try -starting from a console (python -m idlelib) and see if a message appears.

+starting from a console (python -m idlelib) and see if a message appears.

Setting preferences?

The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user?s +Non-default user settings are saved in a .idlerc directory in the user?s home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc.

+by editing or deleting one or more of the files in .idlerc.

On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add other characters of personal interest. Use the sample to select From webhook-mailer at python.org Mon Jan 6 05:46:08 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 06 Jan 2020 10:46:08 -0000 Subject: [Python-checkins] argument-clinic: Simplify multi-line string handling (GH-17852) Message-ID: https://github.com/python/cpython/commit/5136e721d7d9eae62ffad17328566b2315e42c00 commit: 5136e721d7d9eae62ffad17328566b2315e42c00 branch: master author: Dong-hee Na committer: Pablo Galindo date: 2020-01-06T10:46:03Z summary: argument-clinic: Simplify multi-line string handling (GH-17852) files: M Tools/clinic/clinic.py diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 403d8a4765690..b503932e2624b 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1182,14 +1182,14 @@ def render_option_group_parsing(self, f, template_dict): lines = [self.group_to_variable_name(g) + " = 1;" for g in group_ids] lines = "\n".join(lines) - s = """ + s = """\ case {count}: if (!PyArg_ParseTuple(args, "{format_units}:{name}", {parse_arguments})) {{ goto exit; }} {group_booleans} break; -"""[1:] +""" s = linear_format(s, group_booleans=lines) s = s.format_map(d) add(s) From webhook-mailer at python.org Mon Jan 6 07:34:14 2020 From: webhook-mailer at python.org (Jason R. Coombs) Date: Mon, 06 Jan 2020 12:34:14 -0000 Subject: [Python-checkins] bpo-38907: In http.server script, restore binding to IPv4 on Windows. (GH-17851) (#17854) Message-ID: https://github.com/python/cpython/commit/5ed9d60bc53e2eb0a88f07d5afe5299acdc0b216 commit: 5ed9d60bc53e2eb0a88f07d5afe5299acdc0b216 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Jason R. Coombs date: 2020-01-06T07:34:10-05:00 summary: bpo-38907: In http.server script, restore binding to IPv4 on Windows. (GH-17851) (#17854) (cherry picked from commit ee94bdb0598f9bc47d6a49e58fffc97aa617be96) Co-authored-by: Jason R. Coombs Co-authored-by: Jason R. Coombs files: A Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst M Lib/http/server.py diff --git a/Lib/http/server.py b/Lib/http/server.py index b247675ec45e8..0fe44bdaa73fe 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1280,4 +1280,16 @@ def test(HandlerClass=BaseHTTPRequestHandler, else: handler_class = partial(SimpleHTTPRequestHandler, directory=args.directory) - test(HandlerClass=handler_class, port=args.port, bind=args.bind) + + # ensure dual-stack is not disabled; ref #38907 + class DualStackServer(ThreadingHTTPServer): + def server_bind(self): + self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + return super().server_bind() + + test( + HandlerClass=handler_class, + ServerClass=DualStackServer, + port=args.port, + bind=args.bind, + ) diff --git a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst new file mode 100644 index 0000000000000..a6e79f7809521 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst @@ -0,0 +1 @@ +In http.server script, restore binding to IPv4 on Windows. \ No newline at end of file From webhook-mailer at python.org Mon Jan 6 07:59:44 2020 From: webhook-mailer at python.org (Jason R. Coombs) Date: Mon, 06 Jan 2020 12:59:44 -0000 Subject: [Python-checkins] bpo-38907: Suppress any exception when attempting to set V6ONLY. (GH-17864) Message-ID: https://github.com/python/cpython/commit/7cdc31a14c824000cbe8b487900c9826a33f6940 commit: 7cdc31a14c824000cbe8b487900c9826a33f6940 branch: master author: Jason R. Coombs committer: GitHub date: 2020-01-06T07:59:36-05:00 summary: bpo-38907: Suppress any exception when attempting to set V6ONLY. (GH-17864) Fixes error attempting to bind to IPv4 address. files: M Lib/http/server.py diff --git a/Lib/http/server.py b/Lib/http/server.py index b9a2717681f53..c6e5ed6ea0e00 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -103,6 +103,7 @@ import sys import time import urllib.parse +import contextlib from functools import partial from http import HTTPStatus @@ -1286,7 +1287,10 @@ def test(HandlerClass=BaseHTTPRequestHandler, # ensure dual-stack is not disabled; ref #38907 class DualStackServer(ThreadingHTTPServer): def server_bind(self): - self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + # suppress exception when protocol is IPv4 + with contextlib.suppress(Exception): + self.socket.setsockopt( + socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) return super().server_bind() test( From webhook-mailer at python.org Mon Jan 6 08:28:31 2020 From: webhook-mailer at python.org (Jason R. Coombs) Date: Mon, 06 Jan 2020 13:28:31 -0000 Subject: [Python-checkins] bpo-38907: Suppress any exception when attempting to set V6ONLY. (GH-17864) (GH-17865) Message-ID: https://github.com/python/cpython/commit/33cb4a62bf6848093b7a05c9794582d204798b1b commit: 33cb4a62bf6848093b7a05c9794582d204798b1b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Jason R. Coombs date: 2020-01-06T08:28:27-05:00 summary: bpo-38907: Suppress any exception when attempting to set V6ONLY. (GH-17864) (GH-17865) Fixes error attempting to bind to IPv4 address. (cherry picked from commit 7cdc31a14c824000cbe8b487900c9826a33f6940) Co-authored-by: Jason R. Coombs Co-authored-by: Jason R. Coombs files: M Lib/http/server.py diff --git a/Lib/http/server.py b/Lib/http/server.py index 0fe44bdaa73fe..38f7accad7a34 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -103,6 +103,7 @@ import sys import time import urllib.parse +import contextlib from functools import partial from http import HTTPStatus @@ -1284,7 +1285,10 @@ def test(HandlerClass=BaseHTTPRequestHandler, # ensure dual-stack is not disabled; ref #38907 class DualStackServer(ThreadingHTTPServer): def server_bind(self): - self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + # suppress exception when protocol is IPv4 + with contextlib.suppress(Exception): + self.socket.setsockopt( + socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) return super().server_bind() test( From webhook-mailer at python.org Mon Jan 6 10:18:23 2020 From: webhook-mailer at python.org (Xtreak) Date: Mon, 06 Jan 2020 15:18:23 -0000 Subject: [Python-checkins] Fix link to bpo issue in Changelog (GH-17692) Message-ID: https://github.com/python/cpython/commit/075ebad369d94342624792a41d3055c907bfa436 commit: 075ebad369d94342624792a41d3055c907bfa436 branch: master author: Chandan Singh committer: Xtreak date: 2020-01-06T20:48:16+05:30 summary: Fix link to bpo issue in Changelog (GH-17692) files: M Misc/NEWS.d/3.9.0a2.rst diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index 60d0ea5a99b16..50478c08e9018 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -453,7 +453,7 @@ determined index was bogus. Patch by Claudiu Popa .. -.. bpo: 38668 +.. bpo: 38688 .. date: 2019-11-22-10-45-03 .. nonce: iKx23z .. section: Library From webhook-mailer at python.org Mon Jan 6 10:59:14 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 06 Jan 2020 15:59:14 -0000 Subject: [Python-checkins] bpo-39209: Manage correctly multi-line tokens in interactive mode (GH-17860) Message-ID: https://github.com/python/cpython/commit/5ec91f78d59d9c39b984f284e00cd04b96ddb5db commit: 5ec91f78d59d9c39b984f284e00cd04b96ddb5db branch: master author: Pablo Galindo committer: GitHub date: 2020-01-06T15:59:09Z summary: bpo-39209: Manage correctly multi-line tokens in interactive mode (GH-17860) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst M Lib/test/test_repl.py M Parser/tokenizer.c diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index 9efd459a6f076..71f192f90d9a1 100644 --- a/Lib/test/test_repl.py +++ b/Lib/test/test_repl.py @@ -58,5 +58,41 @@ def test_no_memory(self): # Exit code 120: Py_FinalizeEx() failed to flush stdout and stderr. self.assertIn(p.returncode, (1, 120)) + @cpython_only + def test_multiline_string_parsing(self): + # bpo-39209: Multiline string tokens need to be handled in the tokenizer + # in two places: the interactive path and the non-interactive path. + user_input = '''\ + x = """ + + + + + 0KiB + 0 + 1.3 + 0 + + + 16738211KiB + 237.15 + 1.3 + 0 + + never + none + + + """ + ''' + user_input = dedent(user_input) + user_input = user_input.encode() + p = spawn_repl() + with SuppressCrashReport(): + p.stdin.write(user_input) + output = kill_python(p) + self.assertEqual(p.returncode, 0) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst new file mode 100644 index 0000000000000..c05b3f8dfa4d4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst @@ -0,0 +1,2 @@ +Correctly handle multi-line tokens in interactive mode. Patch by Pablo +Galindo. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index f84093dae5b62..f73c32684c7b7 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -886,6 +886,7 @@ tok_nextc(struct tok_state *tok) size_t start = tok->start - tok->buf; size_t oldlen = tok->cur - tok->buf; size_t newlen = oldlen + strlen(newtok); + Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; char *buf = tok->buf; buf = (char *)PyMem_REALLOC(buf, newlen+1); tok->lineno++; @@ -898,6 +899,7 @@ tok_nextc(struct tok_state *tok) } tok->buf = buf; tok->cur = tok->buf + oldlen; + tok->multi_line_start = tok->buf + cur_multi_line_start; tok->line_start = tok->cur; strcpy(tok->buf + oldlen, newtok); PyMem_FREE(newtok); From webhook-mailer at python.org Mon Jan 6 11:26:18 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 16:26:18 -0000 Subject: [Python-checkins] bpo-39209: Manage correctly multi-line tokens in interactive mode (GH-17860) Message-ID: https://github.com/python/cpython/commit/b2e281aaa2e4a1f24671d293dfd06b23bb052e47 commit: b2e281aaa2e4a1f24671d293dfd06b23bb052e47 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T08:26:13-08:00 summary: bpo-39209: Manage correctly multi-line tokens in interactive mode (GH-17860) (cherry picked from commit 5ec91f78d59d9c39b984f284e00cd04b96ddb5db) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst M Lib/test/test_repl.py M Parser/tokenizer.c diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index 9efd459a6f076..71f192f90d9a1 100644 --- a/Lib/test/test_repl.py +++ b/Lib/test/test_repl.py @@ -58,5 +58,41 @@ def test_no_memory(self): # Exit code 120: Py_FinalizeEx() failed to flush stdout and stderr. self.assertIn(p.returncode, (1, 120)) + @cpython_only + def test_multiline_string_parsing(self): + # bpo-39209: Multiline string tokens need to be handled in the tokenizer + # in two places: the interactive path and the non-interactive path. + user_input = '''\ + x = """ + + + + + 0KiB + 0 + 1.3 + 0 + + + 16738211KiB + 237.15 + 1.3 + 0 + + never + none + + + """ + ''' + user_input = dedent(user_input) + user_input = user_input.encode() + p = spawn_repl() + with SuppressCrashReport(): + p.stdin.write(user_input) + output = kill_python(p) + self.assertEqual(p.returncode, 0) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst new file mode 100644 index 0000000000000..c05b3f8dfa4d4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst @@ -0,0 +1,2 @@ +Correctly handle multi-line tokens in interactive mode. Patch by Pablo +Galindo. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index f84093dae5b62..f73c32684c7b7 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -886,6 +886,7 @@ tok_nextc(struct tok_state *tok) size_t start = tok->start - tok->buf; size_t oldlen = tok->cur - tok->buf; size_t newlen = oldlen + strlen(newtok); + Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; char *buf = tok->buf; buf = (char *)PyMem_REALLOC(buf, newlen+1); tok->lineno++; @@ -898,6 +899,7 @@ tok_nextc(struct tok_state *tok) } tok->buf = buf; tok->cur = tok->buf + oldlen; + tok->multi_line_start = tok->buf + cur_multi_line_start; tok->line_start = tok->cur; strcpy(tok->buf + oldlen, newtok); PyMem_FREE(newtok); From webhook-mailer at python.org Mon Jan 6 11:47:02 2020 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 06 Jan 2020 16:47:02 -0000 Subject: [Python-checkins] bpo-39041: Add GitHub Actions support (GH-17594) Message-ID: https://github.com/python/cpython/commit/0048833e1308d39dc9c6489da7872ade0f14486f commit: 0048833e1308d39dc9c6489da7872ade0f14486f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Steve Dower date: 2020-01-06T08:46:55-08:00 summary: bpo-39041: Add GitHub Actions support (GH-17594) (cherry picked from commit a76ba362c4d86adf5e7f8254398135d12d7afd25) Co-authored-by: Steve Dower files: A .github/workflows/build.yml A .github/workflows/coverage.yml A .github/workflows/doc.yml A .github/workflows/posix-deps-apt.sh M Doc/make.bat diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000000..16d6f0db8c908 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,85 @@ +name: Tests + +on: + #push: + # branches: + # - master + # - 3.8 + # - 3.7 + # paths-ignore: + # - 'Doc/**' + # - 'Misc/**' + pull_request: + branches: + - master + - 3.8 + - 3.7 + paths-ignore: + - 'Doc/**' + - 'Misc/**' + +jobs: + build_win32: + name: 'Windows (x86)' + runs-on: windows-latest + steps: + - uses: actions/checkout at v1 + - name: Build CPython + run: .\PCbuild\build.bat -e -p Win32 + - name: Display build info + run: .\python.bat -m test.pythoninfo + - name: Tests + run: .\PCbuild\rt.bat -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + + build_win_amd64: + name: 'Windows (x64)' + runs-on: windows-latest + steps: + - uses: actions/checkout at v1 + - name: Build CPython + run: .\PCbuild\build.bat -e -p x64 + - name: Display build info + run: .\python.bat -m test.pythoninfo + - name: Tests + run: .\PCbuild\rt.bat -x64 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + + build_macos: + name: 'macOS' + runs-on: macos-latest + steps: + - uses: actions/checkout at v1 + - name: Configure CPython + run: ./configure --with-pydebug --with-openssl=/usr/local/opt/openssl --prefix=/opt/python-dev + - name: Build CPython + run: make -s -j4 + - name: Display build info + run: make pythoninfo + - name: Tests + run: make buildbottest TESTOPTS="-j4 -uall,-cpu" + + build_ubuntu: + name: 'Ubuntu' + runs-on: ubuntu-latest + env: + OPENSSL_VER: 1.1.1d + steps: + - uses: actions/checkout at v1 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: 'Restore OpenSSL build' + id: cache-openssl + uses: actions/cache at v1 + with: + path: ./multissl/openssl/${{ env.OPENSSL_VER }} + key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + - name: Install OpenSSL + if: steps.cache-openssl.outputs.cache-hit != 'true' + run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $PWD/multissl --openssl $OPENSSL_VER --system Linux + - name: Configure CPython + run: ./configure --with-pydebug --with-openssl=$PWD/multissl/openssl/$OPENSSL_VER + - name: Build CPython + run: make -s -j4 + - name: Display build info + run: make pythoninfo + - name: Tests + run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu" diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000000000..cb05e8e2f71f0 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,89 @@ +name: Coverage + +on: + push: + branches: + - master + - 3.8 + - 3.7 + paths-ignore: + - 'Doc/**' + - 'Misc/**' + #pull_request: + # branches: + # - master + # - 3.8 + # - 3.7 + # paths-ignore: + # - 'Doc/**' + # - 'Misc/**' + +jobs: + coverage_ubuntu: + name: 'Ubuntu (Coverage)' + runs-on: ubuntu-latest + env: + OPENSSL_VER: 1.1.1d + steps: + - uses: actions/checkout at v1 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: 'Restore OpenSSL build' + id: cache-openssl + uses: actions/cache at v1 + with: + path: ./multissl/openssl/${{ env.OPENSSL_VER }} + key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + - name: Install OpenSSL + if: steps.cache-openssl.outputs.cache-hit != 'true' + run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $PWD/multissl --openssl $OPENSSL_VER --system Linux + - name: Configure CPython + run: ./configure --with-openssl=$PWD/multissl/openssl/$OPENSSL_VER + - name: Build CPython + run: make -s -j4 + - name: Display build info + run: make pythoninfo + - name: 'Coverage Preparation' + run: | + ./python -m venv .venv + source ./.venv/bin/activate + python -m pip install -U coverage + python -m test.pythoninfo + - name: 'Tests with coverage' + run: > + source ./.venv/bin/activate && + xvfb-run python -m coverage + run --branch --pylib + -m test + --fail-env-changed + -uall,-cpu + -x test_multiprocessing_fork + -x test_multiprocessing_forkserver + -x test_multiprocessing_spawn + -x test_concurrent_futures + || true + - name: 'Publish code coverage results' + run: | + ./.venv/bin/python -m coverage xml + bash <(curl -s https://codecov.io/bash) + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + c_coverage_ubuntu: + name: 'Ubuntu (C Coverage)' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout at v1 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: Configure CPython + run: ./configure + - name: 'Build CPython and measure coverage' + run: xvfb-run make -j4 coverage-report + - name: 'Publish code coverage results' + if: always() + run: | + make pythoninfo + bash <(curl -s https://codecov.io/bash) + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml new file mode 100644 index 0000000000000..405b12e3d29c9 --- /dev/null +++ b/.github/workflows/doc.yml @@ -0,0 +1,40 @@ +name: Docs + +on: + #push: + # branches: + # - master + # - 3.8 + # - 3.7 + # paths: + # - 'Doc/**' + pull_request: + branches: + - master + - 3.8 + - 3.7 + paths: + - 'Doc/**' + - 'Misc/**' + +jobs: + build_doc: + name: 'Docs' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout at v1 + - uses: actions/setup-python at v1 + with: + python-version: '3.7' + architecture: 'x64' + - name: 'Install build dependencies' + run: python -m pip install sphinx==2.2.0 blurb python-docs-theme + - name: 'Build documentation' + run: | + cd Doc + make check suspicious html PYTHON=python + - name: Upload + uses: actions/upload-artifact at v1 + with: + name: doc-html + path: Doc/build/html diff --git a/.github/workflows/posix-deps-apt.sh b/.github/workflows/posix-deps-apt.sh new file mode 100755 index 0000000000000..2b879d32f8150 --- /dev/null +++ b/.github/workflows/posix-deps-apt.sh @@ -0,0 +1,21 @@ +#!/bin/sh +apt-get update + +apt-get -yq install \ + build-essential \ + zlib1g-dev \ + libbz2-dev \ + liblzma-dev \ + libncurses5-dev \ + libreadline6-dev \ + libsqlite3-dev \ + libssl-dev \ + libgdbm-dev \ + tk-dev \ + lzma \ + lzma-dev \ + liblzma-dev \ + libffi-dev \ + uuid-dev \ + xvfb \ + lcov diff --git a/Doc/make.bat b/Doc/make.bat index dfc622f66615d..6f8f172e95eb8 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -54,9 +54,9 @@ if not exist "%HTMLHELP%" ( ) :skiphhcsearch -if "%DISTVERSION%" EQU "" for /f "usebackq" %%v in (`%PYTHON% tools/extensions/patchlevel.py`) do set DISTVERSION=%%v +if not defined DISTVERSION for /f "usebackq" %%v in (`%PYTHON% tools/extensions/patchlevel.py`) do set DISTVERSION=%%v -if "%BUILDDIR%" EQU "" set BUILDDIR=build +if not defined BUILDDIR set BUILDDIR=build rem Targets that don't require sphinx-build if "%1" EQU "" goto help @@ -131,7 +131,7 @@ if exist ..\Misc\NEWS ( ) ) -if NOT "%PAPER%" == "" ( +if defined PAPER ( set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% ) if "%1" EQU "htmlhelp" ( From webhook-mailer at python.org Mon Jan 6 11:47:14 2020 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 06 Jan 2020 16:47:14 -0000 Subject: [Python-checkins] bpo-39041: Add GitHub Actions support (GH-17594) Message-ID: https://github.com/python/cpython/commit/acf5e5f3f42a3d2985499df82331705edbe717be commit: acf5e5f3f42a3d2985499df82331705edbe717be branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Steve Dower date: 2020-01-06T08:47:06-08:00 summary: bpo-39041: Add GitHub Actions support (GH-17594) (cherry picked from commit a76ba362c4d86adf5e7f8254398135d12d7afd25) Co-authored-by: Steve Dower files: A .github/workflows/build.yml A .github/workflows/coverage.yml A .github/workflows/doc.yml A .github/workflows/posix-deps-apt.sh M Doc/make.bat diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000000..16d6f0db8c908 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,85 @@ +name: Tests + +on: + #push: + # branches: + # - master + # - 3.8 + # - 3.7 + # paths-ignore: + # - 'Doc/**' + # - 'Misc/**' + pull_request: + branches: + - master + - 3.8 + - 3.7 + paths-ignore: + - 'Doc/**' + - 'Misc/**' + +jobs: + build_win32: + name: 'Windows (x86)' + runs-on: windows-latest + steps: + - uses: actions/checkout at v1 + - name: Build CPython + run: .\PCbuild\build.bat -e -p Win32 + - name: Display build info + run: .\python.bat -m test.pythoninfo + - name: Tests + run: .\PCbuild\rt.bat -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + + build_win_amd64: + name: 'Windows (x64)' + runs-on: windows-latest + steps: + - uses: actions/checkout at v1 + - name: Build CPython + run: .\PCbuild\build.bat -e -p x64 + - name: Display build info + run: .\python.bat -m test.pythoninfo + - name: Tests + run: .\PCbuild\rt.bat -x64 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + + build_macos: + name: 'macOS' + runs-on: macos-latest + steps: + - uses: actions/checkout at v1 + - name: Configure CPython + run: ./configure --with-pydebug --with-openssl=/usr/local/opt/openssl --prefix=/opt/python-dev + - name: Build CPython + run: make -s -j4 + - name: Display build info + run: make pythoninfo + - name: Tests + run: make buildbottest TESTOPTS="-j4 -uall,-cpu" + + build_ubuntu: + name: 'Ubuntu' + runs-on: ubuntu-latest + env: + OPENSSL_VER: 1.1.1d + steps: + - uses: actions/checkout at v1 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: 'Restore OpenSSL build' + id: cache-openssl + uses: actions/cache at v1 + with: + path: ./multissl/openssl/${{ env.OPENSSL_VER }} + key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + - name: Install OpenSSL + if: steps.cache-openssl.outputs.cache-hit != 'true' + run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $PWD/multissl --openssl $OPENSSL_VER --system Linux + - name: Configure CPython + run: ./configure --with-pydebug --with-openssl=$PWD/multissl/openssl/$OPENSSL_VER + - name: Build CPython + run: make -s -j4 + - name: Display build info + run: make pythoninfo + - name: Tests + run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu" diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000000000..cb05e8e2f71f0 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,89 @@ +name: Coverage + +on: + push: + branches: + - master + - 3.8 + - 3.7 + paths-ignore: + - 'Doc/**' + - 'Misc/**' + #pull_request: + # branches: + # - master + # - 3.8 + # - 3.7 + # paths-ignore: + # - 'Doc/**' + # - 'Misc/**' + +jobs: + coverage_ubuntu: + name: 'Ubuntu (Coverage)' + runs-on: ubuntu-latest + env: + OPENSSL_VER: 1.1.1d + steps: + - uses: actions/checkout at v1 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: 'Restore OpenSSL build' + id: cache-openssl + uses: actions/cache at v1 + with: + path: ./multissl/openssl/${{ env.OPENSSL_VER }} + key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + - name: Install OpenSSL + if: steps.cache-openssl.outputs.cache-hit != 'true' + run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $PWD/multissl --openssl $OPENSSL_VER --system Linux + - name: Configure CPython + run: ./configure --with-openssl=$PWD/multissl/openssl/$OPENSSL_VER + - name: Build CPython + run: make -s -j4 + - name: Display build info + run: make pythoninfo + - name: 'Coverage Preparation' + run: | + ./python -m venv .venv + source ./.venv/bin/activate + python -m pip install -U coverage + python -m test.pythoninfo + - name: 'Tests with coverage' + run: > + source ./.venv/bin/activate && + xvfb-run python -m coverage + run --branch --pylib + -m test + --fail-env-changed + -uall,-cpu + -x test_multiprocessing_fork + -x test_multiprocessing_forkserver + -x test_multiprocessing_spawn + -x test_concurrent_futures + || true + - name: 'Publish code coverage results' + run: | + ./.venv/bin/python -m coverage xml + bash <(curl -s https://codecov.io/bash) + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + c_coverage_ubuntu: + name: 'Ubuntu (C Coverage)' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout at v1 + - name: Install Dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: Configure CPython + run: ./configure + - name: 'Build CPython and measure coverage' + run: xvfb-run make -j4 coverage-report + - name: 'Publish code coverage results' + if: always() + run: | + make pythoninfo + bash <(curl -s https://codecov.io/bash) + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml new file mode 100644 index 0000000000000..405b12e3d29c9 --- /dev/null +++ b/.github/workflows/doc.yml @@ -0,0 +1,40 @@ +name: Docs + +on: + #push: + # branches: + # - master + # - 3.8 + # - 3.7 + # paths: + # - 'Doc/**' + pull_request: + branches: + - master + - 3.8 + - 3.7 + paths: + - 'Doc/**' + - 'Misc/**' + +jobs: + build_doc: + name: 'Docs' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout at v1 + - uses: actions/setup-python at v1 + with: + python-version: '3.7' + architecture: 'x64' + - name: 'Install build dependencies' + run: python -m pip install sphinx==2.2.0 blurb python-docs-theme + - name: 'Build documentation' + run: | + cd Doc + make check suspicious html PYTHON=python + - name: Upload + uses: actions/upload-artifact at v1 + with: + name: doc-html + path: Doc/build/html diff --git a/.github/workflows/posix-deps-apt.sh b/.github/workflows/posix-deps-apt.sh new file mode 100755 index 0000000000000..2b879d32f8150 --- /dev/null +++ b/.github/workflows/posix-deps-apt.sh @@ -0,0 +1,21 @@ +#!/bin/sh +apt-get update + +apt-get -yq install \ + build-essential \ + zlib1g-dev \ + libbz2-dev \ + liblzma-dev \ + libncurses5-dev \ + libreadline6-dev \ + libsqlite3-dev \ + libssl-dev \ + libgdbm-dev \ + tk-dev \ + lzma \ + lzma-dev \ + liblzma-dev \ + libffi-dev \ + uuid-dev \ + xvfb \ + lcov diff --git a/Doc/make.bat b/Doc/make.bat index e6604956ea916..2f21e6d52ef91 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -54,9 +54,9 @@ if not exist "%HTMLHELP%" ( ) :skiphhcsearch -if "%DISTVERSION%" EQU "" for /f "usebackq" %%v in (`%PYTHON% tools/extensions/patchlevel.py`) do set DISTVERSION=%%v +if not defined DISTVERSION for /f "usebackq" %%v in (`%PYTHON% tools/extensions/patchlevel.py`) do set DISTVERSION=%%v -if "%BUILDDIR%" EQU "" set BUILDDIR=build +if not defined BUILDDIR set BUILDDIR=build rem Targets that don't require sphinx-build if "%1" EQU "" goto help @@ -131,7 +131,7 @@ if exist ..\Misc\NEWS ( ) ) -if NOT "%PAPER%" == "" ( +if defined PAPER ( set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% ) if "%1" EQU "htmlhelp" ( From webhook-mailer at python.org Mon Jan 6 11:57:38 2020 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 06 Jan 2020 16:57:38 -0000 Subject: [Python-checkins] bpo-29778: Fix incorrect NULL check in _PyPathConfig_InitDLLPath() (GH-17818) Message-ID: https://github.com/python/cpython/commit/7b79dc9200a19ecbac667111dffd58e314be02a8 commit: 7b79dc9200a19ecbac667111dffd58e314be02a8 branch: master author: Anthony Wee committer: Steve Dower date: 2020-01-06T08:57:34-08:00 summary: bpo-29778: Fix incorrect NULL check in _PyPathConfig_InitDLLPath() (GH-17818) files: M Python/pathconfig.c diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 363b7686bc451..6abc648769f71 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -150,7 +150,7 @@ _PyWideStringList_Join(const PyWideStringList *list, wchar_t sep) static PyStatus _PyPathConfig_InitDLLPath(void) { - if (_Py_dll_path == NULL) { + if (_Py_dll_path != NULL) { /* Already set: nothing to do */ return _PyStatus_OK(); } From webhook-mailer at python.org Mon Jan 6 12:17:44 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 17:17:44 -0000 Subject: [Python-checkins] bpo-29778: Fix incorrect NULL check in _PyPathConfig_InitDLLPath() (GH-17818) Message-ID: https://github.com/python/cpython/commit/a9a43c221bf3896ed1d1c2eee2531b7121cf78e4 commit: a9a43c221bf3896ed1d1c2eee2531b7121cf78e4 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T09:17:36-08:00 summary: bpo-29778: Fix incorrect NULL check in _PyPathConfig_InitDLLPath() (GH-17818) (cherry picked from commit 7b79dc9200a19ecbac667111dffd58e314be02a8) Co-authored-by: Anthony Wee files: M Python/pathconfig.c diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 7f3fdcc103f7b..258ff613a066c 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -150,7 +150,7 @@ _PyWideStringList_Join(const PyWideStringList *list, wchar_t sep) static PyStatus _PyPathConfig_InitDLLPath(void) { - if (_Py_dll_path == NULL) { + if (_Py_dll_path != NULL) { /* Already set: nothing to do */ return _PyStatus_OK(); } From webhook-mailer at python.org Mon Jan 6 14:53:41 2020 From: webhook-mailer at python.org (Ethan Furman) Date: Mon, 06 Jan 2020 19:53:41 -0000 Subject: [Python-checkins] bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) Message-ID: https://github.com/python/cpython/commit/2e9012a3e1e316c54e27f51ba5849ba06eab7da2 commit: 2e9012a3e1e316c54e27f51ba5849ba06eab7da2 branch: master author: YoSTEALTH <35307184+YoSTEALTH at users.noreply.github.com> committer: Ethan Furman date: 2020-01-06T11:53:36-08:00 summary: bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) * `enum.auto()` initial value is now specified as being `1`. files: M Doc/library/enum.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 1d6912aaf19ad..cfe3c207e1eee 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -55,7 +55,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. + Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` From webhook-mailer at python.org Mon Jan 6 16:23:18 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 21:23:18 -0000 Subject: [Python-checkins] bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) Message-ID: https://github.com/python/cpython/commit/b1ce22d086660d2505010694c8813cc67adf8f9e commit: b1ce22d086660d2505010694c8813cc67adf8f9e branch: master author: Steve Dower committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-06T13:23:10-08:00 summary: bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) https://bugs.python.org/issue39041 Automerge-Triggered-By: @zooba files: M .github/workflows/coverage.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index cb05e8e2f71f0..e8b47b390e5a7 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -64,7 +64,7 @@ jobs: || true - name: 'Publish code coverage results' run: | - ./.venv/bin/python -m coverage xml + source ./.venv/bin/activate bash <(curl -s https://codecov.io/bash) env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From webhook-mailer at python.org Mon Jan 6 16:41:37 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 21:41:37 -0000 Subject: [Python-checkins] bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) Message-ID: https://github.com/python/cpython/commit/fb59f5ffe80a1f2dcf7c6cbd2406e15bea49da21 commit: fb59f5ffe80a1f2dcf7c6cbd2406e15bea49da21 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T13:41:33-08:00 summary: bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) https://bugs.python.org/issue39041 Automerge-Triggered-By: @zooba (cherry picked from commit b1ce22d086660d2505010694c8813cc67adf8f9e) Co-authored-by: Steve Dower files: M .github/workflows/coverage.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index cb05e8e2f71f0..e8b47b390e5a7 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -64,7 +64,7 @@ jobs: || true - name: 'Publish code coverage results' run: | - ./.venv/bin/python -m coverage xml + source ./.venv/bin/activate bash <(curl -s https://codecov.io/bash) env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From webhook-mailer at python.org Mon Jan 6 16:42:42 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 21:42:42 -0000 Subject: [Python-checkins] bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) Message-ID: https://github.com/python/cpython/commit/676b16c14040ddb9a2ef3408e66a77c1dfb8e841 commit: 676b16c14040ddb9a2ef3408e66a77c1dfb8e841 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T13:42:37-08:00 summary: bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) https://bugs.python.org/issue39041 Automerge-Triggered-By: @zooba (cherry picked from commit b1ce22d086660d2505010694c8813cc67adf8f9e) Co-authored-by: Steve Dower files: M .github/workflows/coverage.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index cb05e8e2f71f0..e8b47b390e5a7 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -64,7 +64,7 @@ jobs: || true - name: 'Publish code coverage results' run: | - ./.venv/bin/python -m coverage xml + source ./.venv/bin/activate bash <(curl -s https://codecov.io/bash) env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From webhook-mailer at python.org Mon Jan 6 17:04:47 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 06 Jan 2020 22:04:47 -0000 Subject: [Python-checkins] bpo-39234: `enum.auto()` default initial value as 1 (GH-17878) Message-ID: https://github.com/python/cpython/commit/24bcefcb74231476b055bb6f0726642abeb10f04 commit: 24bcefcb74231476b055bb6f0726642abeb10f04 branch: master author: YoSTEALTH <35307184+YoSTEALTH at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-06T14:04:43-08:00 summary: bpo-39234: `enum.auto()` default initial value as 1 (GH-17878) Updated as Eric mentioned "By default, the initial value starts at 1" https://bugs.python.org/issue39234 Automerge-Triggered-By: @ericvsmith files: M Doc/library/enum.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index cfe3c207e1eee..eaf29cfde2344 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -55,7 +55,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. + Instances are replaced with an appropriate value for Enum members. By default, the initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` From webhook-mailer at python.org Tue Jan 7 01:52:52 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 07 Jan 2020 06:52:52 -0000 Subject: [Python-checkins] Doc: Change Python 2 status to EOL. (GH-17885) Message-ID: https://github.com/python/cpython/commit/f4800b8ed3dbe15a0078869a836d968ab3362b8c commit: f4800b8ed3dbe15a0078869a836d968ab3362b8c branch: master author: Inada Naoki committer: GitHub date: 2020-01-07T15:52:44+09:00 summary: Doc: Change Python 2 status to EOL. (GH-17885) files: M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index c51dcc7582e54..4730a5fe5db7b 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,7 @@

{% trans %}Docs by version{% endtrans %}

  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 2.7 (stable){% endtrans %}
  • +
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From webhook-mailer at python.org Tue Jan 7 01:57:04 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 06:57:04 -0000 Subject: [Python-checkins] Doc: Change Python 2 status to EOL. (GH-17885) Message-ID: https://github.com/python/cpython/commit/249706c1fbce04125d81bd9993e6c010ae30f8e4 commit: 249706c1fbce04125d81bd9993e6c010ae30f8e4 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T22:56:57-08:00 summary: Doc: Change Python 2 status to EOL. (GH-17885) (cherry picked from commit f4800b8ed3dbe15a0078869a836d968ab3362b8c) Co-authored-by: Inada Naoki files: M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index e5748f2ab0fc6..36f94ee03837e 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,7 @@

    {% trans %}Docs by version{% endtrans %}

  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 2.7 (stable){% endtrans %}
  • +
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From webhook-mailer at python.org Tue Jan 7 01:58:23 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 06:58:23 -0000 Subject: [Python-checkins] Doc: Change Python 2 status to EOL. (GH-17885) Message-ID: https://github.com/python/cpython/commit/3218520524670a0a857c9191b2cf315b70a0709f commit: 3218520524670a0a857c9191b2cf315b70a0709f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T22:58:19-08:00 summary: Doc: Change Python 2 status to EOL. (GH-17885) (cherry picked from commit f4800b8ed3dbe15a0078869a836d968ab3362b8c) Co-authored-by: Inada Naoki files: M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index e5748f2ab0fc6..36f94ee03837e 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,7 @@

    {% trans %}Docs by version{% endtrans %}

  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 2.7 (stable){% endtrans %}
  • +
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From webhook-mailer at python.org Tue Jan 7 01:59:33 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 06:59:33 -0000 Subject: [Python-checkins] Doc: Change Python 2 status to EOL. (GH-17885) Message-ID: https://github.com/python/cpython/commit/6a8284d8f1583c952e3219c7e3671ba4979e340f commit: 6a8284d8f1583c952e3219c7e3671ba4979e340f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-06T22:59:28-08:00 summary: Doc: Change Python 2 status to EOL. (GH-17885) (cherry picked from commit f4800b8ed3dbe15a0078869a836d968ab3362b8c) Co-authored-by: Inada Naoki files: M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index c51dcc7582e54..4730a5fe5db7b 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,7 @@

    {% trans %}Docs by version{% endtrans %}

  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 2.7 (stable){% endtrans %}
  • +
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From webhook-mailer at python.org Tue Jan 7 02:58:47 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 07 Jan 2020 07:58:47 -0000 Subject: [Python-checkins] bpo-38623: Doc: Add section for site module CLI. (GH-17858) Message-ID: https://github.com/python/cpython/commit/ca94677a6216e2d41b04574986ce49d31a0b329c commit: ca94677a6216e2d41b04574986ce49d31a0b329c branch: master author: Inada Naoki committer: GitHub date: 2020-01-07T16:58:40+09:00 summary: bpo-38623: Doc: Add section for site module CLI. (GH-17858) files: M Doc/library/site.rst diff --git a/Doc/library/site.rst b/Doc/library/site.rst index e1ca160c107b8..b424e1ba348d8 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -236,6 +236,13 @@ Module contents .. versionadded:: 3.2 +.. _site-commandline: + +Command Line Interface +---------------------- + +.. program:: site + The :mod:`site` module also provides a way to get the user directories from the command line: @@ -244,8 +251,6 @@ command line: $ python3 -m site --user-site /home/user/.local/lib/python3.3/site-packages -.. program:: site - If it is called without arguments, it will print the contents of :data:`sys.path` on the standard output, followed by the value of :data:`USER_BASE` and whether the directory exists, then the same thing for From webhook-mailer at python.org Tue Jan 7 03:04:39 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 08:04:39 -0000 Subject: [Python-checkins] bpo-38623: Doc: Add section for site module CLI. (GH-17858) Message-ID: https://github.com/python/cpython/commit/72995c5cdd7ad4af6252bbe129e8fc63f5006130 commit: 72995c5cdd7ad4af6252bbe129e8fc63f5006130 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-07T00:04:32-08:00 summary: bpo-38623: Doc: Add section for site module CLI. (GH-17858) (cherry picked from commit ca94677a6216e2d41b04574986ce49d31a0b329c) Co-authored-by: Inada Naoki files: M Doc/library/site.rst diff --git a/Doc/library/site.rst b/Doc/library/site.rst index 7974e20974f1d..6ec39cf58bd50 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -223,6 +223,13 @@ Module contents .. versionadded:: 3.2 +.. _site-commandline: + +Command Line Interface +---------------------- + +.. program:: site + The :mod:`site` module also provides a way to get the user directories from the command line: @@ -231,8 +238,6 @@ command line: $ python3 -m site --user-site /home/user/.local/lib/python3.3/site-packages -.. program:: site - If it is called without arguments, it will print the contents of :data:`sys.path` on the standard output, followed by the value of :data:`USER_BASE` and whether the directory exists, then the same thing for From webhook-mailer at python.org Tue Jan 7 03:04:47 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 08:04:47 -0000 Subject: [Python-checkins] bpo-38623: Doc: Add section for site module CLI. (GH-17858) Message-ID: https://github.com/python/cpython/commit/a6b37589a05c63abec122d3a00785641a3bcd85a commit: a6b37589a05c63abec122d3a00785641a3bcd85a branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-07T00:04:43-08:00 summary: bpo-38623: Doc: Add section for site module CLI. (GH-17858) (cherry picked from commit ca94677a6216e2d41b04574986ce49d31a0b329c) Co-authored-by: Inada Naoki files: M Doc/library/site.rst diff --git a/Doc/library/site.rst b/Doc/library/site.rst index e1ca160c107b8..b424e1ba348d8 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -236,6 +236,13 @@ Module contents .. versionadded:: 3.2 +.. _site-commandline: + +Command Line Interface +---------------------- + +.. program:: site + The :mod:`site` module also provides a way to get the user directories from the command line: @@ -244,8 +251,6 @@ command line: $ python3 -m site --user-site /home/user/.local/lib/python3.3/site-packages -.. program:: site - If it is called without arguments, it will print the contents of :data:`sys.path` on the standard output, followed by the value of :data:`USER_BASE` and whether the directory exists, then the same thing for From webhook-mailer at python.org Tue Jan 7 08:23:09 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 13:23:09 -0000 Subject: [Python-checkins] bpo-39191: Fix RuntimeWarning in asyncio test (GH-17863) Message-ID: https://github.com/python/cpython/commit/10ac0cded26d91c3468e5e5a87cecad7fc0bcebd commit: 10ac0cded26d91c3468e5e5a87cecad7fc0bcebd branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-07T05:23:01-08:00 summary: bpo-39191: Fix RuntimeWarning in asyncio test (GH-17863) https://bugs.python.org/issue39191 files: M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index e53ca73803463..d78724b015370 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -573,7 +573,7 @@ def _do_shutdown(self, future): except Exception as ex: self.call_soon_threadsafe(future.set_exception, ex) - def _check_runnung(self): + def _check_running(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: @@ -583,7 +583,7 @@ def _check_runnung(self): def run_forever(self): """Run until stop() is called.""" self._check_closed() - self._check_runnung() + self._check_running() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -615,7 +615,7 @@ def run_until_complete(self, future): Return the Future's result, or raise its exception. """ self._check_closed() - self._check_runnung() + self._check_running() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 4cbd1ed4712d5..4bdf82ef175a0 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -259,8 +259,12 @@ def test_run_until_complete_nesting(self): self.assertTrue(self.loop.is_running()) self.loop.run_until_complete(coro1()) - self.assertRaises( - RuntimeError, self.loop.run_until_complete, coro2()) + with self.assertWarnsRegex( + RuntimeWarning, + r"coroutine \S+ was never awaited" + ): + self.assertRaises( + RuntimeError, self.loop.run_until_complete, coro2()) # Note: because of the default Windows timing granularity of # 15.6 msec, we use fairly long sleep times here (~100 msec). From webhook-mailer at python.org Tue Jan 7 09:00:06 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 07 Jan 2020 14:00:06 -0000 Subject: [Python-checkins] bpo-39239: epoll.unregister() no longer ignores EBADF (GH-17882) Message-ID: https://github.com/python/cpython/commit/5b23f7618d434f3000bde482233c8642a6eb2c67 commit: 5b23f7618d434f3000bde482233c8642a6eb2c67 branch: master author: Victor Stinner committer: GitHub date: 2020-01-07T15:00:02+01:00 summary: bpo-39239: epoll.unregister() no longer ignores EBADF (GH-17882) The select.epoll.unregister() method no longer ignores the EBADF error. files: A Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst M Doc/library/select.rst M Doc/whatsnew/3.9.rst M Lib/test/test_epoll.py M Modules/selectmodule.c diff --git a/Doc/library/select.rst b/Doc/library/select.rst index 8f5a2cea9257c..bb2809580d040 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -355,6 +355,9 @@ Edge and Level Trigger Polling (epoll) Objects Remove a registered file descriptor from the epoll object. + .. versionchanged:: 3.9 + The method no longer ignores the :data:`~errno.EBADF` error. + .. method:: epoll.poll(timeout=None, maxevents=-1) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ff0fc24f317d4..46774c28c6aed 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -382,6 +382,10 @@ Changes in the Python API * The :mod:`venv` activation scripts no longer special-case when ``__VENV_PROMPT__`` is set to ``""``. +* The :meth:`select.epoll.unregister` method no longer ignores the + :data:`~errno.EBADF` error. + (Contributed by Victor Stinner in :issue:`39239`.) + CPython bytecode changes ------------------------ diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index 8ac0f31d8051c..10f148fe5cdb4 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -225,7 +225,10 @@ def test_unregister_closed(self): self.assertFalse(then - now > 0.01) server.close() - ep.unregister(fd) + + with self.assertRaises(OSError) as cm: + ep.unregister(fd) + self.assertEqual(cm.exception.errno, errno.EBADF) def test_close(self): open_file = open(__file__, "rb") diff --git a/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst b/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst new file mode 100644 index 0000000000000..2a1c9290869c1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst @@ -0,0 +1,2 @@ +The :meth:`select.epoll.unregister` method no longer ignores the +:data:`~errno.EBADF` error. diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 79cc1b265559b..7c6d7e4a15e96 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1447,11 +1447,6 @@ pyepoll_internal_ctl(int epfd, int op, int fd, unsigned int events) * though this argument is ignored. */ Py_BEGIN_ALLOW_THREADS result = epoll_ctl(epfd, op, fd, &ev); - if (errno == EBADF) { - /* fd already closed */ - result = 0; - errno = 0; - } Py_END_ALLOW_THREADS break; default: From webhook-mailer at python.org Tue Jan 7 09:55:23 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Tue, 07 Jan 2020 14:55:23 -0000 Subject: [Python-checkins] [3.8] bpo-39191: Fix RuntimeWarning in asyncio test (GH-17863) (#17894) Message-ID: https://github.com/python/cpython/commit/4112a3da2e01ecc19e9f54b8ac7b383b6f5e85c8 commit: 4112a3da2e01ecc19e9f54b8ac7b383b6f5e85c8 branch: 3.8 author: Andrew Svetlov committer: GitHub date: 2020-01-07T16:55:19+02:00 summary: [3.8] bpo-39191: Fix RuntimeWarning in asyncio test (GH-17863) (#17894) https://bugs.python.org/issue39191. (cherry picked from commit 10ac0cded26d91c3468e5e5a87cecad7fc0bcebd) Co-authored-by: Andrew Svetlov files: M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index aedf0c5e6d3d2..799013d5ccccb 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -547,7 +547,7 @@ def _asyncgen_firstiter_hook(self, agen): 'asyncgen': agen }) - def _check_runnung(self): + def _check_running(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: @@ -557,7 +557,7 @@ def _check_runnung(self): def run_forever(self): """Run until stop() is called.""" self._check_closed() - self._check_runnung() + self._check_running() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -589,7 +589,7 @@ def run_until_complete(self, future): Return the Future's result, or raise its exception. """ self._check_closed() - self._check_runnung() + self._check_running() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index b0ade1ed3ba1b..aec56da8e2250 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -258,8 +258,12 @@ def test_run_until_complete_nesting(self): self.assertTrue(self.loop.is_running()) self.loop.run_until_complete(coro1()) - self.assertRaises( - RuntimeError, self.loop.run_until_complete, coro2()) + with self.assertWarnsRegex( + RuntimeWarning, + r"coroutine \S+ was never awaited" + ): + self.assertRaises( + RuntimeError, self.loop.run_until_complete, coro2()) # Note: because of the default Windows timing granularity of # 15.6 msec, we use fairly long sleep times here (~100 msec). From webhook-mailer at python.org Tue Jan 7 11:40:31 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 07 Jan 2020 16:40:31 -0000 Subject: [Python-checkins] bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) Message-ID: https://github.com/python/cpython/commit/950c6795aa0ffa85e103a13e7a04e08cb34c66ad commit: 950c6795aa0ffa85e103a13e7a04e08cb34c66ad branch: master author: Derek Brown committer: Vinay Sajip date: 2020-01-07T16:40:23Z summary: bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) files: A Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst M Lib/logging/__init__.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 62a87a71b1a3b..59d5fa5b64d22 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1687,12 +1687,15 @@ def isEnabledFor(self, level): return self._cache[level] except KeyError: _acquireLock() - if self.manager.disable >= level: - is_enabled = self._cache[level] = False - else: - is_enabled = self._cache[level] = level >= self.getEffectiveLevel() - _releaseLock() - + try: + if self.manager.disable >= level: + is_enabled = self._cache[level] = False + else: + is_enabled = self._cache[level] = ( + level >= self.getEffectiveLevel() + ) + finally: + _releaseLock() return is_enabled def getChild(self, suffix): diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst new file mode 100644 index 0000000000000..ec4e81e2bbe4a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst @@ -0,0 +1 @@ +If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio timeouts or stopit) , the `logging` global lock may not be released appropriately, resulting in deadlock. This change wraps that block of code with `try...finally` to ensure the lock is released. \ No newline at end of file From webhook-mailer at python.org Tue Jan 7 12:03:30 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 07 Jan 2020 17:03:30 -0000 Subject: [Python-checkins] bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) (GH-17897) Message-ID: https://github.com/python/cpython/commit/bff48c6734f936257b0cfae58dbea67d43e3b245 commit: bff48c6734f936257b0cfae58dbea67d43e3b245 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2020-01-07T17:03:23Z summary: bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) (GH-17897) (cherry picked from commit 950c6795aa0ffa85e103a13e7a04e08cb34c66ad) files: A Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst M Lib/logging/__init__.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 16812ec8d5567..0cfaec84bac13 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1685,12 +1685,15 @@ def isEnabledFor(self, level): return self._cache[level] except KeyError: _acquireLock() - if self.manager.disable >= level: - is_enabled = self._cache[level] = False - else: - is_enabled = self._cache[level] = level >= self.getEffectiveLevel() - _releaseLock() - + try: + if self.manager.disable >= level: + is_enabled = self._cache[level] = False + else: + is_enabled = self._cache[level] = ( + level >= self.getEffectiveLevel() + ) + finally: + _releaseLock() return is_enabled def getChild(self, suffix): diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst new file mode 100644 index 0000000000000..ec4e81e2bbe4a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst @@ -0,0 +1 @@ +If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio timeouts or stopit) , the `logging` global lock may not be released appropriately, resulting in deadlock. This change wraps that block of code with `try...finally` to ensure the lock is released. \ No newline at end of file From webhook-mailer at python.org Tue Jan 7 12:03:54 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 07 Jan 2020 17:03:54 -0000 Subject: [Python-checkins] bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) (GH-17898) Message-ID: https://github.com/python/cpython/commit/d46dec981abdefba56336521c7587c8554bb1b9d commit: d46dec981abdefba56336521c7587c8554bb1b9d branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2020-01-07T17:03:49Z summary: bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) (GH-17898) (cherry picked from commit 950c6795aa0ffa85e103a13e7a04e08cb34c66ad) files: A Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst M Lib/logging/__init__.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 6e017148861de..b596f80f6fa52 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1619,12 +1619,15 @@ def isEnabledFor(self, level): return self._cache[level] except KeyError: _acquireLock() - if self.manager.disable >= level: - is_enabled = self._cache[level] = False - else: - is_enabled = self._cache[level] = level >= self.getEffectiveLevel() - _releaseLock() - + try: + if self.manager.disable >= level: + is_enabled = self._cache[level] = False + else: + is_enabled = self._cache[level] = ( + level >= self.getEffectiveLevel() + ) + finally: + _releaseLock() return is_enabled def getChild(self, suffix): diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst new file mode 100644 index 0000000000000..ec4e81e2bbe4a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst @@ -0,0 +1 @@ +If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio timeouts or stopit) , the `logging` global lock may not be released appropriately, resulting in deadlock. This change wraps that block of code with `try...finally` to ensure the lock is released. \ No newline at end of file From webhook-mailer at python.org Tue Jan 7 12:28:17 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 07 Jan 2020 17:28:17 -0000 Subject: [Python-checkins] bpo-38615: Add timeout parameter for IMAP4 and IMAP4_SSL constructor (GH-17203) Message-ID: https://github.com/python/cpython/commit/13a7ee8d62dafe7d2291708312fa2a86e171c7fa commit: 13a7ee8d62dafe7d2291708312fa2a86e171c7fa branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-07T18:28:10+01:00 summary: bpo-38615: Add timeout parameter for IMAP4 and IMAP4_SSL constructor (GH-17203) imaplib.IMAP4 and imaplib.IMAP4_SSL now have an optional *timeout* parameter for their constructors. Also, the imaplib.IMAP4.open() method now has an optional *timeout* parameter with this change. The overridden methods of imaplib.IMAP4_SSL and imaplib.IMAP4_stream were applied to this change. files: A Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst M Doc/library/imaplib.rst M Doc/whatsnew/3.9.rst M Lib/imaplib.py M Lib/test/test_imaplib.py diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index df63d820cfe04..5b8ca7ce68fd9 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -30,12 +30,14 @@ Three classes are provided by the :mod:`imaplib` module, :class:`IMAP4` is the base class: -.. class:: IMAP4(host='', port=IMAP4_PORT) +.. class:: IMAP4(host='', port=IMAP4_PORT, timeout=None) This class implements the actual IMAP4 protocol. The connection is created and protocol version (IMAP4 or IMAP4rev1) is determined when the instance is initialized. If *host* is not specified, ``''`` (the local host) is used. If - *port* is omitted, the standard IMAP4 port (143) is used. + *port* is omitted, the standard IMAP4 port (143) is used. The optional *timeout* + parameter specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout is used. The :class:`IMAP4` class supports the :keyword:`with` statement. When used like this, the IMAP4 ``LOGOUT`` command is issued automatically when the @@ -50,6 +52,9 @@ base class: .. versionchanged:: 3.5 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + Three exceptions are defined as attributes of the :class:`IMAP4` class: @@ -78,7 +83,7 @@ There's also a subclass for secure connections: .. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, \ - certfile=None, ssl_context=None) + certfile=None, ssl_context=None, timeout=None) This is a subclass derived from :class:`IMAP4` that connects over an SSL encrypted socket (to use this class you need a socket module that was compiled @@ -95,8 +100,12 @@ There's also a subclass for secure connections: mutually exclusive with *ssl_context*, a :class:`ValueError` is raised if *keyfile*/*certfile* is provided along with *ssl_context*. + The optional *timeout* parameter specifies a timeout in seconds for the + connection attempt. If timeout is not given or is None, the global default + socket timeout is used. + .. versionchanged:: 3.3 - *ssl_context* parameter added. + *ssl_context* parameter was added. .. versionchanged:: 3.4 The class now supports hostname check with @@ -110,6 +119,8 @@ There's also a subclass for secure connections: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. The second subclass allows for connections created by a child process: @@ -353,16 +364,22 @@ An :class:`IMAP4` instance has the following methods: Send ``NOOP`` to server. -.. method:: IMAP4.open(host, port) +.. method:: IMAP4.open(host, port, timeout=None) - Opens socket to *port* at *host*. This method is implicitly called by - the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, - :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override - this method. + Opens socket to *port* at *host*. The optional *timeout* parameter + specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout + is used. Also note that if the *timeout* parameter is set to be zero, + it will raise a :class:`ValueError` to reject creating a non-blocking socket. + This method is implicitly called by the :class:`IMAP4` constructor. + The connection objects established by this method will be used in + the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, :meth:`IMAP4.send`, + and :meth:`IMAP4.shutdown` methods. You may override this method. .. audit-event:: imaplib.open self,host,port imaplib.IMAP4.open + .. versionchanged:: 3.9 + The *timeout* parameter was added. .. method:: IMAP4.partial(message_num, message_part, start, length) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 46774c28c6aed..ea6d8f515a944 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -167,6 +167,16 @@ When the garbage collector makes a collection in which some objects resurrect been executed), do not block the collection of all objects that are still unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) +imaplib +------- + +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have +an optional *timeout* parameter for their constructors. +Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. +(Contributed by Dong-hee Na in :issue:`38615`.) + os -- diff --git a/Lib/imaplib.py b/Lib/imaplib.py index a4f499383efae..abfdd737779a0 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -135,10 +135,13 @@ class IMAP4: r"""IMAP4 client class. - Instantiate with: IMAP4([host[, port]]) + Instantiate with: IMAP4([host[, port[, timeout=None]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 port). + timeout - socket timeout (default: None) + If timeout is not given or is None, + the global default socket timeout is used All IMAP4rev1 commands are supported by methods of the same name (in lower-case). @@ -181,7 +184,7 @@ class error(Exception): pass # Logical errors - debug required class abort(error): pass # Service errors - close and retry class readonly(abort): pass # Mailbox status changed to READ-ONLY - def __init__(self, host='', port=IMAP4_PORT): + def __init__(self, host='', port=IMAP4_PORT, timeout=None): self.debug = Debug self.state = 'LOGOUT' self.literal = None # A literal argument to a command @@ -195,7 +198,7 @@ def __init__(self, host='', port=IMAP4_PORT): # Open socket to server. - self.open(host, port) + self.open(host, port, timeout) try: self._connect() @@ -284,15 +287,20 @@ def __exit__(self, *args): # Overridable methods - def _create_socket(self): + def _create_socket(self, timeout): # Default value of IMAP4.host is '', but socket.getaddrinfo() # (which is used by socket.create_connection()) expects None # as a default value for host. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') host = None if not self.host else self.host sys.audit("imaplib.open", self, self.host, self.port) - return socket.create_connection((host, self.port)) + address = (host, self.port) + if timeout is not None: + return socket.create_connection(address, timeout) + return socket.create_connection(address) - def open(self, host = '', port = IMAP4_PORT): + def open(self, host='', port=IMAP4_PORT, timeout=None): """Setup connection to remote server on "host:port" (default: localhost:standard IMAP4 port). This connection will be used by the routines: @@ -300,7 +308,7 @@ def open(self, host = '', port = IMAP4_PORT): """ self.host = host self.port = port - self.sock = self._create_socket() + self.sock = self._create_socket(timeout) self.file = self.sock.makefile('rb') @@ -1261,7 +1269,7 @@ class IMAP4_SSL(IMAP4): """IMAP4 client class over SSL connection - Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context]]]]]) + Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context[, timeout=None]]]]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 SSL port); @@ -1271,13 +1279,15 @@ class IMAP4_SSL(IMAP4): and private key (default: None) Note: if ssl_context is provided, then parameters keyfile or certfile should not be set otherwise ValueError is raised. + timeout - socket timeout (default: None) If timeout is not given or is None, + the global default socket timeout is used for more documentation see the docstring of the parent class IMAP4. """ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, - certfile=None, ssl_context=None): + certfile=None, ssl_context=None, timeout=None): if ssl_context is not None and keyfile is not None: raise ValueError("ssl_context and keyfile arguments are mutually " "exclusive") @@ -1294,20 +1304,20 @@ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, ssl_context = ssl._create_stdlib_context(certfile=certfile, keyfile=keyfile) self.ssl_context = ssl_context - IMAP4.__init__(self, host, port) + IMAP4.__init__(self, host, port, timeout) - def _create_socket(self): - sock = IMAP4._create_socket(self) + def _create_socket(self, timeout): + sock = IMAP4._create_socket(self, timeout) return self.ssl_context.wrap_socket(sock, server_hostname=self.host) - def open(self, host='', port=IMAP4_SSL_PORT): + def open(self, host='', port=IMAP4_SSL_PORT, timeout=None): """Setup connection to remote server on "host:port". (default: localhost:standard IMAP4 SSL port). This connection will be used by the routines: read, readline, send, shutdown. """ - IMAP4.open(self, host, port) + IMAP4.open(self, host, port, timeout) __all__.append("IMAP4_SSL") @@ -1329,7 +1339,7 @@ def __init__(self, command): IMAP4.__init__(self) - def open(self, host = None, port = None): + def open(self, host=None, port=None, timeout=None): """Setup a stream connection. This connection will be used by the routines: read, readline, send, shutdown. diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 795276e0a7aa3..91aa77126a28c 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -440,6 +440,29 @@ def test_simple_with_statement(self): with self.imap_class(*server.server_address): pass + def test_imaplib_timeout_test(self): + _, server = self._setup(SimpleIMAPHandler) + addr = server.server_address[1] + client = self.imap_class("localhost", addr, timeout=None) + self.assertEqual(client.sock.timeout, None) + client.shutdown() + client = self.imap_class("localhost", addr, timeout=support.LOOPBACK_TIMEOUT) + self.assertEqual(client.sock.timeout, support.LOOPBACK_TIMEOUT) + client.shutdown() + with self.assertRaises(ValueError): + client = self.imap_class("localhost", addr, timeout=0) + + def test_imaplib_timeout_functionality_test(self): + class TimeoutHandler(SimpleIMAPHandler): + def handle(self): + time.sleep(1) + SimpleIMAPHandler.handle(self) + + _, server = self._setup(TimeoutHandler) + addr = server.server_address[1] + with self.assertRaises(socket.timeout): + client = self.imap_class("localhost", addr, timeout=0.001) + def test_with_statement(self): _, server = self._setup(SimpleIMAPHandler, connect=False) with self.imap_class(*server.server_address) as imap: diff --git a/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst b/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst new file mode 100644 index 0000000000000..04f51da0db723 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst @@ -0,0 +1,5 @@ +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have an +optional *timeout* parameter for their constructors. +Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 7 12:31:02 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 07 Jan 2020 17:31:02 -0000 Subject: [Python-checkins] bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Message-ID: https://github.com/python/cpython/commit/b821173b5458d137c8d5edb6e9b4997aac800a38 commit: b821173b5458d137c8d5edb6e9b4997aac800a38 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-07T18:30:54+01:00 summary: bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Correctly parenthesize filter-based statements that contain lambda expressions in lib2to3. files: A Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst M Lib/lib2to3/fixes/fix_filter.py M Lib/lib2to3/tests/test_fixers.py diff --git a/Lib/lib2to3/fixes/fix_filter.py b/Lib/lib2to3/fixes/fix_filter.py index a7a5a154f6fb1..38e9078f11ac8 100644 --- a/Lib/lib2to3/fixes/fix_filter.py +++ b/Lib/lib2to3/fixes/fix_filter.py @@ -17,7 +17,7 @@ from .. import fixer_base from ..pytree import Node from ..pygram import python_symbols as syms -from ..fixer_util import Name, ArgList, ListComp, in_special_context +from ..fixer_util import Name, ArgList, ListComp, in_special_context, parenthesize class FixFilter(fixer_base.ConditionalFix): @@ -65,10 +65,14 @@ def transform(self, node, results): trailers.append(t.clone()) if "filter_lambda" in results: + xp = results.get("xp").clone() + if xp.type == syms.test: + xp.prefix = "" + xp = parenthesize(xp) + new = ListComp(results.get("fp").clone(), results.get("fp").clone(), - results.get("it").clone(), - results.get("xp").clone()) + results.get("it").clone(), xp) new = Node(syms.power, [new] + trailers, prefix="") elif "none" in results: diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py index 3da5dd845c93c..a285241981813 100644 --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2954,6 +2954,11 @@ def test_filter_basic(self): a = """x = [x for x in range(10) if x%2 == 0]""" self.check(b, a) + # bpo-38871 + b = """filter(lambda x: True if x > 2 else False, [1, 2, 3])""" + a = """[x for x in [1, 2, 3] if (True if x > 2 else False)]""" + self.check(b, a) + def test_filter_trailers(self): b = """x = filter(None, 'abc')[0]""" a = """x = [_f for _f in 'abc' if _f][0]""" diff --git a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst new file mode 100644 index 0000000000000..fe970fd9e3fa1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst @@ -0,0 +1,2 @@ +Correctly parenthesize filter-based statements that contain lambda +expressions in mod:`lib2to3`. Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 7 12:47:58 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 17:47:58 -0000 Subject: [Python-checkins] bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Message-ID: https://github.com/python/cpython/commit/535a3c4e3da2f0076bd62f04fb2cc44999fc2419 commit: 535a3c4e3da2f0076bd62f04fb2cc44999fc2419 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-07T09:47:51-08:00 summary: bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Correctly parenthesize filter-based statements that contain lambda expressions in lib2to3. (cherry picked from commit b821173b5458d137c8d5edb6e9b4997aac800a38) Co-authored-by: Dong-hee Na files: A Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst M Lib/lib2to3/fixes/fix_filter.py M Lib/lib2to3/tests/test_fixers.py diff --git a/Lib/lib2to3/fixes/fix_filter.py b/Lib/lib2to3/fixes/fix_filter.py index a7a5a154f6fb1..38e9078f11ac8 100644 --- a/Lib/lib2to3/fixes/fix_filter.py +++ b/Lib/lib2to3/fixes/fix_filter.py @@ -17,7 +17,7 @@ from .. import fixer_base from ..pytree import Node from ..pygram import python_symbols as syms -from ..fixer_util import Name, ArgList, ListComp, in_special_context +from ..fixer_util import Name, ArgList, ListComp, in_special_context, parenthesize class FixFilter(fixer_base.ConditionalFix): @@ -65,10 +65,14 @@ def transform(self, node, results): trailers.append(t.clone()) if "filter_lambda" in results: + xp = results.get("xp").clone() + if xp.type == syms.test: + xp.prefix = "" + xp = parenthesize(xp) + new = ListComp(results.get("fp").clone(), results.get("fp").clone(), - results.get("it").clone(), - results.get("xp").clone()) + results.get("it").clone(), xp) new = Node(syms.power, [new] + trailers, prefix="") elif "none" in results: diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py index 3da5dd845c93c..a285241981813 100644 --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2954,6 +2954,11 @@ def test_filter_basic(self): a = """x = [x for x in range(10) if x%2 == 0]""" self.check(b, a) + # bpo-38871 + b = """filter(lambda x: True if x > 2 else False, [1, 2, 3])""" + a = """[x for x in [1, 2, 3] if (True if x > 2 else False)]""" + self.check(b, a) + def test_filter_trailers(self): b = """x = filter(None, 'abc')[0]""" a = """x = [_f for _f in 'abc' if _f][0]""" diff --git a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst new file mode 100644 index 0000000000000..fe970fd9e3fa1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst @@ -0,0 +1,2 @@ +Correctly parenthesize filter-based statements that contain lambda +expressions in mod:`lib2to3`. Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 7 12:52:12 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 07 Jan 2020 17:52:12 -0000 Subject: [Python-checkins] bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Message-ID: https://github.com/python/cpython/commit/39a5c889d30d03a88102e56f03ee0c95db198fb3 commit: 39a5c889d30d03a88102e56f03ee0c95db198fb3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-07T09:52:06-08:00 summary: bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Correctly parenthesize filter-based statements that contain lambda expressions in lib2to3. (cherry picked from commit b821173b5458d137c8d5edb6e9b4997aac800a38) Co-authored-by: Dong-hee Na files: A Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst M Lib/lib2to3/fixes/fix_filter.py M Lib/lib2to3/tests/test_fixers.py diff --git a/Lib/lib2to3/fixes/fix_filter.py b/Lib/lib2to3/fixes/fix_filter.py index a7a5a154f6fb1..38e9078f11ac8 100644 --- a/Lib/lib2to3/fixes/fix_filter.py +++ b/Lib/lib2to3/fixes/fix_filter.py @@ -17,7 +17,7 @@ from .. import fixer_base from ..pytree import Node from ..pygram import python_symbols as syms -from ..fixer_util import Name, ArgList, ListComp, in_special_context +from ..fixer_util import Name, ArgList, ListComp, in_special_context, parenthesize class FixFilter(fixer_base.ConditionalFix): @@ -65,10 +65,14 @@ def transform(self, node, results): trailers.append(t.clone()) if "filter_lambda" in results: + xp = results.get("xp").clone() + if xp.type == syms.test: + xp.prefix = "" + xp = parenthesize(xp) + new = ListComp(results.get("fp").clone(), results.get("fp").clone(), - results.get("it").clone(), - results.get("xp").clone()) + results.get("it").clone(), xp) new = Node(syms.power, [new] + trailers, prefix="") elif "none" in results: diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py index 3da5dd845c93c..a285241981813 100644 --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2954,6 +2954,11 @@ def test_filter_basic(self): a = """x = [x for x in range(10) if x%2 == 0]""" self.check(b, a) + # bpo-38871 + b = """filter(lambda x: True if x > 2 else False, [1, 2, 3])""" + a = """[x for x in [1, 2, 3] if (True if x > 2 else False)]""" + self.check(b, a) + def test_filter_trailers(self): b = """x = filter(None, 'abc')[0]""" a = """x = [_f for _f in 'abc' if _f][0]""" diff --git a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst new file mode 100644 index 0000000000000..fe970fd9e3fa1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst @@ -0,0 +1,2 @@ +Correctly parenthesize filter-based statements that contain lambda +expressions in mod:`lib2to3`. Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 7 15:52:21 2020 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 07 Jan 2020 20:52:21 -0000 Subject: [Python-checkins] Doc: Change Python 2 status to EOL. (GH-17885) (GH-17887) Message-ID: https://github.com/python/cpython/commit/fe2445840ccf4836edc267144e521433532193bd commit: fe2445840ccf4836edc267144e521433532193bd branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2020-01-07T15:52:13-05:00 summary: Doc: Change Python 2 status to EOL. (GH-17885) (GH-17887) (cherry picked from commit f4800b8ed3dbe15a0078869a836d968ab3362b8c) Co-authored-by: Inada Naoki files: M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index e5748f2ab0fc6..36f94ee03837e 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,7 @@

    {% trans %}Docs by version{% endtrans %}

  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 2.7 (stable){% endtrans %}
  • +
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From webhook-mailer at python.org Wed Jan 8 07:52:49 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 08 Jan 2020 12:52:49 -0000 Subject: [Python-checkins] bpo-39237, datetime: Remove redundant call to round from delta_new (GH-17877) Message-ID: https://github.com/python/cpython/commit/998c54948a29cf5bd8bfa49f973f1ce5855004a0 commit: 998c54948a29cf5bd8bfa49f973f1ce5855004a0 branch: master author: Alex Henrie committer: Victor Stinner date: 2020-01-08T13:52:44+01:00 summary: bpo-39237, datetime: Remove redundant call to round from delta_new (GH-17877) files: M Modules/_datetimemodule.c diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index c1b24073436e6..0b98cca67d4c5 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2489,7 +2489,6 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) int x_is_odd; PyObject *temp; - whole_us = round(leftover_us); if (fabs(whole_us - leftover_us) == 0.5) { /* We're exactly halfway between two integers. In order * to do round-half-to-even, we must determine whether x From webhook-mailer at python.org Wed Jan 8 08:00:19 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 Jan 2020 13:00:19 -0000 Subject: [Python-checkins] bpo-39233: Update positional-only section in the glossary (GH-17874) Message-ID: https://github.com/python/cpython/commit/9a669d58e8cb586fba38c84d5b631cd8a95d0c0c commit: 9a669d58e8cb586fba38c84d5b631cd8a95d0c0c branch: master author: Pablo Galindo committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-08T05:00:14-08:00 summary: bpo-39233: Update positional-only section in the glossary (GH-17874) https://bugs.python.org/issue39233 files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9ce0357f1cb42..6189cb045049c 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -824,9 +824,11 @@ Glossary .. _positional-only_parameter: * :dfn:`positional-only`: specifies an argument that can be supplied only - by position. Python has no syntax for defining positional-only - parameters. However, some built-in functions have positional-only - parameters (e.g. :func:`abs`). + by position. Positional-only parameters can be defined by including a + ``/`` character in the parameter list of the function definition after + them, for example *posonly1* and *posonly2* in the following:: + + def func(posonly1, posonly2, /, positional_or_keyword): ... .. _keyword-only_parameter: From webhook-mailer at python.org Wed Jan 8 10:29:48 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 08 Jan 2020 15:29:48 -0000 Subject: [Python-checkins] bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) Message-ID: https://github.com/python/cpython/commit/2e6a8efa837410327b593dc83c57492253b1201e commit: 2e6a8efa837410327b593dc83c57492253b1201e branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-08T16:29:34+01:00 summary: bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) files: A Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst M Doc/library/nntplib.rst M Lib/nntplib.py M Lib/test/test_nntplib.py diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 46f1c0783551c..e8480b548073a 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -20,7 +20,7 @@ as well as the older :rfc:`977` and :rfc:`2980`. Here are two small examples of how it can be used. To list some statistics about a newsgroup and print the subjects of the last 10 articles:: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 @@ -44,7 +44,7 @@ about a newsgroup and print the subjects of the last 10 articles:: To post an article from a binary file (this assumes that the article has valid headers, and that you have right to post on the particular newsgroup):: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> f = open('article.txt', 'rb') >>> s.post(f) '240 Article posted successfully.' @@ -73,7 +73,7 @@ The module itself defines the following classes: connection when done, e.g.: >>> from nntplib import NNTP - >>> with NNTP('news.gmane.org') as n: + >>> with NNTP('news.gmane.io') as n: ... n.group('gmane.comp.python.committers') ... # doctest: +SKIP ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') @@ -225,7 +225,7 @@ tuples or objects that the method normally returns will be empty. of values. On legacy servers which don't understand the ``CAPABILITIES`` command, an empty dictionary is returned instead. - >>> s = NNTP('news.gmane.org') + >>> s = NNTP('news.gmane.io') >>> 'POST' in s.getcapabilities() True diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 1b7e83af01ad0..9036f361b5fb6 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1107,7 +1107,7 @@ def _close(self): nntplib built-in demo - display the latest articles in a newsgroup""") parser.add_argument('-g', '--group', default='gmane.comp.python.general', help='group to fetch messages from (default: %(default)s)') - parser.add_argument('-s', '--server', default='news.gmane.org', + parser.add_argument('-s', '--server', default='news.gmane.io', help='NNTP server hostname (default: %(default)s)') parser.add_argument('-p', '--port', default=-1, type=int, help='NNTP port number (default: %s / %s)' % (NNTP_PORT, NNTP_SSL_PORT)) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index daa4a7945c1f8..88c54f4e6f37d 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -639,7 +639,7 @@ def handle_XOVER(self, message_spec): "\tSat, 19 Jun 2010 18:04:08 -0400" "\t<4FD05F05-F98B-44DC-8111-C6009C925F0C at gmail.com>" "\t\t7103\t16" - "\tXref: news.gmane.org gmane.comp.python.authors:57" + "\tXref: news.gmane.io gmane.comp.python.authors:57" "\n" "58\tLooking for a few good bloggers" "\tDoug Hellmann " @@ -1125,7 +1125,7 @@ def check_over_xover_resp(self, resp, overviews): "references": "", ":bytes": "7103", ":lines": "16", - "xref": "news.gmane.org gmane.comp.python.authors:57" + "xref": "news.gmane.io gmane.comp.python.authors:57" }) art_num, over = overviews[1] self.assertEqual(over["xref"], None) diff --git a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst new file mode 100644 index 0000000000000..a87dddf81dcd5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst @@ -0,0 +1,3 @@ +Updated the Gmane domain from news.gmane.org to news.gmane.io +which is used for examples of :class:`~nntplib.NNTP` news reader server and +nntplib tests. From webhook-mailer at python.org Wed Jan 8 10:47:36 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 Jan 2020 15:47:36 -0000 Subject: [Python-checkins] bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) Message-ID: https://github.com/python/cpython/commit/00ac28ac4d06a311fc2386ef921b2603735ffae6 commit: 00ac28ac4d06a311fc2386ef921b2603735ffae6 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-08T07:47:25-08:00 summary: bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) (cherry picked from commit 2e6a8efa837410327b593dc83c57492253b1201e) Co-authored-by: Dong-hee Na files: A Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst M Doc/library/nntplib.rst M Lib/nntplib.py M Lib/test/test_nntplib.py diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 56188c7ef5388..2050685a1670f 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -20,7 +20,7 @@ as well as the older :rfc:`977` and :rfc:`2980`. Here are two small examples of how it can be used. To list some statistics about a newsgroup and print the subjects of the last 10 articles:: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 @@ -44,7 +44,7 @@ about a newsgroup and print the subjects of the last 10 articles:: To post an article from a binary file (this assumes that the article has valid headers, and that you have right to post on the particular newsgroup):: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> f = open('article.txt', 'rb') >>> s.post(f) '240 Article posted successfully.' @@ -73,7 +73,7 @@ The module itself defines the following classes: connection when done, e.g.: >>> from nntplib import NNTP - >>> with NNTP('news.gmane.org') as n: + >>> with NNTP('news.gmane.io') as n: ... n.group('gmane.comp.python.committers') ... # doctest: +SKIP ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') @@ -210,7 +210,7 @@ tuples or objects that the method normally returns will be empty. of values. On legacy servers which don't understand the ``CAPABILITIES`` command, an empty dictionary is returned instead. - >>> s = NNTP('news.gmane.org') + >>> s = NNTP('news.gmane.io') >>> 'POST' in s.getcapabilities() True diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 5961a28ab7d9b..9f5610ea87650 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1103,7 +1103,7 @@ def _close(self): nntplib built-in demo - display the latest articles in a newsgroup""") parser.add_argument('-g', '--group', default='gmane.comp.python.general', help='group to fetch messages from (default: %(default)s)') - parser.add_argument('-s', '--server', default='news.gmane.org', + parser.add_argument('-s', '--server', default='news.gmane.io', help='NNTP server hostname (default: %(default)s)') parser.add_argument('-p', '--port', default=-1, type=int, help='NNTP port number (default: %s / %s)' % (NNTP_PORT, NNTP_SSL_PORT)) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 618b403bfb5bd..fbd7db03defb1 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -633,7 +633,7 @@ def handle_XOVER(self, message_spec): "\tSat, 19 Jun 2010 18:04:08 -0400" "\t<4FD05F05-F98B-44DC-8111-C6009C925F0C at gmail.com>" "\t\t7103\t16" - "\tXref: news.gmane.org gmane.comp.python.authors:57" + "\tXref: news.gmane.io gmane.comp.python.authors:57" "\n" "58\tLooking for a few good bloggers" "\tDoug Hellmann " @@ -1119,7 +1119,7 @@ def check_over_xover_resp(self, resp, overviews): "references": "", ":bytes": "7103", ":lines": "16", - "xref": "news.gmane.org gmane.comp.python.authors:57" + "xref": "news.gmane.io gmane.comp.python.authors:57" }) art_num, over = overviews[1] self.assertEqual(over["xref"], None) diff --git a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst new file mode 100644 index 0000000000000..a87dddf81dcd5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst @@ -0,0 +1,3 @@ +Updated the Gmane domain from news.gmane.org to news.gmane.io +which is used for examples of :class:`~nntplib.NNTP` news reader server and +nntplib tests. From webhook-mailer at python.org Wed Jan 8 10:48:38 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 08 Jan 2020 15:48:38 -0000 Subject: [Python-checkins] bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) Message-ID: https://github.com/python/cpython/commit/b24e4fac03409c4f845758d7ed884c5a99368493 commit: b24e4fac03409c4f845758d7ed884c5a99368493 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-08T07:48:33-08:00 summary: bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) (cherry picked from commit 2e6a8efa837410327b593dc83c57492253b1201e) Co-authored-by: Dong-hee Na files: A Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst M Doc/library/nntplib.rst M Lib/nntplib.py M Lib/test/test_nntplib.py diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 46f1c0783551c..e8480b548073a 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -20,7 +20,7 @@ as well as the older :rfc:`977` and :rfc:`2980`. Here are two small examples of how it can be used. To list some statistics about a newsgroup and print the subjects of the last 10 articles:: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 @@ -44,7 +44,7 @@ about a newsgroup and print the subjects of the last 10 articles:: To post an article from a binary file (this assumes that the article has valid headers, and that you have right to post on the particular newsgroup):: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> f = open('article.txt', 'rb') >>> s.post(f) '240 Article posted successfully.' @@ -73,7 +73,7 @@ The module itself defines the following classes: connection when done, e.g.: >>> from nntplib import NNTP - >>> with NNTP('news.gmane.org') as n: + >>> with NNTP('news.gmane.io') as n: ... n.group('gmane.comp.python.committers') ... # doctest: +SKIP ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') @@ -225,7 +225,7 @@ tuples or objects that the method normally returns will be empty. of values. On legacy servers which don't understand the ``CAPABILITIES`` command, an empty dictionary is returned instead. - >>> s = NNTP('news.gmane.org') + >>> s = NNTP('news.gmane.io') >>> 'POST' in s.getcapabilities() True diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 1b7e83af01ad0..9036f361b5fb6 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1107,7 +1107,7 @@ def _close(self): nntplib built-in demo - display the latest articles in a newsgroup""") parser.add_argument('-g', '--group', default='gmane.comp.python.general', help='group to fetch messages from (default: %(default)s)') - parser.add_argument('-s', '--server', default='news.gmane.org', + parser.add_argument('-s', '--server', default='news.gmane.io', help='NNTP server hostname (default: %(default)s)') parser.add_argument('-p', '--port', default=-1, type=int, help='NNTP port number (default: %s / %s)' % (NNTP_PORT, NNTP_SSL_PORT)) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 618b403bfb5bd..fbd7db03defb1 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -633,7 +633,7 @@ def handle_XOVER(self, message_spec): "\tSat, 19 Jun 2010 18:04:08 -0400" "\t<4FD05F05-F98B-44DC-8111-C6009C925F0C at gmail.com>" "\t\t7103\t16" - "\tXref: news.gmane.org gmane.comp.python.authors:57" + "\tXref: news.gmane.io gmane.comp.python.authors:57" "\n" "58\tLooking for a few good bloggers" "\tDoug Hellmann " @@ -1119,7 +1119,7 @@ def check_over_xover_resp(self, resp, overviews): "references": "", ":bytes": "7103", ":lines": "16", - "xref": "news.gmane.org gmane.comp.python.authors:57" + "xref": "news.gmane.io gmane.comp.python.authors:57" }) art_num, over = overviews[1] self.assertEqual(over["xref"], None) diff --git a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst new file mode 100644 index 0000000000000..a87dddf81dcd5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst @@ -0,0 +1,3 @@ +Updated the Gmane domain from news.gmane.org to news.gmane.io +which is used for examples of :class:`~nntplib.NNTP` news reader server and +nntplib tests. From webhook-mailer at python.org Wed Jan 8 13:28:22 2020 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 08 Jan 2020 18:28:22 -0000 Subject: [Python-checkins] bpo-35292: Avoid calling mimetypes.init when http.server is imported (GH-17822) Message-ID: https://github.com/python/cpython/commit/5907e61a8d4da6d0f11bf1062d6d17484560a15e commit: 5907e61a8d4da6d0f11bf1062d6d17484560a15e branch: master author: An Long committer: Steve Dower date: 2020-01-08T10:28:14-08:00 summary: bpo-35292: Avoid calling mimetypes.init when http.server is imported (GH-17822) files: A Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst M Doc/library/http.server.rst M Lib/http/server.py diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 5173decb2b2ef..478a5b31475cf 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -335,11 +335,14 @@ provides three different variants: .. attribute:: extensions_map - A dictionary mapping suffixes into MIME types. The default is - signified by an empty string, and is considered to be - ``application/octet-stream``. The mapping is used case-insensitively, + A dictionary mapping suffixes into MIME types, contains custom overrides + for the default system mappings. The mapping is used case-insensitively, and so should contain only lower-cased keys. + .. versionchanged:: 3.9 + This dictionary is no longer filled with the default system mappings, + but only contains overrides. + .. attribute:: directory If not specified, the directory to serve is the current working directory. diff --git a/Lib/http/server.py b/Lib/http/server.py index c6e5ed6ea0e00..2d74b95586cff 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -639,6 +639,12 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): """ server_version = "SimpleHTTP/" + __version__ + extensions_map = _encodings_map_default = { + '.gz': 'application/gzip', + '.Z': 'application/octet-stream', + '.bz2': 'application/x-bzip2', + '.xz': 'application/x-xz', + } def __init__(self, *args, directory=None, **kwargs): if directory is None: @@ -866,25 +872,16 @@ def guess_type(self, path): slow) to look inside the data to make a better guess. """ - base, ext = posixpath.splitext(path) if ext in self.extensions_map: return self.extensions_map[ext] ext = ext.lower() if ext in self.extensions_map: return self.extensions_map[ext] - else: - return self.extensions_map[''] - - if not mimetypes.inited: - mimetypes.init() # try to read system mime.types - extensions_map = mimetypes.types_map.copy() - extensions_map.update({ - '': 'application/octet-stream', # Default - '.py': 'text/plain', - '.c': 'text/plain', - '.h': 'text/plain', - }) + guess, _ = mimetypes.guess_type(path) + if guess: + return guess + return 'application/octet-stream' # Utilities for CGIHTTPRequestHandler diff --git a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst new file mode 100644 index 0000000000000..ae52f970d0b71 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst @@ -0,0 +1 @@ +Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so the `mimetypes.init` is called lazily to avoid unnecessary costs when :mod:`http.server` module is imported. \ No newline at end of file From webhook-mailer at python.org Wed Jan 8 15:03:53 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 08 Jan 2020 20:03:53 -0000 Subject: [Python-checkins] Py_DECREF: only pass filename if Py_REF_DEBUG is defined (GH-17870) Message-ID: https://github.com/python/cpython/commit/f3a0a6bbccfcd9d18afe5575617aefaee9fa37a5 commit: f3a0a6bbccfcd9d18afe5575617aefaee9fa37a5 branch: master author: Victor Stinner committer: GitHub date: 2020-01-08T21:03:45+01:00 summary: Py_DECREF: only pass filename if Py_REF_DEBUG is defined (GH-17870) Filename and line numbers are not needed when Py_REF_DEBUG are not defined. The static inline _Py_DECREF() function was introduced by commit 2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12. files: M Include/object.h diff --git a/Include/object.h b/Include/object.h index a9d434b510806..7a5f57357b75f 100644 --- a/Include/object.h +++ b/Include/object.h @@ -461,11 +461,12 @@ static inline void _Py_INCREF(PyObject *op) #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) -static inline void _Py_DECREF(const char *filename, int lineno, - PyObject *op) +static inline void _Py_DECREF( +#ifdef Py_REF_DEBUG + const char *filename, int lineno, +#endif + PyObject *op) { - (void)filename; /* may be unused, shut up -Wunused-parameter */ - (void)lineno; /* may be unused, shut up -Wunused-parameter */ _Py_DEC_REFTOTAL; if (--op->ob_refcnt != 0) { #ifdef Py_REF_DEBUG @@ -479,7 +480,11 @@ static inline void _Py_DECREF(const char *filename, int lineno, } } -#define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +# define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#else +# define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op)) +#endif /* Safely decref `op` and set `op` to NULL, especially useful in tp_clear From webhook-mailer at python.org Wed Jan 8 21:47:02 2020 From: webhook-mailer at python.org (Benjamin Peterson) Date: Thu, 09 Jan 2020 02:47:02 -0000 Subject: [Python-checkins] closes bpo-39261: Remove dead assignment from pyinit_config. (GH-17907) Message-ID: https://github.com/python/cpython/commit/2c7ed417a4c758f1c3f97fcbca70a49f79e58c07 commit: 2c7ed417a4c758f1c3f97fcbca70a49f79e58c07 branch: master author: Alex Henrie committer: Benjamin Peterson date: 2020-01-08T18:46:55-08:00 summary: closes bpo-39261: Remove dead assignment from pyinit_config. (GH-17907) files: M Python/pylifecycle.c diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 94bbbdb560e79..1d9dff4ce80bd 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -749,7 +749,6 @@ pyinit_config(_PyRuntimeState *runtime, if (_PyStatus_EXCEPTION(status)) { return status; } - config = &tstate->interp->config; *tstate_p = tstate; status = pycore_interp_init(tstate); From webhook-mailer at python.org Wed Jan 8 21:48:57 2020 From: webhook-mailer at python.org (Benjamin Peterson) Date: Thu, 09 Jan 2020 02:48:57 -0000 Subject: [Python-checkins] closes bpo-39262: Use specific out-of-memory message in _sharedexception_bind. (GH-17908) Message-ID: https://github.com/python/cpython/commit/5cae042f686cc174e00093944dc118914c874b7c commit: 5cae042f686cc174e00093944dc118914c874b7c branch: master author: Alex Henrie committer: Benjamin Peterson date: 2020-01-08T18:48:52-08:00 summary: closes bpo-39262: Use specific out-of-memory message in _sharedexception_bind. (GH-17908) files: M Modules/_xxsubinterpretersmodule.c diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 4a6ffdd326678..fa20bc5dcec57 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -221,8 +221,9 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) if (err->name == NULL) { if (PyErr_ExceptionMatches(PyExc_MemoryError)) { failure = "out of memory copying exception type name"; + } else { + failure = "unable to encode and copy exception type name"; } - failure = "unable to encode and copy exception type name"; goto finally; } @@ -237,8 +238,9 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) if (err->msg == NULL) { if (PyErr_ExceptionMatches(PyExc_MemoryError)) { failure = "out of memory copying exception message"; + } else { + failure = "unable to encode and copy exception message"; } - failure = "unable to encode and copy exception message"; goto finally; } } From webhook-mailer at python.org Wed Jan 8 22:07:45 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 Jan 2020 03:07:45 -0000 Subject: [Python-checkins] closes bpo-39262: Use specific out-of-memory message in _sharedexception_bind. (GH-17908) Message-ID: https://github.com/python/cpython/commit/45e5750a013291c5729e0ebad2b9e340fdffbd36 commit: 45e5750a013291c5729e0ebad2b9e340fdffbd36 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-08T19:07:38-08:00 summary: closes bpo-39262: Use specific out-of-memory message in _sharedexception_bind. (GH-17908) (cherry picked from commit 5cae042f686cc174e00093944dc118914c874b7c) Co-authored-by: Alex Henrie files: M Modules/_xxsubinterpretersmodule.c diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 7842947e54ac5..db1116ac6e352 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -221,8 +221,9 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) if (err->name == NULL) { if (PyErr_ExceptionMatches(PyExc_MemoryError)) { failure = "out of memory copying exception type name"; + } else { + failure = "unable to encode and copy exception type name"; } - failure = "unable to encode and copy exception type name"; goto finally; } @@ -237,8 +238,9 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) if (err->msg == NULL) { if (PyErr_ExceptionMatches(PyExc_MemoryError)) { failure = "out of memory copying exception message"; + } else { + failure = "unable to encode and copy exception message"; } - failure = "unable to encode and copy exception message"; goto finally; } } From webhook-mailer at python.org Thu Jan 9 01:27:59 2020 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Thu, 09 Jan 2020 06:27:59 -0000 Subject: [Python-checkins] bpo-39271: Remove dead assignment from pattern_subx (GH-17915) Message-ID: https://github.com/python/cpython/commit/1a183faccbe5c32c367dbced721a25c1444dc5c1 commit: 1a183faccbe5c32c367dbced721a25c1444dc5c1 branch: master author: Alex Henrie committer: Serhiy Storchaka date: 2020-01-09T08:27:51+02:00 summary: bpo-39271: Remove dead assignment from pattern_subx (GH-17915) files: M Modules/_sre.c diff --git a/Modules/_sre.c b/Modules/_sre.c index f4f9d01dfccfd..6518e98f04e40 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1002,7 +1002,6 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, int literal; view.buf = NULL; ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view); - b = charsize; if (ptr) { if (charsize == 1) literal = memchr(ptr, '\\', n) == NULL; From webhook-mailer at python.org Thu Jan 9 04:12:33 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 09 Jan 2020 09:12:33 -0000 Subject: [Python-checkins] bpo-39272: Remove dead assignment from _ssl__SSLContext_load_verify_locations_impl (GH-17916) Message-ID: https://github.com/python/cpython/commit/a1c1be24cb3ae25b5b53e9dc94d6327009626283 commit: a1c1be24cb3ae25b5b53e9dc94d6327009626283 branch: master author: Alex Henrie committer: Victor Stinner date: 2020-01-09T10:12:12+01:00 summary: bpo-39272: Remove dead assignment from _ssl__SSLContext_load_verify_locations_impl (GH-17916) files: M Modules/_ssl.c diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 43b236c212120..a0d34b34baadc 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -4223,7 +4223,6 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf); PySSL_END_ALLOW_THREADS if (r != 1) { - ok = 0; if (errno != 0) { ERR_clear_error(); PyErr_SetFromErrno(PyExc_OSError); From webhook-mailer at python.org Thu Jan 9 04:14:16 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 09 Jan 2020 09:14:16 -0000 Subject: [Python-checkins] bpo-39270: Remove dead assignment from config_init_module_search_paths (GH-17914) Message-ID: https://github.com/python/cpython/commit/f3e5e9566989635225d1b91088888074fc260817 commit: f3e5e9566989635225d1b91088888074fc260817 branch: master author: Alex Henrie committer: Victor Stinner date: 2020-01-09T10:14:11+01:00 summary: bpo-39270: Remove dead assignment from config_init_module_search_paths (GH-17914) files: M Python/pathconfig.c diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 6abc648769f71..e37b5612366e4 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -240,9 +240,8 @@ config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) const wchar_t *sys_path = pathconfig->module_search_path; const wchar_t delim = DELIM; - const wchar_t *p = sys_path; while (1) { - p = wcschr(sys_path, delim); + const wchar_t *p = wcschr(sys_path, delim); if (p == NULL) { p = sys_path + wcslen(sys_path); /* End of string */ } From webhook-mailer at python.org Thu Jan 9 07:05:41 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 Jan 2020 12:05:41 -0000 Subject: [Python-checkins] bpo-39161: Document multi-phase init modules under Py_NewInterpreter() (GH-17896) Message-ID: https://github.com/python/cpython/commit/6c5d661342d12f6836580b0e75e3569c764527ae commit: 6c5d661342d12f6836580b0e75e3569c764527ae branch: master author: Petr Viktorin committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-09T04:05:18-08:00 summary: bpo-39161: Document multi-phase init modules under Py_NewInterpreter() (GH-17896) \+ this also adds a stronger warning against sharing objects between (sub-)interpreters. https://bugs.python.org/issue39161 files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 3887937382948..8913dbfe249dc 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1230,15 +1230,31 @@ function. You can create and destroy them using the following functions: single: Py_FinalizeEx() single: Py_Initialize() - Extension modules are shared between (sub-)interpreters as follows: the first - time a particular extension is imported, it is initialized normally, and a - (shallow) copy of its module's dictionary is squirreled away. When the same - extension is imported by another (sub-)interpreter, a new module is initialized - and filled with the contents of this copy; the extension's ``init`` function is - not called. Note that this is different from what happens when an extension is - imported after the interpreter has been completely re-initialized by calling - :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that case, the extension's - ``initmodule`` function *is* called again. + Extension modules are shared between (sub-)interpreters as follows: + + * For modules using multi-phase initialization, + e.g. :c:func:`PyModule_FromDefAndSpec`, a separate module object is + created and initialized for each interpreter. + Only C-level static and global variables are shared between these + module objects. + + * For modules using single-phase initialization, + e.g. :c:func:`PyModule_Create`, the first time a particular extension + is imported, it is initialized normally, and a (shallow) copy of its + module's dictionary is squirreled away. + When the same extension is imported by another (sub-)interpreter, a new + module is initialized and filled with the contents of this copy; the + extension's ``init`` function is not called. + Objects in the module's dictionary thus end up shared across + (sub-)interpreters, which might cause unwanted behavior (see + `Bugs and caveats`_ below). + + Note that this is different from what happens when an extension is + imported after the interpreter has been completely re-initialized by + calling :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that + case, the extension's ``initmodule`` function *is* called again. + As with multi-phase initialization, this means that only C-level static + and global variables are shared between these modules. .. index:: single: close() (in module os) @@ -1264,14 +1280,16 @@ process, the insulation between them isn't perfect --- for example, using low-level file operations like :func:`os.close` they can (accidentally or maliciously) affect each other's open files. Because of the way extensions are shared between (sub-)interpreters, some extensions may not -work properly; this is especially likely when the extension makes use of -(static) global variables, or when the extension manipulates its module's -dictionary after its initialization. It is possible to insert objects created -in one sub-interpreter into a namespace of another sub-interpreter; this should -be done with great care to avoid sharing user-defined functions, methods, -instances or classes between sub-interpreters, since import operations executed -by such objects may affect the wrong (sub-)interpreter's dictionary of loaded -modules. +work properly; this is especially likely when using single-phase initialization +or (static) global variables. +It is possible to insert objects created in one sub-interpreter into +a namespace of another (sub-)interpreter; this should be avoided if possible. + +Special care should be taken to avoid sharing user-defined functions, +methods, instances or classes between sub-interpreters, since import +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 is delicate, because these APIs assume a bijection between Python thread states From webhook-mailer at python.org Thu Jan 9 07:27:43 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 Jan 2020 12:27:43 -0000 Subject: [Python-checkins] bpo-39161: Document multi-phase init modules under Py_NewInterpreter() (GH-17896) Message-ID: https://github.com/python/cpython/commit/20c990229e98ad69c03e44fe61f8dce99b96cf9d commit: 20c990229e98ad69c03e44fe61f8dce99b96cf9d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-09T04:27:35-08:00 summary: bpo-39161: Document multi-phase init modules under Py_NewInterpreter() (GH-17896) \+ this also adds a stronger warning against sharing objects between (sub-)interpreters. https://bugs.python.org/issue39161 (cherry picked from commit 6c5d661342d12f6836580b0e75e3569c764527ae) Co-authored-by: Petr Viktorin files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 81cb4f825fee7..68d892dcae404 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1222,15 +1222,31 @@ function. You can create and destroy them using the following functions: single: Py_FinalizeEx() single: Py_Initialize() - Extension modules are shared between (sub-)interpreters as follows: the first - time a particular extension is imported, it is initialized normally, and a - (shallow) copy of its module's dictionary is squirreled away. When the same - extension is imported by another (sub-)interpreter, a new module is initialized - and filled with the contents of this copy; the extension's ``init`` function is - not called. Note that this is different from what happens when an extension is - imported after the interpreter has been completely re-initialized by calling - :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that case, the extension's - ``initmodule`` function *is* called again. + Extension modules are shared between (sub-)interpreters as follows: + + * For modules using multi-phase initialization, + e.g. :c:func:`PyModule_FromDefAndSpec`, a separate module object is + created and initialized for each interpreter. + Only C-level static and global variables are shared between these + module objects. + + * For modules using single-phase initialization, + e.g. :c:func:`PyModule_Create`, the first time a particular extension + is imported, it is initialized normally, and a (shallow) copy of its + module's dictionary is squirreled away. + When the same extension is imported by another (sub-)interpreter, a new + module is initialized and filled with the contents of this copy; the + extension's ``init`` function is not called. + Objects in the module's dictionary thus end up shared across + (sub-)interpreters, which might cause unwanted behavior (see + `Bugs and caveats`_ below). + + Note that this is different from what happens when an extension is + imported after the interpreter has been completely re-initialized by + calling :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that + case, the extension's ``initmodule`` function *is* called again. + As with multi-phase initialization, this means that only C-level static + and global variables are shared between these modules. .. index:: single: close() (in module os) @@ -1256,14 +1272,16 @@ process, the insulation between them isn't perfect --- for example, using low-level file operations like :func:`os.close` they can (accidentally or maliciously) affect each other's open files. Because of the way extensions are shared between (sub-)interpreters, some extensions may not -work properly; this is especially likely when the extension makes use of -(static) global variables, or when the extension manipulates its module's -dictionary after its initialization. It is possible to insert objects created -in one sub-interpreter into a namespace of another sub-interpreter; this should -be done with great care to avoid sharing user-defined functions, methods, -instances or classes between sub-interpreters, since import operations executed -by such objects may affect the wrong (sub-)interpreter's dictionary of loaded -modules. +work properly; this is especially likely when using single-phase initialization +or (static) global variables. +It is possible to insert objects created in one sub-interpreter into +a namespace of another (sub-)interpreter; this should be avoided if possible. + +Special care should be taken to avoid sharing user-defined functions, +methods, instances or classes between sub-interpreters, since import +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 is delicate, because these APIs assume a bijection between Python thread states From webhook-mailer at python.org Thu Jan 9 08:42:01 2020 From: webhook-mailer at python.org (Eric V. Smith) Date: Thu, 09 Jan 2020 13:42:01 -0000 Subject: [Python-checkins] Add test cases for dataclasses. (#17909) Message-ID: https://github.com/python/cpython/commit/eef1b027ab70704bcaa60a089e4ae1592c504b86 commit: eef1b027ab70704bcaa60a089e4ae1592c504b86 branch: master author: Karthikeyan Singaravelan committer: Eric V. Smith date: 2020-01-09T08:41:46-05:00 summary: Add test cases for dataclasses. (#17909) * Add test cases for dataclasses. * Add test for repr output of field. * Add test for ValueError to be raised when both default and default_factory are passed. files: M Lib/test/test_dataclasses.py diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 8f9fb2ce8c169..e8fe455fc19b4 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -45,6 +45,25 @@ class C: o = C(42) self.assertEqual(o.x, 42) + def test_field_default_default_factory_error(self): + msg = "cannot specify both default and default_factory" + with self.assertRaisesRegex(ValueError, msg): + @dataclass + class C: + x: int = field(default=1, default_factory=int) + + def test_field_repr(self): + int_field = field(default=1, init=True, repr=False) + int_field.name = "id" + repr_output = repr(int_field) + expected_output = "Field(name='id',type=None," \ + f"default=1,default_factory={MISSING!r}," \ + "init=True,repr=False,hash=None," \ + "compare=True,metadata=mappingproxy({})," \ + "_field_type=None)" + + self.assertEqual(repr_output, expected_output) + def test_named_init_params(self): @dataclass class C: From webhook-mailer at python.org Thu Jan 9 12:00:48 2020 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 09 Jan 2020 17:00:48 -0000 Subject: [Python-checkins] bpo-25172: Reduce scope of crypt import tests (GH-17881) Message-ID: https://github.com/python/cpython/commit/ed367815eeb9329c48a86a8a7fa3186e27a10f2c commit: ed367815eeb9329c48a86a8a7fa3186e27a10f2c branch: master author: Steve Dower committer: GitHub date: 2020-01-09T09:00:29-08:00 summary: bpo-25172: Reduce scope of crypt import tests (GH-17881) files: M Lib/test/test_crypt.py diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py index d29e005fdad50..5dc83b4ecbfa0 100644 --- a/Lib/test/test_crypt.py +++ b/Lib/test/test_crypt.py @@ -6,20 +6,21 @@ import crypt IMPORT_ERROR = None except ImportError as ex: + if sys.platform != 'win32': + raise unittest.SkipTest(str(ex)) crypt = None IMPORT_ERROR = str(ex) - at unittest.skipIf(crypt, 'This should only run on windows') + at unittest.skipUnless(sys.platform == 'win32', 'This should only run on windows') + at unittest.skipIf(crypt, 'import succeeded') class TestWhyCryptDidNotImport(unittest.TestCase): - def test_failure_only_for_windows(self): - self.assertEqual(sys.platform, 'win32') def test_import_failure_message(self): self.assertIn('not supported', IMPORT_ERROR) - at unittest.skipUnless(crypt, 'Not supported on Windows') + at unittest.skipUnless(crypt, 'crypt module is required') class CryptTestCase(unittest.TestCase): def test_crypt(self): From webhook-mailer at python.org Thu Jan 9 12:07:37 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Thu, 09 Jan 2020 17:07:37 -0000 Subject: [Python-checkins] Fix typo in test's docstring (GH-17856) Message-ID: https://github.com/python/cpython/commit/2f65aa465865930f8364645b1466d2751c4086d3 commit: 2f65aa465865930f8364645b1466d2751c4086d3 branch: master author: Daniel Hahler committer: Karthikeyan Singaravelan date: 2020-01-09T22:37:32+05:30 summary: Fix typo in test's docstring (GH-17856) * Fix typo in test's docstring. contination -> continuation. files: M Lib/test/test_eof.py diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index a091ceaa25bc4..9ef8eb1187486 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -27,7 +27,7 @@ def test_EOFS(self): raise support.TestFailed def test_line_continuation_EOF(self): - """A contination at the end of input must be an error; bpo2180.""" + """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (, line 1)' with self.assertRaises(SyntaxError) as excinfo: exec('x = 5\\') From webhook-mailer at python.org Thu Jan 9 12:20:07 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 Jan 2020 17:20:07 -0000 Subject: [Python-checkins] bpo-25172: Reduce scope of crypt import tests (GH-17881) Message-ID: https://github.com/python/cpython/commit/8c08518c255747a06d00479f21087f0c934d0ad6 commit: 8c08518c255747a06d00479f21087f0c934d0ad6 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-09T09:19:59-08:00 summary: bpo-25172: Reduce scope of crypt import tests (GH-17881) (cherry picked from commit ed367815eeb9329c48a86a8a7fa3186e27a10f2c) Co-authored-by: Steve Dower files: M Lib/test/test_crypt.py diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py index d29e005fdad50..5dc83b4ecbfa0 100644 --- a/Lib/test/test_crypt.py +++ b/Lib/test/test_crypt.py @@ -6,20 +6,21 @@ import crypt IMPORT_ERROR = None except ImportError as ex: + if sys.platform != 'win32': + raise unittest.SkipTest(str(ex)) crypt = None IMPORT_ERROR = str(ex) - at unittest.skipIf(crypt, 'This should only run on windows') + at unittest.skipUnless(sys.platform == 'win32', 'This should only run on windows') + at unittest.skipIf(crypt, 'import succeeded') class TestWhyCryptDidNotImport(unittest.TestCase): - def test_failure_only_for_windows(self): - self.assertEqual(sys.platform, 'win32') def test_import_failure_message(self): self.assertIn('not supported', IMPORT_ERROR) - at unittest.skipUnless(crypt, 'Not supported on Windows') + at unittest.skipUnless(crypt, 'crypt module is required') class CryptTestCase(unittest.TestCase): def test_crypt(self): From webhook-mailer at python.org Thu Jan 9 12:33:09 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Thu, 09 Jan 2020 17:33:09 -0000 Subject: [Python-checkins] Fix typo in test's docstring (GH-17856) (GH-17923) Message-ID: https://github.com/python/cpython/commit/e47a7e3a7ab2cfb321e5f276028be286f30bd057 commit: e47a7e3a7ab2cfb321e5f276028be286f30bd057 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Karthikeyan Singaravelan date: 2020-01-09T23:03:05+05:30 summary: Fix typo in test's docstring (GH-17856) (GH-17923) * Fix typo in test's docstring. contination -> continuation. (cherry picked from commit 2f65aa465865930f8364645b1466d2751c4086d3) Co-authored-by: Daniel Hahler Co-authored-by: Daniel Hahler files: M Lib/test/test_eof.py diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index a091ceaa25bc4..9ef8eb1187486 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -27,7 +27,7 @@ def test_EOFS(self): raise support.TestFailed def test_line_continuation_EOF(self): - """A contination at the end of input must be an error; bpo2180.""" + """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (, line 1)' with self.assertRaises(SyntaxError) as excinfo: exec('x = 5\\') From webhook-mailer at python.org Thu Jan 9 14:18:55 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 Jan 2020 19:18:55 -0000 Subject: [Python-checkins] bpo-39235: Fix end location for genexp in call args (GH-17925) Message-ID: https://github.com/python/cpython/commit/a796d8ef9dd1af65f7e4d7a857b56f35b7cb6e78 commit: a796d8ef9dd1af65f7e4d7a857b56f35b7cb6e78 branch: master author: Guido van Rossum committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-09T11:18:47-08:00 summary: bpo-39235: Fix end location for genexp in call args (GH-17925) The fix changes copy_location() to require an extra node from which to extract the end location, and fixing all 5 call sites. https://bugs.python.org/issue39235 files: A Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst M Python/ast.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst new file mode 100644 index 0000000000000..5fb0d45356bad --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst @@ -0,0 +1,2 @@ +Fix AST end location for lone generator expression in function call, e.g. +f(i for i in a). diff --git a/Python/ast.c b/Python/ast.c index d5113f8e413f4..9c48d71d154fc 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1028,13 +1028,13 @@ forbidden_name(struct compiling *c, identifier name, const node *n, } static expr_ty -copy_location(expr_ty e, const node *n) +copy_location(expr_ty e, const node *n, const node *end) { if (e) { e->lineno = LINENO(n); e->col_offset = n->n_col_offset; - e->end_lineno = n->n_end_lineno; - e->end_col_offset = n->n_end_col_offset; + e->end_lineno = end->n_end_lineno; + e->end_col_offset = end->n_end_col_offset; } return e; } @@ -2464,10 +2464,10 @@ ast_for_atom(struct compiling *c, const node *n) } if (TYPE(CHILD(ch, 1)) == comp_for) { - return copy_location(ast_for_genexp(c, ch), n); + return copy_location(ast_for_genexp(c, ch), n, n); } else { - return copy_location(ast_for_testlist(c, ch), n); + return copy_location(ast_for_testlist(c, ch), n, n); } case LSQB: /* list (or list comprehension) */ ch = CHILD(n, 1); @@ -2486,7 +2486,7 @@ ast_for_atom(struct compiling *c, const node *n) n->n_end_lineno, n->n_end_col_offset, c->c_arena); } else { - return copy_location(ast_for_listcomp(c, ch), n); + return copy_location(ast_for_listcomp(c, ch), n, n); } case LBRACE: { /* dictorsetmaker: ( ((test ':' test | '**' test) @@ -2527,7 +2527,7 @@ ast_for_atom(struct compiling *c, const node *n) /* It's a dictionary display. */ res = ast_for_dictdisplay(c, ch); } - return copy_location(res, n); + return copy_location(res, n, n); } } default: @@ -3146,7 +3146,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, } else if (TYPE(CHILD(ch, 1)) == comp_for) { /* the lone generator expression */ - e = copy_location(ast_for_genexp(c, ch), maybegenbeg); + e = copy_location(ast_for_genexp(c, ch), maybegenbeg, closepar); if (!e) return NULL; asdl_seq_SET(args, nargs++, e); From webhook-mailer at python.org Thu Jan 9 14:39:10 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 09 Jan 2020 19:39:10 -0000 Subject: [Python-checkins] bpo-39235: Fix end location for genexp in call args (GH-17925) Message-ID: https://github.com/python/cpython/commit/33e033da3c1472b0aa2ae3cff06649a1ae4aa37f commit: 33e033da3c1472b0aa2ae3cff06649a1ae4aa37f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-09T11:39:00-08:00 summary: bpo-39235: Fix end location for genexp in call args (GH-17925) The fix changes copy_location() to require an extra node from which to extract the end location, and fixing all 5 call sites. https://bugs.python.org/issue39235 (cherry picked from commit a796d8ef9dd1af65f7e4d7a857b56f35b7cb6e78) Co-authored-by: Guido van Rossum files: A Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst M Python/ast.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst new file mode 100644 index 0000000000000..5fb0d45356bad --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst @@ -0,0 +1,2 @@ +Fix AST end location for lone generator expression in function call, e.g. +f(i for i in a). diff --git a/Python/ast.c b/Python/ast.c index 6cf71ce7bb810..f3263c1e3fcdc 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1028,13 +1028,13 @@ forbidden_name(struct compiling *c, identifier name, const node *n, } static expr_ty -copy_location(expr_ty e, const node *n) +copy_location(expr_ty e, const node *n, const node *end) { if (e) { e->lineno = LINENO(n); e->col_offset = n->n_col_offset; - e->end_lineno = n->n_end_lineno; - e->end_col_offset = n->n_end_col_offset; + e->end_lineno = end->n_end_lineno; + e->end_col_offset = end->n_end_col_offset; } return e; } @@ -2464,10 +2464,10 @@ ast_for_atom(struct compiling *c, const node *n) } if (TYPE(CHILD(ch, 1)) == comp_for) { - return copy_location(ast_for_genexp(c, ch), n); + return copy_location(ast_for_genexp(c, ch), n, n); } else { - return copy_location(ast_for_testlist(c, ch), n); + return copy_location(ast_for_testlist(c, ch), n, n); } case LSQB: /* list (or list comprehension) */ ch = CHILD(n, 1); @@ -2486,7 +2486,7 @@ ast_for_atom(struct compiling *c, const node *n) n->n_end_lineno, n->n_end_col_offset, c->c_arena); } else { - return copy_location(ast_for_listcomp(c, ch), n); + return copy_location(ast_for_listcomp(c, ch), n, n); } case LBRACE: { /* dictorsetmaker: ( ((test ':' test | '**' test) @@ -2527,7 +2527,7 @@ ast_for_atom(struct compiling *c, const node *n) /* It's a dictionary display. */ res = ast_for_dictdisplay(c, ch); } - return copy_location(res, n); + return copy_location(res, n, n); } } default: @@ -3146,7 +3146,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, } else if (TYPE(CHILD(ch, 1)) == comp_for) { /* the lone generator expression */ - e = copy_location(ast_for_genexp(c, ch), maybegenbeg); + e = copy_location(ast_for_genexp(c, ch), maybegenbeg, closepar); if (!e) return NULL; asdl_seq_SET(args, nargs++, e); From webhook-mailer at python.org Fri Jan 10 03:13:22 2020 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Fri, 10 Jan 2020 08:13:22 -0000 Subject: [Python-checkins] bpo-39235: Check end_lineno and end_col_offset of AST nodes. (GH-17926) Message-ID: https://github.com/python/cpython/commit/850a8856e120f8cba15e557a0e791f93b43d6989 commit: 850a8856e120f8cba15e557a0e791f93b43d6989 branch: master author: Serhiy Storchaka committer: GitHub date: 2020-01-10T10:12:55+02:00 summary: bpo-39235: Check end_lineno and end_col_offset of AST nodes. (GH-17926) files: M Lib/test/test_ast.py diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 55b91cfa23bec..aa0d214b8a606 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -17,6 +17,8 @@ def to_tuple(t): result = [t.__class__.__name__] if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): result.append((t.lineno, t.col_offset)) + if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'): + result[-1] += (t.end_lineno, t.end_col_offset) if t._fields is None: return tuple(result) for f in t._fields: @@ -1846,111 +1848,111 @@ def main(): #### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### exec_results = [ -('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None), ('arg', (1, 9), 'b', None, None), ('arg', (1, 14), 'c', None, None), ('arg', (1, 22), 'd', None, None), ('arg', (1, 28), 'e', None, None)], ('arg', (1, 35), 'args', None, None), [('arg', (1, 41), 'f', None, None)], [('Constant', (1, 43), 42, None)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1, None), ('Constant', (1, 16), None, None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()', None))], [], None, None)], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1, None))], [], None, None)], []), -('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []), -('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []), -('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))], None)], []), -('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string', None)], []), None)], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []), -('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []), -('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []), -('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []), -('Module', [('Global', (1, 0), ['v'])], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []), -('Module', [('Pass', (1, 0))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function', None)), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1, None))], [('Expr', (3, 7), ('Constant', (3, 7), 2, None))], None)], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1, None))], None)], [], None, None)], []), -('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2, None)], [('Dict', (1, 3), [('Constant', (1, 4), 1, None)], [('Constant', (1, 6), 2, None)]), ('Constant', (1, 12), 3, None)]))], []), -('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []), -('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []), -('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []), +('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []), +('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None)], []), +('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None)], []), +('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []), +('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []), +('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []), +('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []), +('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []), +('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []), +('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []), +('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []), +('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []), +('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []), +('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []), +('Module', [('Import', (1, 0, 1, 10), [('alias', 'sys', None)])], []), +('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', 'v', None)], 0)], []), +('Module', [('Global', (1, 0, 1, 8), ['v'])], []), +('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []), +('Module', [('Pass', (1, 0, 1, 4))], []), +('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []), +('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []), +('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []), +('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None)], []), +('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])])], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None)], []), +('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None)], []), ] single_results = [ -('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), +('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]), ] eval_results = [ -('Expression', ('Constant', (1, 0), None, None)), -('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])), -('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))), -('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))), -('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))), -('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])), -('Expression', ('Dict', (1, 0), [], [])), -('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])), -('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])), -('Expression', ('ListComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Starred', (1, 2), ('List', (1, 3), [('Constant', (1, 4), 0, None), ('Constant', (1, 7), 1, None)], ('Load',)), ('Load',))], [])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('GeneratorExp', (1, 1), ('Name', (1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 8), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Load',)), [], 0)])], [])), -('Expression', ('Constant', (1, 0), 10, None)), -('Expression', ('Constant', (1, 0), 'string', None)), -('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))), -('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))), -('Expression', ('Name', (1, 0), 'v', ('Load',))), -('Expression', ('List', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('List', (1, 0), [], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [], ('Load',))), -('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12), 1, None), ('Constant', (1, 14), 2, None), None), ('Load',))], [])), +('Expression', ('Constant', (1, 0, 1, 4), None, None)), +('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])), +('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))), +('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))), +('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))), +('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])), +('Expression', ('Dict', (1, 0, 1, 2), [], [])), +('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])), +('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])), +('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])), +('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])), +('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])), +('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])), +('Expression', ('Constant', (1, 0, 1, 2), 10, None)), +('Expression', ('Constant', (1, 0, 1, 8), 'string', None)), +('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))), +('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))), +('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))), +('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('List', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])), ] main() From webhook-mailer at python.org Fri Jan 10 04:24:30 2020 From: webhook-mailer at python.org (Mark Shannon) Date: Fri, 10 Jan 2020 09:24:30 -0000 Subject: [Python-checkins] bpo-39166: Fix trace of last iteration of async for loops (#17800) Message-ID: https://github.com/python/cpython/commit/4c53e63cc966f98e141a09bc435b9f9c713b152d commit: 4c53e63cc966f98e141a09bc435b9f9c713b152d branch: master author: Pablo Galindo committer: Mark Shannon date: 2020-01-10T09:24:22Z summary: bpo-39166: Fix trace of last iteration of async for loops (#17800) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst M Lib/test/test_sys_settrace.py M Python/ceval.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index a0d1122fad83b..bead57c44b47e 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -526,6 +526,82 @@ def func(): (7, 'line'), (7, 'return')]) + def test_20_async_for_loop(self): + class AsyncIteratorWrapper: + def __init__(self, obj): + self._it = iter(obj) + + def __aiter__(self): + return self + + async def __anext__(self): + try: + return next(self._it) + except StopIteration: + raise StopAsyncIteration + + async def doit_async(): + async for letter in AsyncIteratorWrapper("abc"): + x = letter + y = 42 + + def run(tracer): + x = doit_async() + try: + sys.settrace(tracer) + x.send(None) + finally: + sys.settrace(None) + + tracer = self.make_tracer() + events = [ + (0, 'call'), + (1, 'line'), + (-12, 'call'), + (-11, 'line'), + (-11, 'return'), + (-9, 'call'), + (-8, 'line'), + (-8, 'return'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'exception'), + (-3, 'line'), + (-2, 'line'), + (-2, 'exception'), + (-2, 'return'), + (1, 'exception'), + (3, 'line'), + (3, 'return')] + try: + run(tracer.trace) + except Exception: + pass + self.compare_events(doit_async.__code__.co_firstlineno, + tracer.events, events) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst new file mode 100644 index 0000000000000..4737e9c4d2ee7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst @@ -0,0 +1,2 @@ +Fix incorrect line execution reporting in trace functions when tracing the +last iteration of asynchronous for loops. Patch by Pablo Galindo. diff --git a/Python/ceval.c b/Python/ceval.c index bd9454b2812dd..3bbd0ca9667b0 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3610,11 +3610,15 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PUSH(val); PUSH(exc); JUMPTO(handler); - if (_Py_TracingPossible(ceval) && - ((f->f_lasti < instr_lb || f->f_lasti >= instr_ub) || - !(f->f_lasti == instr_lb || f->f_lasti < instr_prev))) { - /* Make sure that we trace line after exception */ - instr_prev = INT_MAX; + if (_Py_TracingPossible(ceval)) { + int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub); + int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev); + /* Make sure that we trace line after exception if we are in a new execution + * window or we don't need a line update and we are not in the first instruction + * of the line. */ + if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) { + instr_prev = INT_MAX; + } } /* Resume normal execution */ goto main_loop; From webhook-mailer at python.org Fri Jan 10 07:12:13 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 10 Jan 2020 12:12:13 -0000 Subject: [Python-checkins] [3.8] Add test cases for dataclasses. (GH-17909) (GH-17919) Message-ID: https://github.com/python/cpython/commit/df2fb60cf79bf95497cc15a74d657a3a54a53057 commit: df2fb60cf79bf95497cc15a74d657a3a54a53057 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-10T04:12:08-08:00 summary: [3.8] Add test cases for dataclasses. (GH-17909) (GH-17919) * Add test cases for dataclasses. * Add test for repr output of field. * Add test for ValueError to be raised when both default and default_factory are passed. (cherry picked from commit eef1b027ab70704bcaa60a089e4ae1592c504b86) Co-authored-by: Karthikeyan Singaravelan Automerge-Triggered-By: @ericvsmith files: M Lib/test/test_dataclasses.py diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 2f3c531fc208a..21a7d7ec3fe39 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -45,6 +45,25 @@ class C: o = C(42) self.assertEqual(o.x, 42) + def test_field_default_default_factory_error(self): + msg = "cannot specify both default and default_factory" + with self.assertRaisesRegex(ValueError, msg): + @dataclass + class C: + x: int = field(default=1, default_factory=int) + + def test_field_repr(self): + int_field = field(default=1, init=True, repr=False) + int_field.name = "id" + repr_output = repr(int_field) + expected_output = "Field(name='id',type=None," \ + f"default=1,default_factory={MISSING!r}," \ + "init=True,repr=False,hash=None," \ + "compare=True,metadata=mappingproxy({})," \ + "_field_type=None)" + + self.assertEqual(repr_output, expected_output) + def test_named_init_params(self): @dataclass class C: From webhook-mailer at python.org Fri Jan 10 07:12:35 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 10 Jan 2020 12:12:35 -0000 Subject: [Python-checkins] [3.7] Add test cases for dataclasses. (GH-17909) (GH-17920) Message-ID: https://github.com/python/cpython/commit/a993658f94a8bc894cfe44fd67eee26c06b4bf8f commit: a993658f94a8bc894cfe44fd67eee26c06b4bf8f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-10T04:12:30-08:00 summary: [3.7] Add test cases for dataclasses. (GH-17909) (GH-17920) * Add test cases for dataclasses. * Add test for repr output of field. * Add test for ValueError to be raised when both default and default_factory are passed. (cherry picked from commit eef1b027ab70704bcaa60a089e4ae1592c504b86) Co-authored-by: Karthikeyan Singaravelan Automerge-Triggered-By: @ericvsmith files: M Lib/test/test_dataclasses.py diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 284484547c814..48f48971b3431 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -45,6 +45,25 @@ class C: o = C(42) self.assertEqual(o.x, 42) + def test_field_default_default_factory_error(self): + msg = "cannot specify both default and default_factory" + with self.assertRaisesRegex(ValueError, msg): + @dataclass + class C: + x: int = field(default=1, default_factory=int) + + def test_field_repr(self): + int_field = field(default=1, init=True, repr=False) + int_field.name = "id" + repr_output = repr(int_field) + expected_output = "Field(name='id',type=None," \ + f"default=1,default_factory={MISSING!r}," \ + "init=True,repr=False,hash=None," \ + "compare=True,metadata=mappingproxy({})," \ + "_field_type=None)" + + self.assertEqual(repr_output, expected_output) + def test_named_init_params(self): @dataclass class C: From webhook-mailer at python.org Fri Jan 10 09:34:12 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 10 Jan 2020 14:34:12 -0000 Subject: [Python-checkins] bpo-39259: poplib now rejects timeout = 0 (GH-17912) Message-ID: https://github.com/python/cpython/commit/c39b52f1527868c7ada9385669c38edf98858921 commit: c39b52f1527868c7ada9385669c38edf98858921 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-10T15:34:05+01:00 summary: bpo-39259: poplib now rejects timeout = 0 (GH-17912) poplib.POP3 and poplib.POP3_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. files: A Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst M Doc/library/poplib.rst M Doc/whatsnew/3.9.rst M Lib/poplib.py M Lib/test/test_poplib.py diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst index 28b42fa60c185..2f349b35b7e0f 100644 --- a/Doc/library/poplib.rst +++ b/Doc/library/poplib.rst @@ -47,6 +47,9 @@ The :mod:`poplib` module provides two classes: ``poplib.putline`` with arguments ``self`` and ``line``, where ``line`` is the bytes about to be sent to the remote host. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. .. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None) @@ -85,6 +88,10 @@ The :mod:`poplib` module provides two classes: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + One exception is defined as an attribute of the :mod:`poplib` module: @@ -268,4 +275,3 @@ retrieves and prints all messages:: At the end of the module, there is a test section that contains a more extensive example of usage. - diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ea6d8f515a944..3320b7cff42db 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -187,6 +187,13 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. +poplib +------ + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + threading --------- diff --git a/Lib/poplib.py b/Lib/poplib.py index 0b6750d230376..0f8587317c2bb 100644 --- a/Lib/poplib.py +++ b/Lib/poplib.py @@ -107,6 +107,8 @@ def __init__(self, host, port=POP3_PORT, self.welcome = self._getresp() def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') return socket.create_connection((self.host, self.port), timeout) def _putline(self, line): diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 911cba1f1dcd4..7f06d1950e1e1 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -481,7 +481,7 @@ def setUp(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(60) # Safety net. Look issue 11812 self.port = test_support.bind_port(self.sock) - self.thread = threading.Thread(target=self.server, args=(self.evt,self.sock)) + self.thread = threading.Thread(target=self.server, args=(self.evt, self.sock)) self.thread.daemon = True self.thread.start() self.evt.wait() @@ -505,12 +505,12 @@ def server(self, evt, serv): def testTimeoutDefault(self): self.assertIsNone(socket.getdefaulttimeout()) - socket.setdefaulttimeout(30) + socket.setdefaulttimeout(test_support.LOOPBACK_TIMEOUT) try: pop = poplib.POP3(HOST, self.port) finally: socket.setdefaulttimeout(None) - self.assertEqual(pop.sock.gettimeout(), 30) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() def testTimeoutNone(self): @@ -524,9 +524,11 @@ def testTimeoutNone(self): pop.close() def testTimeoutValue(self): - pop = poplib.POP3(HOST, self.port, timeout=30) - self.assertEqual(pop.sock.gettimeout(), 30) + pop = poplib.POP3(HOST, self.port, timeout=test_support.LOOPBACK_TIMEOUT) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() + with self.assertRaises(ValueError): + poplib.POP3(HOST, self.port, timeout=0) def test_main(): diff --git a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst new file mode 100644 index 0000000000000..c7ef8be7e3adb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst @@ -0,0 +1,3 @@ +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From webhook-mailer at python.org Fri Jan 10 11:31:52 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 10 Jan 2020 16:31:52 -0000 Subject: [Python-checkins] bpo-39200: Correct the error message for min/max builtin function (GH-17814) Message-ID: https://github.com/python/cpython/commit/abdc634f337ce4943cd7d13587936837aac2ecc9 commit: abdc634f337ce4943cd7d13587936837aac2ecc9 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-10T17:31:43+01:00 summary: bpo-39200: Correct the error message for min/max builtin function (GH-17814) Correct the error message when calling the min() or max() with no arguments. files: A Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst M Lib/test/test_builtin.py M Python/bltinmodule.c diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 6a88454289d34..5c553a92b973c 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -949,7 +949,12 @@ def test_max(self): self.assertEqual(max(1, 2.0, 3), 3) self.assertEqual(max(1.0, 2, 3), 3) - self.assertRaises(TypeError, max) + with self.assertRaisesRegex( + TypeError, + 'max expected at least 1 argument, got 0' + ): + max() + self.assertRaises(TypeError, max, 42) self.assertRaises(ValueError, max, ()) class BadSeq: @@ -1003,7 +1008,12 @@ def test_min(self): self.assertEqual(min(1, 2.0, 3), 1) self.assertEqual(min(1.0, 2, 3), 1.0) - self.assertRaises(TypeError, min) + with self.assertRaisesRegex( + TypeError, + 'min expected at least 1 argument, got 0' + ): + min() + self.assertRaises(TypeError, min, 42) self.assertRaises(ValueError, min, ()) class BadSeq: diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst new file mode 100644 index 0000000000000..71e4072099245 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst @@ -0,0 +1,2 @@ +Correct the error message when calling the :func:`min` or :func:`max` with +no arguments. Patch by Dong-hee Na. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 34267685be2f1..4f833c1f46253 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1589,10 +1589,15 @@ min_max(PyObject *args, PyObject *kwds, int op) const int positional = PyTuple_Size(args) > 1; int ret; - if (positional) + if (positional) { v = args; - else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) + } + else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) { + if (PyExceptionClass_Check(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, "%s expected at least 1 argument, got 0", name); + } return NULL; + } emptytuple = PyTuple_New(0); if (emptytuple == NULL) From webhook-mailer at python.org Fri Jan 10 14:37:55 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Fri, 10 Jan 2020 19:37:55 -0000 Subject: [Python-checkins] bpo-39292: Add missing syslog facility codes. (GH-17945) Message-ID: https://github.com/python/cpython/commit/ce54519aa09772f4173b8c17410ed77e403f3ebf commit: ce54519aa09772f4173b8c17410ed77e403f3ebf branch: master author: Vinay Sajip committer: GitHub date: 2020-01-10T19:37:48Z summary: bpo-39292: Add missing syslog facility codes. (GH-17945) files: M Lib/logging/handlers.py diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index ea14541e1e500..047798f6dc145 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -742,6 +742,10 @@ class SysLogHandler(logging.Handler): LOG_CRON = 9 # clock daemon LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_FTP = 11 # FTP daemon + LOG_NTP = 12 # NTP subsystem + LOG_SECURITY = 13 # Log audit + LOG_CONSOLE = 14 # Log alert + LOG_SOLCRON = 15 # Scheduling daemon (Solaris) # other codes through 15 reserved for system use LOG_LOCAL0 = 16 # reserved for local use @@ -769,27 +773,30 @@ class SysLogHandler(logging.Handler): } facility_names = { - "auth": LOG_AUTH, - "authpriv": LOG_AUTHPRIV, - "cron": LOG_CRON, - "daemon": LOG_DAEMON, - "ftp": LOG_FTP, - "kern": LOG_KERN, - "lpr": LOG_LPR, - "mail": LOG_MAIL, - "news": LOG_NEWS, - "security": LOG_AUTH, # DEPRECATED - "syslog": LOG_SYSLOG, - "user": LOG_USER, - "uucp": LOG_UUCP, - "local0": LOG_LOCAL0, - "local1": LOG_LOCAL1, - "local2": LOG_LOCAL2, - "local3": LOG_LOCAL3, - "local4": LOG_LOCAL4, - "local5": LOG_LOCAL5, - "local6": LOG_LOCAL6, - "local7": LOG_LOCAL7, + "auth": LOG_AUTH, + "authpriv": LOG_AUTHPRIV, + "console": LOG_CONSOLE, + "cron": LOG_CRON, + "daemon": LOG_DAEMON, + "ftp": LOG_FTP, + "kern": LOG_KERN, + "lpr": LOG_LPR, + "mail": LOG_MAIL, + "news": LOG_NEWS, + "ntp": LOG_NTP, + "security": LOG_SECURITY, + "solaris-cron": LOG_SOLCRON, + "syslog": LOG_SYSLOG, + "user": LOG_USER, + "uucp": LOG_UUCP, + "local0": LOG_LOCAL0, + "local1": LOG_LOCAL1, + "local2": LOG_LOCAL2, + "local3": LOG_LOCAL3, + "local4": LOG_LOCAL4, + "local5": LOG_LOCAL5, + "local6": LOG_LOCAL6, + "local7": LOG_LOCAL7, } #The map below appears to be trivially lowercasing the key. However, From webhook-mailer at python.org Sat Jan 11 00:16:38 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Sat, 11 Jan 2020 05:16:38 -0000 Subject: [Python-checkins] Fix host in address of socket.create_server example. (GH-17706) Message-ID: https://github.com/python/cpython/commit/43682f1e39a3c61f0e8a638b887bcdcbfef766c5 commit: 43682f1e39a3c61f0e8a638b887bcdcbfef766c5 branch: master author: Karthikeyan Singaravelan committer: GitHub date: 2020-01-11T10:46:30+05:30 summary: Fix host in address of socket.create_server example. (GH-17706) Host as None in address raises TypeError since it should be string, bytes or bytearray. files: M Lib/socket.py diff --git a/Lib/socket.py b/Lib/socket.py index 374f1124bf7e8..cafa573a30c05 100755 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -878,7 +878,7 @@ def create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, connections. When false it will explicitly disable this option on platforms that enable it by default (e.g. Linux). - >>> with create_server((None, 8000)) as server: + >>> with create_server(('', 8000)) as server: ... while True: ... conn, addr = server.accept() ... # handle new connection From webhook-mailer at python.org Sat Jan 11 00:39:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 11 Jan 2020 05:39:05 -0000 Subject: [Python-checkins] Fix host in address of socket.create_server example. (GH-17706) Message-ID: https://github.com/python/cpython/commit/0f40482fde59ff307569fa5676183dd8432809a8 commit: 0f40482fde59ff307569fa5676183dd8432809a8 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-10T21:39:01-08:00 summary: Fix host in address of socket.create_server example. (GH-17706) Host as None in address raises TypeError since it should be string, bytes or bytearray. (cherry picked from commit 43682f1e39a3c61f0e8a638b887bcdcbfef766c5) Co-authored-by: Karthikeyan Singaravelan files: M Lib/socket.py diff --git a/Lib/socket.py b/Lib/socket.py index 5b17906ef479a..f83f36d0ada55 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -843,7 +843,7 @@ def create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, connections. When false it will explicitly disable this option on platforms that enable it by default (e.g. Linux). - >>> with create_server((None, 8000)) as server: + >>> with create_server(('', 8000)) as server: ... while True: ... conn, addr = server.accept() ... # handle new connection From webhook-mailer at python.org Sat Jan 11 10:07:59 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 11 Jan 2020 15:07:59 -0000 Subject: [Python-checkins] bpo-39259: nntplib.NNTP/NNTP_SSL refactoring (GH-17939) Message-ID: https://github.com/python/cpython/commit/5d978a2e73e9ad934bcd260ae0a0db5cd0ca27d0 commit: 5d978a2e73e9ad934bcd260ae0a0db5cd0ca27d0 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-11T16:07:36+01:00 summary: bpo-39259: nntplib.NNTP/NNTP_SSL refactoring (GH-17939) files: M Lib/nntplib.py diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 9036f361b5fb6..0ab51853b52fd 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1042,13 +1042,11 @@ def __init__(self, host, port=NNTP_PORT, user=None, password=None, """ self.host = host self.port = port - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) + self.sock = self._create_socket(timeout) file = None try: file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode, timeout) + super().__init__(file, host, readermode, timeout) if user or usenetrc: self.login(user, password, usenetrc) except: @@ -1057,15 +1055,19 @@ def __init__(self, host, port=NNTP_PORT, user=None, password=None, self.sock.close() raise + def _create_socket(self, timeout): + sys.audit("nntplib.connect", self, self.host, self.port) + return socket.create_connection((self.host, self.port), timeout) + def _close(self): try: - _NNTPBase._close(self) + super()._close() finally: self.sock.close() if _have_ssl: - class NNTP_SSL(_NNTPBase): + class NNTP_SSL(NNTP): def __init__(self, host, port=NNTP_SSL_PORT, user=None, password=None, ssl_context=None, @@ -1074,27 +1076,19 @@ def __init__(self, host, port=NNTP_SSL_PORT, """This works identically to NNTP.__init__, except for the change in default port and the `ssl_context` argument for SSL connections. """ - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) - file = None + self.ssl_context = ssl_context + super().__init__(host, port, user, password, readermode, + usenetrc, timeout) + + def _create_socket(self, timeout): + sock = super()._create_socket(timeout) try: - self.sock = _encrypt_on(self.sock, ssl_context, host) - file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode=readermode, timeout=timeout) - if user or usenetrc: - self.login(user, password, usenetrc) + sock = _encrypt_on(sock, self.ssl_context, self.host) except: - if file: - file.close() - self.sock.close() + sock.close() raise - - def _close(self): - try: - _NNTPBase._close(self) - finally: - self.sock.close() + else: + return sock __all__.append("NNTP_SSL") From webhook-mailer at python.org Sat Jan 11 10:37:33 2020 From: webhook-mailer at python.org (Jason R. Coombs) Date: Sat, 11 Jan 2020 15:37:33 -0000 Subject: [Python-checkins] bpo-39297: Update for importlib_metadata 1.4. (GH-17947) Message-ID: https://github.com/python/cpython/commit/136735c1a2efb320e4cbb64b40f1191228745b39 commit: 136735c1a2efb320e4cbb64b40f1191228745b39 branch: master author: Jason R. Coombs committer: GitHub date: 2020-01-11T10:37:28-05:00 summary: bpo-39297: Update for importlib_metadata 1.4. (GH-17947) * bpo-39297: Update for importlib_metadata 1.4. Includes performance updates. * ?? Added by blurb_it. * Update blurb Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst M Lib/importlib/metadata.py diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index 53f9fb5934668..ae8ecf9b8500c 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -10,6 +10,7 @@ import operator import functools import itertools +import posixpath import collections from configparser import ConfigParser @@ -371,10 +372,6 @@ def path(self): """ return vars(self).get('path', sys.path) - @property - def pattern(self): - return '.*' if self.name is None else re.escape(self.name) - @abc.abstractmethod def find_distributions(self, context=Context()): """ @@ -386,6 +383,73 @@ def find_distributions(self, context=Context()): """ +class FastPath: + """ + Micro-optimized class for searching a path for + children. + """ + + def __init__(self, root): + self.root = root + + def joinpath(self, child): + return pathlib.Path(self.root, child) + + def children(self): + with suppress(Exception): + return os.listdir(self.root or '') + with suppress(Exception): + return self.zip_children() + return [] + + def zip_children(self): + zip_path = zipfile.Path(self.root) + names = zip_path.root.namelist() + self.joinpath = zip_path.joinpath + + return ( + posixpath.split(child)[0] + for child in names + ) + + def is_egg(self, search): + root_n_low = os.path.split(self.root)[1].lower() + + return ( + root_n_low == search.normalized + '.egg' + or root_n_low.startswith(search.prefix) + and root_n_low.endswith('.egg')) + + def search(self, name): + for child in self.children(): + n_low = child.lower() + if (n_low in name.exact_matches + or n_low.startswith(name.prefix) + and n_low.endswith(name.suffixes) + # legacy case: + or self.is_egg(name) and n_low == 'egg-info'): + yield self.joinpath(child) + + +class Prepared: + """ + A prepared search for metadata on a possibly-named package. + """ + normalized = '' + prefix = '' + suffixes = '.dist-info', '.egg-info' + exact_matches = [''][:0] + + def __init__(self, name): + self.name = name + if name is None: + return + self.normalized = name.lower().replace('-', '_') + self.prefix = self.normalized + '-' + self.exact_matches = [ + self.normalized + suffix for suffix in self.suffixes] + + class MetadataPathFinder(DistributionFinder): @classmethod def find_distributions(cls, context=DistributionFinder.Context()): @@ -397,45 +461,17 @@ def find_distributions(cls, context=DistributionFinder.Context()): (or all names if ``None`` indicated) along the paths in the list of directories ``context.path``. """ - found = cls._search_paths(context.pattern, context.path) + found = cls._search_paths(context.name, context.path) return map(PathDistribution, found) @classmethod - def _search_paths(cls, pattern, paths): + def _search_paths(cls, name, paths): """Find metadata directories in paths heuristically.""" return itertools.chain.from_iterable( - cls._search_path(path, pattern) - for path in map(cls._switch_path, paths) + path.search(Prepared(name)) + for path in map(FastPath, paths) ) - @staticmethod - def _switch_path(path): - PYPY_OPEN_BUG = False - if not PYPY_OPEN_BUG or os.path.isfile(path): # pragma: no branch - with suppress(Exception): - return zipfile.Path(path) - return pathlib.Path(path) - - @classmethod - def _matches_info(cls, normalized, item): - template = r'{pattern}(-.*)?\.(dist|egg)-info' - manifest = template.format(pattern=normalized) - return re.match(manifest, item.name, flags=re.IGNORECASE) - - @classmethod - def _matches_legacy(cls, normalized, item): - template = r'{pattern}-.*\.egg[\\/]EGG-INFO' - manifest = template.format(pattern=normalized) - return re.search(manifest, str(item), flags=re.IGNORECASE) - - @classmethod - def _search_path(cls, root, pattern): - if not root.is_dir(): - return () - normalized = pattern.replace('-', '_') - return (item for item in root.iterdir() - if cls._matches_info(normalized, item) - or cls._matches_legacy(normalized, item)) class PathDistribution(Distribution): diff --git a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst new file mode 100644 index 0000000000000..618f6f9f2b7ff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst @@ -0,0 +1 @@ +Improved performance of importlib.metadata distribution discovery and resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). From webhook-mailer at python.org Sat Jan 11 10:57:05 2020 From: webhook-mailer at python.org (Jason R. Coombs) Date: Sat, 11 Jan 2020 15:57:05 -0000 Subject: [Python-checkins] bpo-39297: Update for importlib_metadata 1.4. (GH-17947) (GH-17952) Message-ID: https://github.com/python/cpython/commit/98b1c0c7ac7c80aac8bce8648fe14b55abeb382a commit: 98b1c0c7ac7c80aac8bce8648fe14b55abeb382a branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Jason R. Coombs date: 2020-01-11T10:56:57-05:00 summary: bpo-39297: Update for importlib_metadata 1.4. (GH-17947) (GH-17952) * bpo-39297: Update for importlib_metadata 1.4. Includes performance updates. * ?? Added by blurb_it. * Update blurb Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> (cherry picked from commit 136735c1a2efb320e4cbb64b40f1191228745b39) Co-authored-by: Jason R. Coombs Co-authored-by: Jason R. Coombs files: A Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst M Lib/importlib/metadata.py diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index 53f9fb5934668..ae8ecf9b8500c 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -10,6 +10,7 @@ import operator import functools import itertools +import posixpath import collections from configparser import ConfigParser @@ -371,10 +372,6 @@ def path(self): """ return vars(self).get('path', sys.path) - @property - def pattern(self): - return '.*' if self.name is None else re.escape(self.name) - @abc.abstractmethod def find_distributions(self, context=Context()): """ @@ -386,6 +383,73 @@ def find_distributions(self, context=Context()): """ +class FastPath: + """ + Micro-optimized class for searching a path for + children. + """ + + def __init__(self, root): + self.root = root + + def joinpath(self, child): + return pathlib.Path(self.root, child) + + def children(self): + with suppress(Exception): + return os.listdir(self.root or '') + with suppress(Exception): + return self.zip_children() + return [] + + def zip_children(self): + zip_path = zipfile.Path(self.root) + names = zip_path.root.namelist() + self.joinpath = zip_path.joinpath + + return ( + posixpath.split(child)[0] + for child in names + ) + + def is_egg(self, search): + root_n_low = os.path.split(self.root)[1].lower() + + return ( + root_n_low == search.normalized + '.egg' + or root_n_low.startswith(search.prefix) + and root_n_low.endswith('.egg')) + + def search(self, name): + for child in self.children(): + n_low = child.lower() + if (n_low in name.exact_matches + or n_low.startswith(name.prefix) + and n_low.endswith(name.suffixes) + # legacy case: + or self.is_egg(name) and n_low == 'egg-info'): + yield self.joinpath(child) + + +class Prepared: + """ + A prepared search for metadata on a possibly-named package. + """ + normalized = '' + prefix = '' + suffixes = '.dist-info', '.egg-info' + exact_matches = [''][:0] + + def __init__(self, name): + self.name = name + if name is None: + return + self.normalized = name.lower().replace('-', '_') + self.prefix = self.normalized + '-' + self.exact_matches = [ + self.normalized + suffix for suffix in self.suffixes] + + class MetadataPathFinder(DistributionFinder): @classmethod def find_distributions(cls, context=DistributionFinder.Context()): @@ -397,45 +461,17 @@ def find_distributions(cls, context=DistributionFinder.Context()): (or all names if ``None`` indicated) along the paths in the list of directories ``context.path``. """ - found = cls._search_paths(context.pattern, context.path) + found = cls._search_paths(context.name, context.path) return map(PathDistribution, found) @classmethod - def _search_paths(cls, pattern, paths): + def _search_paths(cls, name, paths): """Find metadata directories in paths heuristically.""" return itertools.chain.from_iterable( - cls._search_path(path, pattern) - for path in map(cls._switch_path, paths) + path.search(Prepared(name)) + for path in map(FastPath, paths) ) - @staticmethod - def _switch_path(path): - PYPY_OPEN_BUG = False - if not PYPY_OPEN_BUG or os.path.isfile(path): # pragma: no branch - with suppress(Exception): - return zipfile.Path(path) - return pathlib.Path(path) - - @classmethod - def _matches_info(cls, normalized, item): - template = r'{pattern}(-.*)?\.(dist|egg)-info' - manifest = template.format(pattern=normalized) - return re.match(manifest, item.name, flags=re.IGNORECASE) - - @classmethod - def _matches_legacy(cls, normalized, item): - template = r'{pattern}-.*\.egg[\\/]EGG-INFO' - manifest = template.format(pattern=normalized) - return re.search(manifest, str(item), flags=re.IGNORECASE) - - @classmethod - def _search_path(cls, root, pattern): - if not root.is_dir(): - return () - normalized = pattern.replace('-', '_') - return (item for item in root.iterdir() - if cls._matches_info(normalized, item) - or cls._matches_legacy(normalized, item)) class PathDistribution(Distribution): diff --git a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst new file mode 100644 index 0000000000000..618f6f9f2b7ff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst @@ -0,0 +1 @@ +Improved performance of importlib.metadata distribution discovery and resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). From webhook-mailer at python.org Sat Jan 11 12:39:19 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 11 Jan 2020 17:39:19 -0000 Subject: [Python-checkins] bpo-39259: nntplib.NNTP/NNTP_SSL now reject timeout = 0 (GH-17936) Message-ID: https://github.com/python/cpython/commit/1b335ae281631a12201fdec29b3c55d97166fc06 commit: 1b335ae281631a12201fdec29b3c55d97166fc06 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-11T18:39:15+01:00 summary: bpo-39259: nntplib.NNTP/NNTP_SSL now reject timeout = 0 (GH-17936) nntplib.NNTP and nntplib.NNTP_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. files: A Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst M Doc/library/nntplib.rst M Doc/whatsnew/3.9.rst M Lib/nntplib.py M Lib/test/test_nntplib.py diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index e8480b548073a..76973651526a8 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -93,6 +93,10 @@ The module itself defines the following classes: .. versionchanged:: 3.3 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + .. class:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout]) Return a new :class:`NNTP_SSL` object, representing an encrypted @@ -122,6 +126,10 @@ The module itself defines the following classes: :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see :data:`ssl.HAS_SNI`). + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + .. exception:: NNTPError Derived from the standard exception :exc:`Exception`, this is the base diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 3320b7cff42db..8cfb5725bb5e1 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -177,6 +177,13 @@ with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. (Contributed by Dong-hee Na in :issue:`38615`.) +nntplib +------- + +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + os -- diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 0ab51853b52fd..8951203f325c8 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1056,6 +1056,8 @@ def __init__(self, host, port=NNTP_PORT, user=None, password=None, raise def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') sys.audit("nntplib.connect", self, self.host, self.port) return socket.create_connection((self.host, self.port), timeout) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 88c54f4e6f37d..fdd76f9e9b355 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -258,6 +258,10 @@ def wrapped(self): # value setattr(cls, name, wrap_meth(meth)) + def test_timeout(self): + with self.assertRaises(ValueError): + self.NNTP_CLASS(self.NNTP_HOST, timeout=0, usenetrc=False) + def test_with_statement(self): def is_connected(): if not hasattr(server, 'file'): diff --git a/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst b/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst new file mode 100644 index 0000000000000..a454572c80db4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst @@ -0,0 +1,3 @@ +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From webhook-mailer at python.org Sat Jan 11 20:15:50 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 12 Jan 2020 01:15:50 -0000 Subject: [Python-checkins] bpo-39288: Add math.nextafter(x, y) (GH-17937) Message-ID: https://github.com/python/cpython/commit/100fafcf20e8fc67cd8ef512074f9c0a253cb427 commit: 100fafcf20e8fc67cd8ef512074f9c0a253cb427 branch: master author: Victor Stinner committer: GitHub date: 2020-01-12T02:15:42+01:00 summary: bpo-39288: Add math.nextafter(x, y) (GH-17937) Return the next floating-point value after x towards y. files: A Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst M Doc/library/math.rst M Doc/whatsnew/3.9.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 43eaba935a164..135adf8f6362d 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -213,6 +213,14 @@ Number-theoretic and representation functions of *x* and are floats. +.. function:: nextafter(x, y) + + Return the next floating-point value after *x* towards *y*. + + If *x* is equal to *y*, return *y*. + + .. versionadded:: 3.9 + .. function:: perm(n, k=None) Return the number of ways to choose *k* items from *n* items diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 8cfb5725bb5e1..a686d640ae94b 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -177,6 +177,13 @@ with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. (Contributed by Dong-hee Na in :issue:`38615`.) +math +---- + +Add :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. +(Contributed by Victor Stinner in :issue:`39288`.) + nntplib ------- diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 5c35c8cff129b..b64fd41a5481c 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -2033,6 +2033,60 @@ def testComb(self): self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) + def assertEqualSign(self, x, y): + """Similar to assertEqual(), but compare also the sign. + + Function useful to check to signed zero. + """ + self.assertEqual(x, y) + self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + + @requires_IEEE_754 + def test_nextafter(self): + # around 2^52 and 2^63 + self.assertEqual(math.nextafter(4503599627370496.0, -INF), + 4503599627370495.5) + self.assertEqual(math.nextafter(4503599627370496.0, INF), + 4503599627370497.0) + self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), + 9223372036854774784.0) + self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), + -9223372036854774784.0) + + # around 1.0 + self.assertEqual(math.nextafter(1.0, -INF), + float.fromhex('0x1.fffffffffffffp-1')) + self.assertEqual(math.nextafter(1.0, INF), + float.fromhex('0x1.0000000000001p+0')) + + # x == y: y is returned + self.assertEqual(math.nextafter(2.0, 2.0), 2.0) + self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) + self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) + + # around 0.0 + smallest_subnormal = sys.float_info.min * sys.float_info.epsilon + self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) + self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) + self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) + + # around infinity + largest_normal = sys.float_info.max + self.assertEqual(math.nextafter(INF, 0.0), largest_normal) + self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) + self.assertEqual(math.nextafter(largest_normal, INF), INF) + self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) + + # NaN + self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) + self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) + self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) + def test_main(): from doctest import DocFileSuite diff --git a/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst b/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst new file mode 100644 index 0000000000000..0e0ec99c344ae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst @@ -0,0 +1,2 @@ +Add :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 95d68ee55ae5b..f34633cb0c021 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -808,4 +808,52 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=9a2b3dc91eb9aadd input=a9049054013a1b77]*/ + +PyDoc_STRVAR(math_nextafter__doc__, +"nextafter($module, x, y, /)\n" +"--\n" +"\n" +"Return the next floating-point value after x towards y."); + +#define MATH_NEXTAFTER_METHODDEF \ + {"nextafter", (PyCFunction)(void(*)(void))math_nextafter, METH_FASTCALL, math_nextafter__doc__}, + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y); + +static PyObject * +math_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + double x; + double y; + + if (!_PyArg_CheckPositional("nextafter", nargs, 2, 2)) { + goto exit; + } + if (PyFloat_CheckExact(args[0])) { + x = PyFloat_AS_DOUBLE(args[0]); + } + else + { + x = PyFloat_AsDouble(args[0]); + if (x == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + if (PyFloat_CheckExact(args[1])) { + y = PyFloat_AS_DOUBLE(args[1]); + } + else + { + y = PyFloat_AsDouble(args[1]); + if (y == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + return_value = math_nextafter_impl(module, x, y); + +exit: + return return_value; +} +/*[clinic end generated code: output=e4ed1a800e4b2eae input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index e60e19bc49095..632a421e3bbe5 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3295,6 +3295,25 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) } +/*[clinic input] +math.nextafter + + x: double + y: double + / + +Return the next floating-point value after x towards y. +[clinic start generated code]*/ + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y) +/*[clinic end generated code: output=750c8266c1c540ce input=02b2d50cd1d9f9b6]*/ +{ + double f = nextafter(x, y); + return PyFloat_FromDouble(f); +} + + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3346,6 +3365,7 @@ static PyMethodDef math_methods[] = { MATH_PROD_METHODDEF MATH_PERM_METHODDEF MATH_COMB_METHODDEF + MATH_NEXTAFTER_METHODDEF {NULL, NULL} /* sentinel */ }; From webhook-mailer at python.org Sun Jan 12 03:54:06 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Sun, 12 Jan 2020 08:54:06 -0000 Subject: [Python-checkins] bpo-16575: Disabled checks for union types being passed by value. (GH-17960) Message-ID: https://github.com/python/cpython/commit/c12440c371025bea9c3bfb94945f006c486c2c01 commit: c12440c371025bea9c3bfb94945f006c486c2c01 branch: master author: Vinay Sajip committer: GitHub date: 2020-01-12T08:54:00Z summary: bpo-16575: Disabled checks for union types being passed by value. (GH-17960) Although the underlying libffi issue remains open, adding these checks have caused problems in third-party projects which are in widespread use. See the issue for examples. The corresponding tests have also been skipped. files: M Lib/ctypes/test/test_structures.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 283ccbf7237bb..245cd94c5cdd9 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -576,6 +576,7 @@ class U(Union): self.assertEqual(f2, [0x4567, 0x0123, 0xcdef, 0x89ab, 0x3210, 0x7654, 0xba98, 0xfedc]) + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_union_by_value(self): # See bpo-16575 @@ -656,7 +657,7 @@ class Test5(Structure): self.assertEqual(test5.nested.an_int, 0) self.assertEqual(test5.another_int, 0) - #@unittest.skipIf('s390' in MACHINE, 'Test causes segfault on S390') + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_bitfield_by_value(self): # See bpo-16576 diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 93af497bda25f..cb6e03f2ca14e 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2401,6 +2401,23 @@ converters_from_argtypes(PyObject *ob) for (i = 0; i < nArgs; ++i) { PyObject *cnv; PyObject *tp = PyTuple_GET_ITEM(ob, i); +/* + * The following checks, relating to bpo-16575 and bpo-16576, have been + * disabled. The reason is that, although there is a definite problem with + * how libffi handles unions (https://github.com/libffi/libffi/issues/33), + * there are numerous libraries which pass structures containing unions + * by values - especially on Windows but examples also exist on Linux + * (https://bugs.python.org/msg359834). + * + * It may not be possible to get proper support for unions and bitfields + * until support is forthcoming in libffi, but for now, adding the checks + * has caused problems in otherwise-working software, which suggests it + * is better to disable the checks. + * + * Although specific examples reported relate specifically to unions and + * not bitfields, the bitfields check is also being disabled as a + * precaution. + StgDictObject *stgdict = PyType_stgdict(tp); if (stgdict != NULL) { @@ -2428,6 +2445,7 @@ converters_from_argtypes(PyObject *ob) return NULL; } } + */ if (_PyObject_LookupAttrId(tp, &PyId_from_param, &cnv) <= 0) { Py_DECREF(converters); From webhook-mailer at python.org Sun Jan 12 04:04:36 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 12 Jan 2020 09:04:36 -0000 Subject: [Python-checkins] bpo-12159: Document sys.maxsize limit in len() function reference (GH-17934) Message-ID: https://github.com/python/cpython/commit/d7c7adde003ddca5cbe4fc47cf09464ab95a066e commit: d7c7adde003ddca5cbe4fc47cf09464ab95a066e branch: master author: Zac Hatfield-Dodds committer: Victor Stinner date: 2020-01-12T10:04:14+01:00 summary: bpo-12159: Document sys.maxsize limit in len() function reference (GH-17934) files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index dc3391ffe882d..cc48597ef91d5 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -892,6 +892,11 @@ are always available. They are listed here in alphabetical order. sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set). + .. impl-detail:: + + ``len`` raises :exc:`OverflowError` on lengths larger than + :data:`sys.maxsize`, such as :class:`range(2 ** 100) `. + .. _func-list: .. class:: list([iterable]) From webhook-mailer at python.org Sun Jan 12 06:03:06 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 11:03:06 -0000 Subject: [Python-checkins] bpo-38356: Fix ThreadedChildWatcher thread leak in test_asyncio (GH-16552) Message-ID: https://github.com/python/cpython/commit/0ca7cc7fc0518c24dc9b78c38418e6064e64f148 commit: 0ca7cc7fc0518c24dc9b78c38418e6064e64f148 branch: master author: Kyle Stanley committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-12T03:02:50-08:00 summary: bpo-38356: Fix ThreadedChildWatcher thread leak in test_asyncio (GH-16552) Motivation for this PR (comment from @vstinner in bpo issue): ``` Warning seen o AMD64 Ubuntu Shared 3.x buildbot: https://buildbot.python.org/all/#/builders/141/builds/2593 test_devnull_output (test.test_a=syncio.test_subprocess.SubprocessThreadedWatcherTests) ... Warning -- threading_cleanup() failed to cleanup 1 threads (count: 1, dangling: 2) ``` The following implementation details for the new method are TBD: 1) Public vs private 2) Inclusion in `close()` 3) Name 4) Coroutine vs subroutine method 5) *timeout* parameter If it's a private method, 3, 4, and 5 are significantly less important. I started with the most minimal implementation that fixes the dangling threads without modifying the regression tests, which I think is particularly important. I typically try to avoid directly modifying existing tests as much as possible unless it's necessary to do so. However, I am open to changing any part of this. https://bugs.python.org/issue38356 files: M Lib/asyncio/unix_events.py diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 28fb491864517..19d713545e4cd 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1344,7 +1344,14 @@ def is_active(self): return True def close(self): - pass + self._join_threads() + + def _join_threads(self): + """Internal: Join all non-daemon threads""" + threads = [thread for thread in list(self._threads.values()) + if thread.is_alive() and not thread.daemon] + for thread in threads: + thread.join() def __enter__(self): return self From webhook-mailer at python.org Sun Jan 12 06:03:20 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 11:03:20 -0000 Subject: [Python-checkins] bpo-39233: Update positional-only section in the glossary (GH-17874) Message-ID: https://github.com/python/cpython/commit/a240f0545653d961c67c1eb1597cb70b67f4e5f1 commit: a240f0545653d961c67c1eb1597cb70b67f4e5f1 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-12T03:03:15-08:00 summary: bpo-39233: Update positional-only section in the glossary (GH-17874) https://bugs.python.org/issue39233 (cherry picked from commit 9a669d58e8cb586fba38c84d5b631cd8a95d0c0c) Co-authored-by: Pablo Galindo files: M Doc/glossary.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9ce0357f1cb42..6189cb045049c 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -824,9 +824,11 @@ Glossary .. _positional-only_parameter: * :dfn:`positional-only`: specifies an argument that can be supplied only - by position. Python has no syntax for defining positional-only - parameters. However, some built-in functions have positional-only - parameters (e.g. :func:`abs`). + by position. Positional-only parameters can be defined by including a + ``/`` character in the parameter list of the function definition after + them, for example *posonly1* and *posonly2* in the following:: + + def func(posonly1, posonly2, /, positional_or_keyword): ... .. _keyword-only_parameter: From webhook-mailer at python.org Sun Jan 12 06:21:04 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 11:21:04 -0000 Subject: [Python-checkins] bpo-38356: Fix ThreadedChildWatcher thread leak in test_asyncio (GH-16552) Message-ID: https://github.com/python/cpython/commit/33dd75a28fe2ec6e85c5d3b315b5a9d4cf0652db commit: 33dd75a28fe2ec6e85c5d3b315b5a9d4cf0652db branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-12T03:21:00-08:00 summary: bpo-38356: Fix ThreadedChildWatcher thread leak in test_asyncio (GH-16552) Motivation for this PR (comment from @vstinner in bpo issue): ``` Warning seen o AMD64 Ubuntu Shared 3.x buildbot: https://buildbot.python.org/all/GH-/builders/141/builds/2593 test_devnull_output (test.test_a=syncio.test_subprocess.SubprocessThreadedWatcherTests) ... Warning -- threading_cleanup() failed to cleanup 1 threads (count: 1, dangling: 2) ``` The following implementation details for the new method are TBD: 1) Public vs private 2) Inclusion in `close()` 3) Name 4) Coroutine vs subroutine method 5) *timeout* parameter If it's a private method, 3, 4, and 5 are significantly less important. I started with the most minimal implementation that fixes the dangling threads without modifying the regression tests, which I think is particularly important. I typically try to avoid directly modifying existing tests as much as possible unless it's necessary to do so. However, I am open to changing any part of this. https://bugs.python.org/issue38356 (cherry picked from commit 0ca7cc7fc0518c24dc9b78c38418e6064e64f148) Co-authored-by: Kyle Stanley files: M Lib/asyncio/unix_events.py diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index d8f653045aee4..8c0a57482b7a4 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1266,7 +1266,14 @@ def is_active(self): return True def close(self): - pass + self._join_threads() + + def _join_threads(self): + """Internal: Join all non-daemon threads""" + threads = [thread for thread in list(self._threads.values()) + if thread.is_alive() and not thread.daemon] + for thread in threads: + thread.join() def __enter__(self): return self From webhook-mailer at python.org Sun Jan 12 06:41:11 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Sun, 12 Jan 2020 11:41:11 -0000 Subject: [Python-checkins] bpo-16575: Disabled checks for union types being passed by value. (GH-17960) (GH-17964) Message-ID: https://github.com/python/cpython/commit/eb9ba2f66df2195a9c6295e73ab3d545a1445f05 commit: eb9ba2f66df2195a9c6295e73ab3d545a1445f05 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Vinay Sajip date: 2020-01-12T11:41:07Z summary: bpo-16575: Disabled checks for union types being passed by value. (GH-17960) (GH-17964) Although the underlying libffi issue remains open, adding these checks have caused problems in third-party projects which are in widespread use. See the issue for examples. The corresponding tests have also been skipped. (cherry picked from commit c12440c371025bea9c3bfb94945f006c486c2c01) files: M Lib/ctypes/test/test_structures.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 19c4430bea344..cdbaa7fbd65ba 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -571,6 +571,7 @@ class U(Union): self.assertEqual(f2, [0x4567, 0x0123, 0xcdef, 0x89ab, 0x3210, 0x7654, 0xba98, 0xfedc]) + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_union_by_value(self): # See bpo-16575 @@ -651,7 +652,7 @@ class Test5(Structure): self.assertEqual(test5.nested.an_int, 0) self.assertEqual(test5.another_int, 0) - #@unittest.skipIf('s390' in MACHINE, 'Test causes segfault on S390') + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_bitfield_by_value(self): # See bpo-16576 diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index c6da0d804453e..b10b86725ff17 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2401,6 +2401,23 @@ converters_from_argtypes(PyObject *ob) for (i = 0; i < nArgs; ++i) { PyObject *cnv; PyObject *tp = PyTuple_GET_ITEM(ob, i); +/* + * The following checks, relating to bpo-16575 and bpo-16576, have been + * disabled. The reason is that, although there is a definite problem with + * how libffi handles unions (https://github.com/libffi/libffi/issues/33), + * there are numerous libraries which pass structures containing unions + * by values - especially on Windows but examples also exist on Linux + * (https://bugs.python.org/msg359834). + * + * It may not be possible to get proper support for unions and bitfields + * until support is forthcoming in libffi, but for now, adding the checks + * has caused problems in otherwise-working software, which suggests it + * is better to disable the checks. + * + * Although specific examples reported relate specifically to unions and + * not bitfields, the bitfields check is also being disabled as a + * precaution. + StgDictObject *stgdict = PyType_stgdict(tp); if (stgdict != NULL) { @@ -2428,6 +2445,7 @@ converters_from_argtypes(PyObject *ob) return NULL; } } + */ if (_PyObject_LookupAttrId(tp, &PyId_from_param, &cnv) <= 0) { Py_DECREF(converters); From webhook-mailer at python.org Sun Jan 12 06:57:52 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 12 Jan 2020 11:57:52 -0000 Subject: [Python-checkins] bpo-39288: Add examples to math.nextafter() documentation (GH-17962) Message-ID: https://github.com/python/cpython/commit/54cfbb2feee1f7328c3d6799ec3734b00824b555 commit: 54cfbb2feee1f7328c3d6799ec3734b00824b555 branch: master author: Victor Stinner committer: GitHub date: 2020-01-12T12:57:47+01:00 summary: bpo-39288: Add examples to math.nextafter() documentation (GH-17962) files: M Doc/library/math.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 135adf8f6362d..c9f2a383312f3 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -219,6 +219,13 @@ Number-theoretic and representation functions If *x* is equal to *y*, return *y*. + Examples: + + * ``math.nextafter(x, math.inf)`` goes up: towards positive infinity. + * ``math.nextafter(x, -math.inf)`` goes down: towards minus infinity. + * ``math.nextafter(x, 0.0)`` goes towards zero. + * ``math.nextafter(x, math.copysign(math.inf, x))`` goes away from zero. + .. versionadded:: 3.9 .. function:: perm(n, k=None) From webhook-mailer at python.org Sun Jan 12 12:42:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 17:42:05 -0000 Subject: [Python-checkins] bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Message-ID: https://github.com/python/cpython/commit/9f3fc6c5b4993f2b362263b494f84793a21aa073 commit: 9f3fc6c5b4993f2b362263b494f84793a21aa073 branch: master author: Gu?ni Natan Gunnarsson <1493259+GudniNatan at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-12T09:41:49-08:00 summary: bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Copying property objects results in a TypeError. Steps to reproduce: ``` >>> import copy >>> obj = property() >>> copy.copy(obj) ```` This affects both shallow and deep copying. My idea for a fix is to add property objects to the list of "atomic" objects in the copy module. These already include types like functions and type objects. I also added property objects to the unit tests test_copy_atomic and test_deepcopy_atomic. This is my first PR, and it's highly likely I've made some mistake, so please be kind :) https://bugs.python.org/issue38293 files: A Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst M Lib/copy.py M Lib/test/test_copy.py diff --git a/Lib/copy.py b/Lib/copy.py index f53cd8c587495..41873f2c046ca 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -107,7 +107,7 @@ def copy(x): def _copy_immutable(x): return x for t in (type(None), int, float, bool, complex, str, tuple, - bytes, frozenset, type, range, slice, + bytes, frozenset, type, range, slice, property, types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented), types.FunctionType, weakref.ref): d[t] = _copy_immutable @@ -195,6 +195,7 @@ def _deepcopy_atomic(x, memo): d[types.BuiltinFunctionType] = _deepcopy_atomic d[types.FunctionType] = _deepcopy_atomic d[weakref.ref] = _deepcopy_atomic +d[property] = _deepcopy_atomic def _deepcopy_list(x, memo, deepcopy=deepcopy): y = [] diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 45a692022f29b..35f72fb216b64 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -99,7 +99,7 @@ class WithMetaclass(metaclass=abc.ABCMeta): 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, b"world", bytes(range(256)), range(10), slice(1, 10, 2), - NewStyle, Classic, max, WithMetaclass] + NewStyle, Classic, max, WithMetaclass, property()] for x in tests: self.assertIs(copy.copy(x), x) @@ -357,7 +357,7 @@ def f(): pass tests = [None, 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, - NewStyle, Classic, max] + NewStyle, Classic, max, property()] for x in tests: self.assertIs(copy.deepcopy(x), x) diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst new file mode 100644 index 0000000000000..0b19551970eb0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst @@ -0,0 +1 @@ +Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` objects. \ No newline at end of file From webhook-mailer at python.org Sun Jan 12 13:00:31 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 18:00:31 -0000 Subject: [Python-checkins] bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Message-ID: https://github.com/python/cpython/commit/4be97260351f214d3c8b8477682323bb52ee2af3 commit: 4be97260351f214d3c8b8477682323bb52ee2af3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-12T10:00:27-08:00 summary: bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Copying property objects results in a TypeError. Steps to reproduce: ``` >>> import copy >>> obj = property() >>> copy.copy(obj) ```` This affects both shallow and deep copying. My idea for a fix is to add property objects to the list of "atomic" objects in the copy module. These already include types like functions and type objects. I also added property objects to the unit tests test_copy_atomic and test_deepcopy_atomic. This is my first PR, and it's highly likely I've made some mistake, so please be kind :) https://bugs.python.org/issue38293 (cherry picked from commit 9f3fc6c5b4993f2b362263b494f84793a21aa073) Co-authored-by: Gu?ni Natan Gunnarsson <1493259+GudniNatan at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst M Lib/copy.py M Lib/test/test_copy.py diff --git a/Lib/copy.py b/Lib/copy.py index f86040a33c554..e634c43e347b9 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -111,7 +111,7 @@ def copy(x): def _copy_immutable(x): return x for t in (type(None), int, float, bool, complex, str, tuple, - bytes, frozenset, type, range, slice, + bytes, frozenset, type, range, slice, property, types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented), types.FunctionType, weakref.ref): d[t] = _copy_immutable @@ -206,6 +206,7 @@ def _deepcopy_atomic(x, memo): d[types.BuiltinFunctionType] = _deepcopy_atomic d[types.FunctionType] = _deepcopy_atomic d[weakref.ref] = _deepcopy_atomic +d[property] = _deepcopy_atomic def _deepcopy_list(x, memo, deepcopy=deepcopy): y = [] diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 45a692022f29b..35f72fb216b64 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -99,7 +99,7 @@ class WithMetaclass(metaclass=abc.ABCMeta): 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, b"world", bytes(range(256)), range(10), slice(1, 10, 2), - NewStyle, Classic, max, WithMetaclass] + NewStyle, Classic, max, WithMetaclass, property()] for x in tests: self.assertIs(copy.copy(x), x) @@ -357,7 +357,7 @@ def f(): pass tests = [None, 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, - NewStyle, Classic, max] + NewStyle, Classic, max, property()] for x in tests: self.assertIs(copy.deepcopy(x), x) diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst new file mode 100644 index 0000000000000..0b19551970eb0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst @@ -0,0 +1 @@ +Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` objects. \ No newline at end of file From webhook-mailer at python.org Sun Jan 12 13:04:23 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 18:04:23 -0000 Subject: [Python-checkins] bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Message-ID: https://github.com/python/cpython/commit/3043ec7d6aed402218404c25179e734166c7fbe0 commit: 3043ec7d6aed402218404c25179e734166c7fbe0 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-12T10:04:18-08:00 summary: bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Copying property objects results in a TypeError. Steps to reproduce: ``` >>> import copy >>> obj = property() >>> copy.copy(obj) ```` This affects both shallow and deep copying. My idea for a fix is to add property objects to the list of "atomic" objects in the copy module. These already include types like functions and type objects. I also added property objects to the unit tests test_copy_atomic and test_deepcopy_atomic. This is my first PR, and it's highly likely I've made some mistake, so please be kind :) https://bugs.python.org/issue38293 (cherry picked from commit 9f3fc6c5b4993f2b362263b494f84793a21aa073) Co-authored-by: Gu?ni Natan Gunnarsson <1493259+GudniNatan at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst M Lib/copy.py M Lib/test/test_copy.py diff --git a/Lib/copy.py b/Lib/copy.py index f53cd8c587495..41873f2c046ca 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -107,7 +107,7 @@ def copy(x): def _copy_immutable(x): return x for t in (type(None), int, float, bool, complex, str, tuple, - bytes, frozenset, type, range, slice, + bytes, frozenset, type, range, slice, property, types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented), types.FunctionType, weakref.ref): d[t] = _copy_immutable @@ -195,6 +195,7 @@ def _deepcopy_atomic(x, memo): d[types.BuiltinFunctionType] = _deepcopy_atomic d[types.FunctionType] = _deepcopy_atomic d[weakref.ref] = _deepcopy_atomic +d[property] = _deepcopy_atomic def _deepcopy_list(x, memo, deepcopy=deepcopy): y = [] diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 45a692022f29b..35f72fb216b64 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -99,7 +99,7 @@ class WithMetaclass(metaclass=abc.ABCMeta): 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, b"world", bytes(range(256)), range(10), slice(1, 10, 2), - NewStyle, Classic, max, WithMetaclass] + NewStyle, Classic, max, WithMetaclass, property()] for x in tests: self.assertIs(copy.copy(x), x) @@ -357,7 +357,7 @@ def f(): pass tests = [None, 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, - NewStyle, Classic, max] + NewStyle, Classic, max, property()] for x in tests: self.assertIs(copy.deepcopy(x), x) diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst new file mode 100644 index 0000000000000..0b19551970eb0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst @@ -0,0 +1 @@ +Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` objects. \ No newline at end of file From webhook-mailer at python.org Sun Jan 12 15:38:57 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 12 Jan 2020 20:38:57 -0000 Subject: [Python-checkins] bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Message-ID: https://github.com/python/cpython/commit/6680f4a9f5d15ab82b2ab6266c6f917cb78c919a commit: 6680f4a9f5d15ab82b2ab6266c6f917cb78c919a branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Pablo Galindo date: 2020-01-12T20:38:53Z summary: bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst M Doc/library/ast.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index c380a81bee6d2..2cee8738e5834 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -316,7 +316,7 @@ and classes for traversing abstract syntax trees: class RewriteName(NodeTransformer): def visit_Name(self, node): - return copy_location(Subscript( + return Subscript( value=Name(id='data', ctx=Load()), slice=Index(value=Constant(value=node.id)), ctx=node.ctx @@ -330,6 +330,14 @@ and classes for traversing abstract syntax trees: statement nodes), the visitor may also return a list of nodes rather than just a single node. + If :class:`NodeTransformer` introduces new nodes (that weren't part of + original tree) without giving them location information (such as + :attr:`lineno`), :func:`fix_missing_locations` should be called with + the new sub-tree to recalculate the location information:: + + tree = ast.parse('foo', mode='eval') + new_tree = fix_missing_locations(RewriteName().visit(tree)) + Usually you use the transformer like this:: node = YourTransformer().visit(node) diff --git a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst new file mode 100644 index 0000000000000..65f1a6d156a12 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst @@ -0,0 +1,2 @@ +In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` example and add +advice on when to use the ``fix_missing_locations`` function. From webhook-mailer at python.org Sun Jan 12 15:44:30 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 20:44:30 -0000 Subject: [Python-checkins] bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Message-ID: https://github.com/python/cpython/commit/e222b4c69f99953a14ded52497a9909e34fc3893 commit: e222b4c69f99953a14ded52497a9909e34fc3893 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-12T12:44:22-08:00 summary: bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Co-authored-by: Pablo Galindo (cherry picked from commit 6680f4a9f5d15ab82b2ab6266c6f917cb78c919a) Co-authored-by: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst M Doc/library/ast.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 699ad0456a02f..6d6ae6de78a01 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -240,7 +240,7 @@ and classes for traversing abstract syntax trees: class RewriteName(NodeTransformer): def visit_Name(self, node): - return copy_location(Subscript( + return Subscript( value=Name(id='data', ctx=Load()), slice=Index(value=Str(s=node.id)), ctx=node.ctx @@ -254,6 +254,14 @@ and classes for traversing abstract syntax trees: statement nodes), the visitor may also return a list of nodes rather than just a single node. + If :class:`NodeTransformer` introduces new nodes (that weren't part of + original tree) without giving them location information (such as + :attr:`lineno`), :func:`fix_missing_locations` should be called with + the new sub-tree to recalculate the location information:: + + tree = ast.parse('foo', mode='eval') + new_tree = fix_missing_locations(RewriteName().visit(tree)) + Usually you use the transformer like this:: node = YourTransformer().visit(node) diff --git a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst new file mode 100644 index 0000000000000..65f1a6d156a12 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst @@ -0,0 +1,2 @@ +In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` example and add +advice on when to use the ``fix_missing_locations`` function. From webhook-mailer at python.org Sun Jan 12 15:44:38 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 20:44:38 -0000 Subject: [Python-checkins] bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Message-ID: https://github.com/python/cpython/commit/ef0af30e507a29dae03aae40459b9c44c96f260d commit: ef0af30e507a29dae03aae40459b9c44c96f260d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-12T12:44:33-08:00 summary: bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Co-authored-by: Pablo Galindo (cherry picked from commit 6680f4a9f5d15ab82b2ab6266c6f917cb78c919a) Co-authored-by: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst M Doc/library/ast.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 92bf8912eb53d..a5dd0e1cc70dd 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -300,7 +300,7 @@ and classes for traversing abstract syntax trees: class RewriteName(NodeTransformer): def visit_Name(self, node): - return copy_location(Subscript( + return Subscript( value=Name(id='data', ctx=Load()), slice=Index(value=Constant(value=node.id)), ctx=node.ctx @@ -314,6 +314,14 @@ and classes for traversing abstract syntax trees: statement nodes), the visitor may also return a list of nodes rather than just a single node. + If :class:`NodeTransformer` introduces new nodes (that weren't part of + original tree) without giving them location information (such as + :attr:`lineno`), :func:`fix_missing_locations` should be called with + the new sub-tree to recalculate the location information:: + + tree = ast.parse('foo', mode='eval') + new_tree = fix_missing_locations(RewriteName().visit(tree)) + Usually you use the transformer like this:: node = YourTransformer().visit(node) diff --git a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst new file mode 100644 index 0000000000000..65f1a6d156a12 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst @@ -0,0 +1,2 @@ +In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` example and add +advice on when to use the ``fix_missing_locations`` function. From webhook-mailer at python.org Sun Jan 12 15:53:04 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 20:53:04 -0000 Subject: [Python-checkins] Fix outdated comment in _strptime.py (GH-17929) Message-ID: https://github.com/python/cpython/commit/14dbe4b3f0a888a60e8cc20f3df5aa09c8bb82c3 commit: 14dbe4b3f0a888a60e8cc20f3df5aa09c8bb82c3 branch: master author: Ram Rachum committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-12T12:53:00-08:00 summary: Fix outdated comment in _strptime.py (GH-17929) Can I please get the tags for skipping bpo and skipping a news item? files: M Lib/_strptime.py diff --git a/Lib/_strptime.py b/Lib/_strptime.py index f4f3c0b80c1d0..5df37f5f4b89d 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -182,7 +182,7 @@ def __init__(self, locale_time=None): self.locale_time = LocaleTime() base = super() base.__init__({ - # The " \d" part of the regex is to make %c from ANSI C work + # The " [1-9]" part of the regex is to make %c from ANSI C work 'd': r"(?P3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])", 'f': r"(?P[0-9]{1,6})", 'H': r"(?P2[0-3]|[0-1]\d|\d)", From webhook-mailer at python.org Sun Jan 12 15:55:58 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Sun, 12 Jan 2020 20:55:58 -0000 Subject: [Python-checkins] [3.7] bpo-16575: Disabled checks for union types being passed by value. (GH-17960) (GH-17970) Message-ID: https://github.com/python/cpython/commit/9dbf5d3bc2033940cdca35440cf08814544f81e4 commit: 9dbf5d3bc2033940cdca35440cf08814544f81e4 branch: 3.7 author: Vinay Sajip committer: GitHub date: 2020-01-12T20:55:54Z summary: [3.7] bpo-16575: Disabled checks for union types being passed by value. (GH-17960) (GH-17970) Although the underlying libffi issue remains open, adding these checks have caused problems in third-party projects which are in widespread use. See the issue for examples. The corresponding tests have also been skipped. (cherry picked from commit c12440c371025bea9c3bfb94945f006c486c2c01) files: M Lib/ctypes/test/test_structures.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index c129377041f03..2eb057a9f3009 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -532,6 +532,7 @@ class U(Union): self.assertEqual(f2, [0x4567, 0x0123, 0xcdef, 0x89ab, 0x3210, 0x7654, 0xba98, 0xfedc]) + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_union_by_value(self): # See bpo-16575 @@ -612,7 +613,7 @@ class Test5(Structure): self.assertEqual(test5.nested.an_int, 0) self.assertEqual(test5.another_int, 0) - #@unittest.skipIf('s390' in MACHINE, 'Test causes segfault on S390') + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_bitfield_by_value(self): # See bpo-16576 diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index c8fed44599543..dd0c61fd8a9a9 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2277,6 +2277,23 @@ converters_from_argtypes(PyObject *ob) for (i = 0; i < nArgs; ++i) { PyObject *tp = PyTuple_GET_ITEM(ob, i); PyObject *cnv; +/* + * The following checks, relating to bpo-16575 and bpo-16576, have been + * disabled. The reason is that, although there is a definite problem with + * how libffi handles unions (https://github.com/libffi/libffi/issues/33), + * there are numerous libraries which pass structures containing unions + * by values - especially on Windows but examples also exist on Linux + * (https://bugs.python.org/msg359834). + * + * It may not be possible to get proper support for unions and bitfields + * until support is forthcoming in libffi, but for now, adding the checks + * has caused problems in otherwise-working software, which suggests it + * is better to disable the checks. + * + * Although specific examples reported relate specifically to unions and + * not bitfields, the bitfields check is also being disabled as a + * precaution. + StgDictObject *stgdict = PyType_stgdict(tp); if (stgdict != NULL) { @@ -2304,6 +2321,8 @@ converters_from_argtypes(PyObject *ob) return NULL; } } + */ + cnv = PyObject_GetAttrString(tp, "from_param"); if (!cnv) goto argtypes_error_1; From webhook-mailer at python.org Sun Jan 12 17:13:36 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 12 Jan 2020 22:13:36 -0000 Subject: [Python-checkins] bpo-39313: Add an option to RefactoringTool for using exec as a function (GH-17967) Message-ID: https://github.com/python/cpython/commit/61b14151cc92021a10f94765eaa152ed04eb262a commit: 61b14151cc92021a10f94765eaa152ed04eb262a branch: master author: Batuhan Ta?kaya <47358913+isidentical at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-12T14:13:31-08:00 summary: bpo-39313: Add an option to RefactoringTool for using exec as a function (GH-17967) https://bugs.python.org/issue39313 Automerge-Triggered-By: @pablogsal files: A Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst M Doc/library/2to3.rst M Lib/lib2to3/main.py M Lib/lib2to3/refactor.py M Lib/lib2to3/tests/test_refactor.py diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index c3ff3e607e797..eb4c9185f48bf 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -102,7 +102,7 @@ presence of the ``from __future__ import print_function`` compiler directive, it modifies its internal grammar to interpret :func:`print` as a function. This change can also be enabled manually with the :option:`!-p` flag. Use :option:`!-p` to run fixers on code that already has had its print statements -converted. +converted. Also :option:`!-e` can be used to make :func:`exec` a function. The :option:`!-o` or :option:`!--output-dir` option allows specification of an alternate directory for processed output files to be written to. The diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py index c51626babf8ec..f2849fd6be3fd 100644 --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -154,6 +154,8 @@ def main(fixer_pkg, args=None): help="List available transformations") parser.add_option("-p", "--print-function", action="store_true", help="Modify the grammar so that print() is a function") + parser.add_option("-e", "--exec-function", action="store_true", + help="Modify the grammar so that exec() is a function") parser.add_option("-v", "--verbose", action="store_true", help="More verbose logging") parser.add_option("--no-diffs", action="store_true", @@ -211,6 +213,9 @@ def main(fixer_pkg, args=None): if options.print_function: flags["print_function"] = True + if options.exec_function: + flags["exec_function"] = True + # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py index 55fd60fa27c3d..3a5aafffc6df0 100644 --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -155,6 +155,7 @@ class FixerError(Exception): class RefactoringTool(object): _default_options = {"print_function" : False, + "exec_function": False, "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes @@ -173,10 +174,13 @@ def __init__(self, fixer_names, options=None, explicit=None): self.options = self._default_options.copy() if options is not None: self.options.update(options) - if self.options["print_function"]: - self.grammar = pygram.python_grammar_no_print_statement - else: - self.grammar = pygram.python_grammar + self.grammar = pygram.python_grammar.copy() + + if self.options['print_function']: + del self.grammar.keywords["print"] + elif self.options['exec_function']: + del self.grammar.keywords["exec"] + # When this is True, the refactor*() methods will call write_file() for # files processed even if they were not changed during refactoring. If # and only if the refactor method's write parameter was True. diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py index 9e3b8fbb90b2f..be705679f06db 100644 --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -44,9 +44,13 @@ def rt(self, options=None, fixers=_DEFAULT_FIXERS, explicit=None): def test_print_function_option(self): rt = self.rt({"print_function" : True}) - self.assertIs(rt.grammar, pygram.python_grammar_no_print_statement) - self.assertIs(rt.driver.grammar, - pygram.python_grammar_no_print_statement) + self.assertNotIn("print", rt.grammar.keywords) + self.assertNotIn("print", rt.driver.grammar.keywords) + + def test_exec_function_option(self): + rt = self.rt({"exec_function" : True}) + self.assertNotIn("exec", rt.grammar.keywords) + self.assertNotIn("exec", rt.driver.grammar.keywords) def test_write_unchanged_files_option(self): rt = self.rt() diff --git a/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst b/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst new file mode 100644 index 0000000000000..784d73c7b3f96 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst @@ -0,0 +1,2 @@ +Add a new ``exec_function`` option (*--exec-function* in the CLI) to +``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan Taskaya. From webhook-mailer at python.org Sun Jan 12 17:31:56 2020 From: webhook-mailer at python.org (Abhilash Raj) Date: Sun, 12 Jan 2020 22:31:56 -0000 Subject: [Python-checkins] bpo-32021: Support brotli .br encoding in mimetypes (#12200) Message-ID: https://github.com/python/cpython/commit/b2b4a51f7463a0392456f7772f33223e57fa4ccc commit: b2b4a51f7463a0392456f7772f33223e57fa4ccc branch: master author: Philip McMahon committer: Abhilash Raj date: 2020-01-12T14:31:49-08:00 summary: bpo-32021: Support brotli .br encoding in mimetypes (#12200) Add support for brotli encoding in the encoding_map. files: A Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst M Lib/mimetypes.py diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 9b42bf6dd2ca7..a09e618d8a584 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -401,6 +401,7 @@ def _default_mime_types(): '.Z': 'compress', '.bz2': 'bzip2', '.xz': 'xz', + '.br': 'br', } # Before adding new types, make sure they are either registered with IANA, diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst new file mode 100644 index 0000000000000..a07f6d3e85af5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst @@ -0,0 +1 @@ +Include brotli .br encoding in mimetypes encodings_map \ No newline at end of file From webhook-mailer at python.org Sun Jan 12 17:56:31 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sun, 12 Jan 2020 22:56:31 -0000 Subject: [Python-checkins] [3.8] Fix typos in Misc/NEWS.d (GH-17930) Message-ID: https://github.com/python/cpython/commit/f1f0c58d3835b63692600436c70478f638c3352f commit: f1f0c58d3835b63692600436c70478f638c3352f branch: 3.8 author: toonarmycaptain committer: Andrew Svetlov date: 2020-01-13T00:56:26+02:00 summary: [3.8] Fix typos in Misc/NEWS.d (GH-17930) files: M Misc/NEWS.d/3.8.0.rst M Misc/NEWS.d/3.8.1.rst diff --git a/Misc/NEWS.d/3.8.0.rst b/Misc/NEWS.d/3.8.0.rst index b7e681f8333bd..e72025cfca572 100644 --- a/Misc/NEWS.d/3.8.0.rst +++ b/Misc/NEWS.d/3.8.0.rst @@ -101,7 +101,7 @@ now never fails (except MemoryError). .. nonce: go_jFf .. section: Documentation -Add list of no-longer-escaped chars to re.escape documentation +Add list of no-longer-escaped chars to re.escape documentation. .. @@ -123,7 +123,7 @@ Python slowest buildbots. .. nonce: scr2LO .. section: Windows -Fix error message in activate.bat +Fix error message in activate.bat. .. diff --git a/Misc/NEWS.d/3.8.1.rst b/Misc/NEWS.d/3.8.1.rst index 8cd4b359f7b4f..55d23dd7fa53e 100644 --- a/Misc/NEWS.d/3.8.1.rst +++ b/Misc/NEWS.d/3.8.1.rst @@ -26,7 +26,7 @@ the "elif" keyword and not to its condition, making it consistent with the .. section: Core and Builtins :c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used for size -arguments in the format string, regardless of whethen ``PY_SSIZE_T_CLEAN`` +arguments in the format string, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined at include time. .. @@ -36,7 +36,7 @@ was defined at include time. .. nonce: QDtIxI .. section: Library -Update importliib.metadata to include improvements from importlib_metadata +Update importlib.metadata to include improvements from importlib_metadata 1.3 including better serialization of EntryPoints and improved documentation for custom finders. @@ -95,7 +95,7 @@ Prevent failure of test_relative_path in test_py_compile on macOS Catalina. .. nonce: _3xjKG .. section: IDLE -Excape key now closes IDLE completion windows. Patch by Johnny Najera. +Escape key now closes IDLE completion windows. Patch by Johnny Najera. .. From webhook-mailer at python.org Mon Jan 13 05:35:52 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 13 Jan 2020 10:35:52 -0000 Subject: [Python-checkins] bpo-39307: Fix memory leak on error path in parsetok (GH-17953) Message-ID: https://github.com/python/cpython/commit/7ba6f18de2582755ae31888ba6a4237d96dddc48 commit: 7ba6f18de2582755ae31888ba6a4237d96dddc48 branch: master author: Alex Henrie committer: Pablo Galindo date: 2020-01-13T10:35:47Z summary: bpo-39307: Fix memory leak on error path in parsetok (GH-17953) files: M Parser/parsetok.c diff --git a/Parser/parsetok.c b/Parser/parsetok.c index a5d78974b871b..2bb733d0dcd66 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -246,6 +246,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, if ((ps = PyParser_New(g, start)) == NULL) { err_ret->error = E_NOMEM; + growable_comment_array_deallocate(&type_ignores); PyTokenizer_Free(tok); return NULL; } From webhook-mailer at python.org Mon Jan 13 05:54:28 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 13 Jan 2020 10:54:28 -0000 Subject: [Python-checkins] bpo-39307: Fix memory leak on error path in parsetok (GH-17953) Message-ID: https://github.com/python/cpython/commit/9671b6b3b3e480fbc4b14aab7008b90b38767f55 commit: 9671b6b3b3e480fbc4b14aab7008b90b38767f55 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-13T02:54:24-08:00 summary: bpo-39307: Fix memory leak on error path in parsetok (GH-17953) (cherry picked from commit 7ba6f18de2582755ae31888ba6a4237d96dddc48) Co-authored-by: Alex Henrie files: M Parser/parsetok.c diff --git a/Parser/parsetok.c b/Parser/parsetok.c index a5d78974b871b..2bb733d0dcd66 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -246,6 +246,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, if ((ps = PyParser_New(g, start)) == NULL) { err_ret->error = E_NOMEM; + growable_comment_array_deallocate(&type_ignores); PyTokenizer_Free(tok); return NULL; } From webhook-mailer at python.org Mon Jan 13 06:44:50 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 Jan 2020 11:44:50 -0000 Subject: [Python-checkins] bpo-39310: Add math.ulp(x) (GH-17965) Message-ID: https://github.com/python/cpython/commit/0b2ab21956fbab8eab6d064060d4544499730316 commit: 0b2ab21956fbab8eab6d064060d4544499730316 branch: master author: Victor Stinner committer: GitHub date: 2020-01-13T12:44:35+01:00 summary: bpo-39310: Add math.ulp(x) (GH-17965) Add math.ulp(): return the value of the least significant bit of a float. files: A Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst M Doc/library/math.rst M Doc/library/sys.rst M Doc/whatsnew/3.9.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index c9f2a383312f3..c4c180037f878 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -226,6 +226,8 @@ Number-theoretic and representation functions * ``math.nextafter(x, 0.0)`` goes towards zero. * ``math.nextafter(x, math.copysign(math.inf, x))`` goes away from zero. + See also :func:`math.ulp`. + .. versionadded:: 3.9 .. function:: perm(n, k=None) @@ -284,6 +286,30 @@ Number-theoretic and representation functions :class:`~numbers.Integral` (usually an integer). Delegates to :meth:`x.__trunc__() `. +.. function:: ulp(x) + + Return the value of the least significant bit of the float *x*: + + * If *x* is a NaN (not a number), return *x*. + * If *x* is negative, return ``ulp(-x)``. + * If *x* is a positive infinity, return *x*. + * If *x* is equal to zero, return the smallest positive + *denormalized* representable float (smaller than the minimum positive + *normalized* float, :data:`sys.float_info.min `). + * If *x* is equal to the largest positive representable float, + return the value of the least significant bit of *x*, such that the first + float smaller than *x* is ``x - ulp(x)``. + * Otherwise (*x* is a positive finite number), return the value of the least + significant bit of *x*, such that the first float bigger than *x* + is ``x + ulp(x)``. + + ULP stands for "Unit in the Last Place". + + See also :func:`math.nextafter` and :data:`sys.float_info.epsilon + `. + + .. versionadded:: 3.9 + Note that :func:`frexp` and :func:`modf` have a different call/return pattern than their C equivalents: they take a single argument and return a pair of diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 0aae263ff5f4c..351a8e4c9eafd 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -479,8 +479,10 @@ always available. +---------------------+----------------+--------------------------------------------------+ | attribute | float.h macro | explanation | +=====================+================+==================================================+ - | :const:`epsilon` | DBL_EPSILON | difference between 1 and the least value greater | - | | | than 1 that is representable as a float | + | :const:`epsilon` | DBL_EPSILON | difference between 1.0 and the least value | + | | | greater than 1.0 that is representable as a float| + | | | | + | | | See also :func:`math.ulp`. | +---------------------+----------------+--------------------------------------------------+ | :const:`dig` | DBL_DIG | maximum number of decimal digits that can be | | | | faithfully represented in a float; see below | @@ -488,20 +490,24 @@ always available. | :const:`mant_dig` | DBL_MANT_DIG | float precision: the number of base-``radix`` | | | | digits in the significand of a float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max` | DBL_MAX | maximum representable finite float | + | :const:`max` | DBL_MAX | maximum representable positive finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_exp` | DBL_MAX_EXP | maximum integer e such that ``radix**(e-1)`` is | + | :const:`max_exp` | DBL_MAX_EXP | maximum integer *e* such that ``radix**(e-1)`` is| | | | a representable finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer e such that ``10**e`` is in the | + | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer *e* such that ``10**e`` is in the| | | | range of representable finite floats | +---------------------+----------------+--------------------------------------------------+ - | :const:`min` | DBL_MIN | minimum positive normalized float | + | :const:`min` | DBL_MIN | minimum representable positive *normalized* float| + | | | | + | | | Use :func:`math.ulp(0.0) ` to get the | + | | | smallest positive *denormalized* representable | + | | | float. | +---------------------+----------------+--------------------------------------------------+ - | :const:`min_exp` | DBL_MIN_EXP | minimum integer e such that ``radix**(e-1)`` is | + | :const:`min_exp` | DBL_MIN_EXP | minimum integer *e* such that ``radix**(e-1)`` is| | | | a normalized float | +---------------------+----------------+--------------------------------------------------+ - | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer e such that ``10**e`` is a | + | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer *e* such that ``10**e`` is a | | | | normalized float | +---------------------+----------------+--------------------------------------------------+ | :const:`radix` | FLT_RADIX | radix of exponent representation | diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a686d640ae94b..340079c0e6953 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -184,6 +184,10 @@ Add :func:`math.nextafter`: return the next floating-point value after *x* towards *y*. (Contributed by Victor Stinner in :issue:`39288`.) +Add :func:`math.ulp`: return the value of the least significant bit +of a float. +(Contributed by Victor Stinner in :issue:`39310`.) + nntplib ------- diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index b64fd41a5481c..6d10227a0c135 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -53,30 +53,6 @@ def to_ulps(x): return n -def ulp(x): - """Return the value of the least significant bit of a - float x, such that the first float bigger than x is x+ulp(x). - Then, given an expected result x and a tolerance of n ulps, - the result y should be such that abs(y-x) <= n * ulp(x). - The results from this function will only make sense on platforms - where native doubles are represented in IEEE 754 binary64 format. - """ - x = abs(float(x)) - if math.isnan(x) or math.isinf(x): - return x - - # Find next float up from x. - n = struct.unpack(' double + + x: double + / + +Return the value of the least significant bit of the float x. +[clinic start generated code]*/ + +static double +math_ulp_impl(PyObject *module, double x) +/*[clinic end generated code: output=f5207867a9384dd4 input=31f9bfbbe373fcaa]*/ +{ + if (Py_IS_NAN(x)) { + return x; + } + x = fabs(x); + if (Py_IS_INFINITY(x)) { + return x; + } + double inf = m_inf(); + double x2 = nextafter(x, inf); + if (Py_IS_INFINITY(x2)) { + /* special case: x is the largest positive representable float */ + x2 = nextafter(x, -inf); + return x - x2; + } + return x2 - x; +} + + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3366,6 +3397,7 @@ static PyMethodDef math_methods[] = { MATH_PERM_METHODDEF MATH_COMB_METHODDEF MATH_NEXTAFTER_METHODDEF + MATH_ULP_METHODDEF {NULL, NULL} /* sentinel */ }; From webhook-mailer at python.org Mon Jan 13 06:59:01 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 13 Jan 2020 11:59:01 -0000 Subject: [Python-checkins] Remove unused functions in Parser/parsetok.c (GH-17365) Message-ID: https://github.com/python/cpython/commit/d23f78267a9082b6a8fa63ef601fdf9669e57ede commit: d23f78267a9082b6a8fa63ef601fdf9669e57ede branch: master author: Emmanuel Arias committer: Pablo Galindo date: 2020-01-13T11:58:52Z summary: Remove unused functions in Parser/parsetok.c (GH-17365) files: M Parser/parsetok.c diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 2bb733d0dcd66..b0b1bd38a7bba 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -207,24 +207,6 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, return n; } -#ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD -#if 0 -static const char with_msg[] = -"%s:%d: Warning: 'with' will become a reserved keyword in Python 2.6\n"; - -static const char as_msg[] = -"%s:%d: Warning: 'as' will become a reserved keyword in Python 2.6\n"; - -static void -warn(const char *msg, const char *filename, int lineno) -{ - if (filename == NULL) - filename = ""; - PySys_WriteStderr(msg, filename, lineno); -} -#endif -#endif - /* Parse input coming from the given tokenizer structure. Return error code. */ From webhook-mailer at python.org Mon Jan 13 07:25:09 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 13 Jan 2020 12:25:09 -0000 Subject: [Python-checkins] Fix typos in gcmodule.c and restructure comments for clarity (GH-17983) Message-ID: https://github.com/python/cpython/commit/97f1267a5431db97bd6f88f996a35ea516581100 commit: 97f1267a5431db97bd6f88f996a35ea516581100 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-13T12:25:05Z summary: Fix typos in gcmodule.c and restructure comments for clarity (GH-17983) files: M Modules/gcmodule.c diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index b11ae842e2295..5fef114d73ed1 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -609,7 +609,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) // NEXT_MASK_UNREACHABLE flag, we set it unconditionally. // But this may pollute the unreachable list head's 'next' pointer // too. That's semantically senseless but expedient here - the - // damage is repaired when this fumction ends. + // damage is repaired when this function ends. last->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc); _PyGCHead_SET_PREV(gc, last); gc->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)unreachable); @@ -1039,7 +1039,7 @@ clear_freelists(void) (void)PyContext_ClearFreeList(); } -// Show stats for objects in each gennerations. +// Show stats for objects in each generations static void show_stats_each_generations(GCState *gcstate) { @@ -1058,17 +1058,17 @@ show_stats_each_generations(GCState *gcstate) buf, gc_list_size(&gcstate->permanent_generation.head)); } -/* Deduce wich objects among "base" are unreachable from outside the list +/* Deduce which objects among "base" are unreachable from outside the list and move them to 'unreachable'. The process consist in the following steps: 1. Copy all reference counts to a different field (gc_prev is used to hold this copy to save memory). 2. Traverse all objects in "base" and visit all referred objects using - "tp_traverse" and for every visited object, substract 1 to the reference + "tp_traverse" and for every visited object, subtract 1 to the reference count (the one that we copied in the previous step). After this step, all objects that can be reached directly from outside must have strictly positive reference count, while all unreachable objects must have a count of exactly 0. -3. Indentify all unreachable objects (the ones with 0 reference count) and move +3. Identify all unreachable objects (the ones with 0 reference count) and move them to the "unreachable" list. This step also needs to move back to "base" all objects that were initially marked as unreachable but are referred transitively by the reachable objects (the ones with strictly positive reference count). @@ -1098,10 +1098,38 @@ deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) { /* Leave everything reachable from outside base in base, and move * everything else (in base) to unreachable. + * * NOTE: This used to move the reachable objects into a reachable * set instead. But most things usually turn out to be reachable, - * so it's more efficient to move the unreachable things. See note - ^ [REACHABLE OR UNREACHABLE?] at the file end. + * so it's more efficient to move the unreachable things. It "sounds slick" + * to move the unreachable objects, until you think about it - the reason it + * pays isn't actually obvious. + * + * Suppose we create objects A, B, C in that order. They appear in the young + * generation in the same order. If B points to A, and C to B, and C is + * reachable from outside, then the adjusted refcounts will be 0, 0, and 1 + * respectively. + * + * When move_unreachable finds A, A is moved to the unreachable list. The + * same for B when it's first encountered. Then C is traversed, B is moved + * _back_ to the reachable list. B is eventually traversed, and then A is + * moved back to the reachable list. + * + * So instead of not moving at all, the reachable objects B and A are moved + * twice each. Why is this a win? A straightforward algorithm to move the + * reachable objects instead would move A, B, and C once each. + * + * The key is that this dance leaves the objects in order C, B, A - it's + * reversed from the original order. On all _subsequent_ scans, none of + * them will move. Since most objects aren't in cycles, this can save an + * unbounded number of moves across an unbounded number of later collections. + * It can cost more only the first time the chain is scanned. + * + * Drawback: move_unreachable is also used to find out what's still trash + * after finalizers may resurrect objects. In _that_ case most unreachable + * objects will remain unreachable, so it would be more efficient to move + * the reachable objects instead. But this is a one-time cost, probably not + * worth complicating the code to speed just a little. */ gc_list_init(unreachable); move_unreachable(base, unreachable); // gc_prev is pointer again @@ -1197,7 +1225,7 @@ collect(PyThreadState *tstate, int generation, gc_list_merge(young, old); } else { - /* We only untrack dicts in full collections, to avoid quadratic + /* We only un-track dicts in full collections, to avoid quadratic dict build-up. See issue #14775. */ untrack_dicts(young); gcstate->long_lived_pending = 0; @@ -2269,39 +2297,3 @@ PyObject_GC_Del(void *op) } PyObject_FREE(g); } - -/* ------------------------------------------------------------------------ -Notes - -[REACHABLE OR UNREACHABLE?] - -It "sounds slick" to move the unreachable objects, until you think about -it - the reason it pays isn't actually obvious. - -Suppose we create objects A, B, C in that order. They appear in the young -generation in the same order. If B points to A, and C to B, and C is -reachable from outside, then the adjusted refcounts will be 0, 0, and 1 -respectively. - -When move_unreachable finds A, A is moved to the unreachable list. The -same for B when it's first encountered. Then C is traversed, B is moved -_back_ to the reachable list. B is eventually traversed, and then A is -moved back to the reachable list. - -So instead of not moving at all, the reachable objects B and A are moved -twice each. Why is this a win? A straightforward algorithm to move the -reachable objects instead would move A, B, and C once each. - -The key is that this dance leaves the objects in order C, B, A - it's -reversed from the original order. On all _subsequent_ scans, none of -them will move. Since most objects aren't in cycles, this can save an -unbounded number of moves across an unbounded number of later collections. -It can cost more only the first time the chain is scanned. - -Drawback: move_unreachable is also used to find out what's still trash -after finalizers may resurrect objects. In _that_ case most unreachable -objects will remain unreachable, so it would be more efficient to move -the reachable objects instead. But this is a one-time cost, probably not -worth complicating the code to speed just a little. ------------------------------------------------------------------------- */ - From webhook-mailer at python.org Mon Jan 13 07:51:30 2020 From: webhook-mailer at python.org (Mark Shannon) Date: Mon, 13 Jan 2020 12:51:30 -0000 Subject: [Python-checkins] Cleanup exit code for interpreter. (GH-17756) Message-ID: https://github.com/python/cpython/commit/e7c9f4aae1a8540fe8e9a8a5017b16f906f51068 commit: e7c9f4aae1a8540fe8e9a8a5017b16f906f51068 branch: master author: Mark Shannon committer: GitHub date: 2020-01-13T12:51:26Z summary: Cleanup exit code for interpreter. (GH-17756) files: M Lib/test/test_code.py M Python/ceval.c diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 656c46cfaa757..7bb824ea31dac 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -434,42 +434,6 @@ def run(self): tt.join() self.assertEqual(LAST_FREED, 500) - @cpython_only - def test_clean_stack_on_return(self): - - def f(x): - return x - - code = f.__code__ - ct = type(f.__code__) - - # Insert an extra LOAD_FAST, this duplicates the value of - # 'x' in the stack, leaking it if the frame is not properly - # cleaned up upon exit. - - bytecode = list(code.co_code) - bytecode.insert(-2, opcode.opmap['LOAD_FAST']) - bytecode.insert(-2, 0) - - c = ct(code.co_argcount, code.co_posonlyargcount, - code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize+1, - code.co_flags, bytes(bytecode), - code.co_consts, code.co_names, code.co_varnames, - code.co_filename, code.co_name, code.co_firstlineno, - code.co_lnotab, code.co_freevars, code.co_cellvars) - new_function = type(f)(c, f.__globals__, 'nf', f.__defaults__, f.__closure__) - - class Var: - pass - the_object = Var() - var = weakref.ref(the_object) - - new_function(the_object) - - # Check if the_object is leaked - del the_object - assert var() is None - def test_main(verbose=None): from test import test_code diff --git a/Python/ceval.c b/Python/ceval.c index 3bbd0ca9667b0..f780c212c5f23 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1913,7 +1913,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) case TARGET(RETURN_VALUE): { retval = POP(); assert(f->f_iblock == 0); - goto exit_returning; + assert(EMPTY()); + goto exiting; } case TARGET(GET_AITER): { @@ -2083,7 +2084,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); - goto exit_yielding; + goto exiting; } case TARGET(YIELD_VALUE): { @@ -2100,7 +2101,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } f->f_stacktop = stack_pointer; - goto exit_yielding; + goto exiting; } case TARGET(POP_EXCEPT): { @@ -3632,15 +3633,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) assert(retval == NULL); assert(_PyErr_Occurred(tstate)); -exit_returning: - /* Pop remaining stack entries. */ while (!EMPTY()) { PyObject *o = POP(); Py_XDECREF(o); } -exit_yielding: +exiting: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, From webhook-mailer at python.org Mon Jan 13 08:57:21 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 Jan 2020 13:57:21 -0000 Subject: [Python-checkins] bpo-20443: Update What's New In Python 3.9 (GH-17986) Message-ID: https://github.com/python/cpython/commit/c1ee6e5e9b87c9812c6745c1dd6c1788a984f9f9 commit: c1ee6e5e9b87c9812c6745c1dd6c1788a984f9f9 branch: master author: Victor Stinner committer: GitHub date: 2020-01-13T14:57:14+01:00 summary: bpo-20443: Update What's New In Python 3.9 (GH-17986) The sys.argv[0] change has been reverted. files: M Doc/whatsnew/3.9.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 340079c0e6953..b6ffa23453626 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -83,7 +83,7 @@ Other Language Changes * Python now gets the absolute path of the script filename specified on the command line (ex: ``python3 script.py``): the ``__file__`` attribute of - the :mod:`__main__` module, ``sys.argv[0]`` and ``sys.path[0]`` become an + the :mod:`__main__` module and ``sys.path[0]`` become an absolute path, rather than a relative path. These paths now remain valid after the current directory is changed by :func:`os.chdir`. As a side effect, a traceback also displays the absolute path for :mod:`__main__` module frames From webhook-mailer at python.org Mon Jan 13 09:39:44 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Mon, 13 Jan 2020 14:39:44 -0000 Subject: [Python-checkins] bpo-39299: Add more tests for mimetypes and its cli. (GH-17949) Message-ID: https://github.com/python/cpython/commit/d8efc1495194228c3a4cd472200275d6491d8e2d commit: d8efc1495194228c3a4cd472200275d6491d8e2d branch: master author: Karthikeyan Singaravelan committer: GitHub date: 2020-01-13T20:09:36+05:30 summary: bpo-39299: Add more tests for mimetypes and its cli. (GH-17949) * Add tests for case insensitive check of types and extensions as fallback. * Add tests for data url with no comma. * Add tests for read_mime_types. * Add tests for the mimetypes cli and refactor __main__ code to private function. * Restore mimetypes.knownfiles value at the end of the test. files: M Lib/mimetypes.py M Lib/test/test_mimetypes.py diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index a09e618d8a584..e972ca2e291a0 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -564,7 +564,7 @@ def _default_mime_types(): _default_mime_types() -if __name__ == '__main__': +def _main(): import getopt USAGE = """\ @@ -608,3 +608,7 @@ def usage(code, msg=''): guess, encoding = guess_type(gtype, strict) if not guess: print("I don't know anything about type", gtype) else: print('type:', guess, 'encoding:', encoding) + + +if __name__ == '__main__': + _main() diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index a5a06b189dec4..9cac6ce0225e1 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -8,10 +8,20 @@ from test import support from platform import win32_edition -# Tell it we don't know about external files: -mimetypes.knownfiles = [] -mimetypes.inited = False -mimetypes._default_mime_types() + +def setUpModule(): + global knownfiles + knownfiles = mimetypes.knownfiles + + # Tell it we don't know about external files: + mimetypes.knownfiles = [] + mimetypes.inited = False + mimetypes._default_mime_types() + + +def tearDownModule(): + # Restore knownfiles to its initial state + mimetypes.knownfiles = knownfiles class MimeTypesTestCase(unittest.TestCase): @@ -21,6 +31,7 @@ def setUp(self): def test_default_data(self): eq = self.assertEqual eq(self.db.guess_type("foo.html"), ("text/html", None)) + eq(self.db.guess_type("foo.HTML"), ("text/html", None)) eq(self.db.guess_type("foo.tgz"), ("application/x-tar", "gzip")) eq(self.db.guess_type("foo.tar.gz"), ("application/x-tar", "gzip")) eq(self.db.guess_type("foo.tar.Z"), ("application/x-tar", "compress")) @@ -30,6 +41,7 @@ def test_default_data(self): def test_data_urls(self): eq = self.assertEqual guess_type = self.db.guess_type + eq(guess_type("data:invalidDataWithoutComma"), (None, None)) eq(guess_type("data:,thisIsTextPlain"), ("text/plain", None)) eq(guess_type("data:;base64,thisIsTextPlain"), ("text/plain", None)) eq(guess_type("data:text/x-foo,thisIsTextXFoo"), ("text/x-foo", None)) @@ -42,6 +54,19 @@ def test_file_parsing(self): ("x-application/x-unittest", None)) eq(self.db.guess_extension("x-application/x-unittest"), ".pyunit") + def test_read_mime_types(self): + eq = self.assertEqual + + # Unreadable file returns None + self.assertIsNone(mimetypes.read_mime_types("non-existent")) + + with support.temp_dir() as directory: + data = "x-application/x-unittest pyunit\n" + file = pathlib.Path(directory, "sample.mimetype") + file.write_text(data) + mime_dict = mimetypes.read_mime_types(file) + eq(mime_dict[".pyunit"], "x-application/x-unittest") + def test_non_standard_types(self): eq = self.assertEqual # First try strict @@ -49,7 +74,10 @@ def test_non_standard_types(self): eq(self.db.guess_extension('image/jpg', strict=True), None) # And then non-strict eq(self.db.guess_type('foo.xul', strict=False), ('text/xul', None)) + eq(self.db.guess_type('foo.XUL', strict=False), ('text/xul', None)) + eq(self.db.guess_type('foo.invalid', strict=False), (None, None)) eq(self.db.guess_extension('image/jpg', strict=False), '.jpg') + eq(self.db.guess_extension('image/JPG', strict=False), '.jpg') def test_filename_with_url_delimiters(self): # bpo-38449: URL delimiters cases should be handled also. @@ -200,5 +228,53 @@ def test__all__(self): support.check__all__(self, mimetypes) +class MimetypesCliTestCase(unittest.TestCase): + + def mimetypes_cmd(self, *args, **kwargs): + support.patch(self, sys, "argv", [sys.executable, *args]) + with support.captured_stdout() as output: + mimetypes._main() + return output.getvalue().strip() + + def test_help_option(self): + support.patch(self, sys, "argv", [sys.executable, "-h"]) + with support.captured_stdout() as output: + with self.assertRaises(SystemExit) as cm: + mimetypes._main() + + self.assertIn("Usage: mimetypes.py", output.getvalue()) + self.assertEqual(cm.exception.code, 0) + + def test_invalid_option(self): + support.patch(self, sys, "argv", [sys.executable, "--invalid"]) + with support.captured_stdout() as output: + with self.assertRaises(SystemExit) as cm: + mimetypes._main() + + self.assertIn("Usage: mimetypes.py", output.getvalue()) + self.assertEqual(cm.exception.code, 1) + + def test_guess_extension(self): + eq = self.assertEqual + + extension = self.mimetypes_cmd("-l", "-e", "image/jpg") + eq(extension, ".jpg") + + extension = self.mimetypes_cmd("-e", "image/jpg") + eq(extension, "I don't know anything about type image/jpg") + + extension = self.mimetypes_cmd("-e", "image/jpeg") + eq(extension, ".jpg") + + def test_guess_type(self): + eq = self.assertEqual + + type_info = self.mimetypes_cmd("-l", "foo.pic") + eq(type_info, "type: image/pict encoding: None") + + type_info = self.mimetypes_cmd("foo.pic") + eq(type_info, "I don't know anything about type foo.pic") + + if __name__ == "__main__": unittest.main() From webhook-mailer at python.org Mon Jan 13 11:30:21 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 Jan 2020 16:30:21 -0000 Subject: [Python-checkins] bpo-39164: Add private _PyErr_GetExcInfo() function (GH-17752) Message-ID: https://github.com/python/cpython/commit/3430c55417f59078ac397c343894a3ee82a39624 commit: 3430c55417f59078ac397c343894a3ee82a39624 branch: master author: Julien Danjou committer: Victor Stinner date: 2020-01-13T17:30:14+01:00 summary: bpo-39164: Add private _PyErr_GetExcInfo() function (GH-17752) This adds a new function named _PyErr_GetExcInfo() that is a variation of the original PyErr_GetExcInfo() taking a PyThreadState as its first argument. That function allows to retrieve the exceptions information of any Python thread -- not only the current one. files: A Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst M Include/cpython/pyerrors.h M Python/errors.c diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index e3098b3925bd7..f8480fb79e557 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -76,6 +76,7 @@ typedef PyOSErrorObject PyWindowsErrorObject; PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); _PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate); +PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **); /* Context manipulation (PEP 3134) */ diff --git a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst new file mode 100644 index 0000000000000..bb72ac70d5b62 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst @@ -0,0 +1 @@ +Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception information of the specified Python thread state. diff --git a/Python/errors.c b/Python/errors.c index d65707e7f97f5..cdb44605056a5 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -433,21 +433,27 @@ PyErr_Clear(void) void -PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +_PyErr_GetExcInfo(PyThreadState *tstate, + PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { - PyThreadState *tstate = _PyThreadState_GET(); - _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); *p_type = exc_info->exc_type; *p_value = exc_info->exc_value; *p_traceback = exc_info->exc_traceback; - Py_XINCREF(*p_type); Py_XINCREF(*p_value); Py_XINCREF(*p_traceback); } + +void +PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); +} + void PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) { From webhook-mailer at python.org Mon Jan 13 12:47:07 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 Jan 2020 17:47:07 -0000 Subject: [Python-checkins] bpo-38644: Pass tstate to _Py_FinishPendingCalls() (GH-17990) Message-ID: https://github.com/python/cpython/commit/2b1df4592e1691017414337514c6e378eb639498 commit: 2b1df4592e1691017414337514c6e378eb639498 branch: master author: Victor Stinner committer: GitHub date: 2020-01-13T18:46:59+01:00 summary: bpo-38644: Pass tstate to _Py_FinishPendingCalls() (GH-17990) _Py_FinishPendingCalls() now expects a tstate argument, instead of a runtime argument. files: M Include/internal/pycore_ceval.h M Python/ceval.c M Python/pylifecycle.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 857fc0b2524fe..2a7c235cfc264 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -15,7 +15,7 @@ struct _frame; #include "pycore_pystate.h" /* PyInterpreterState.eval_frame */ -PyAPI_FUNC(void) _Py_FinishPendingCalls(struct pyruntimestate *runtime); +PyAPI_FUNC(void) _Py_FinishPendingCalls(PyThreadState *tstate); PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); PyAPI_FUNC(void) _PyEval_FiniThreads( struct _ceval_runtime_state *ceval); diff --git a/Python/ceval.c b/Python/ceval.c index f780c212c5f23..e8931c88820d5 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -585,11 +585,11 @@ make_pending_calls(_PyRuntimeState *runtime) } void -_Py_FinishPendingCalls(_PyRuntimeState *runtime) +_Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + _PyRuntimeState *runtime = tstate->interp->runtime; struct _pending_calls *pending = &runtime->ceval.pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 1d9dff4ce80bd..d5d60d0a6d4d9 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1340,7 +1340,7 @@ Py_FinalizeEx(void) wait_for_thread_shutdown(tstate); // Make any remaining pending calls. - _Py_FinishPendingCalls(runtime); + _Py_FinishPendingCalls(tstate); /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread From webhook-mailer at python.org Mon Jan 13 14:11:41 2020 From: webhook-mailer at python.org (Chris Withers) Date: Mon, 13 Jan 2020 19:11:41 -0000 Subject: [Python-checkins] remove unused __version__ from mock.py (#17977) Message-ID: https://github.com/python/cpython/commit/31d6de5aba009914efa8f0f3c3d7da35217578eb commit: 31d6de5aba009914efa8f0f3c3d7da35217578eb branch: master author: Chris Withers committer: GitHub date: 2020-01-13T19:11:34Z summary: remove unused __version__ from mock.py (#17977) This isn't included in `__all__` and could be a source of confusion. files: M Lib/unittest/mock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index cd5a2aeb6084d..5622917dc3743 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -23,8 +23,6 @@ ) -__version__ = '1.0' - import asyncio import contextlib import io From webhook-mailer at python.org Mon Jan 13 14:24:16 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 Jan 2020 19:24:16 -0000 Subject: [Python-checkins] bpo-39310: Update sys.float_info documentation (GH-17982) Message-ID: https://github.com/python/cpython/commit/9362f8526e42157baf27df982b16f23f212c3c3a commit: 9362f8526e42157baf27df982b16f23f212c3c3a branch: 3.8 author: Victor Stinner committer: GitHub date: 2020-01-13T20:24:12+01:00 summary: bpo-39310: Update sys.float_info documentation (GH-17982) Specify that sys.float_info.min is only the minimum normalized float. files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 1cf19b8ad6c02..e1d93f85bd407 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -479,8 +479,8 @@ always available. +---------------------+----------------+--------------------------------------------------+ | attribute | float.h macro | explanation | +=====================+================+==================================================+ - | :const:`epsilon` | DBL_EPSILON | difference between 1 and the least value greater | - | | | than 1 that is representable as a float | + | :const:`epsilon` | DBL_EPSILON | difference between 1.0 and the least value | + | | | greater than 1.0 that is representable as a float| +---------------------+----------------+--------------------------------------------------+ | :const:`dig` | DBL_DIG | maximum number of decimal digits that can be | | | | faithfully represented in a float; see below | @@ -488,20 +488,20 @@ always available. | :const:`mant_dig` | DBL_MANT_DIG | float precision: the number of base-``radix`` | | | | digits in the significand of a float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max` | DBL_MAX | maximum representable finite float | + | :const:`max` | DBL_MAX | maximum representable positive finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_exp` | DBL_MAX_EXP | maximum integer e such that ``radix**(e-1)`` is | + | :const:`max_exp` | DBL_MAX_EXP | maximum integer *e* such that ``radix**(e-1)`` is| | | | a representable finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer e such that ``10**e`` is in the | + | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer *e* such that ``10**e`` is in the| | | | range of representable finite floats | +---------------------+----------------+--------------------------------------------------+ - | :const:`min` | DBL_MIN | minimum positive normalized float | + | :const:`min` | DBL_MIN | minimum representable positive *normalized* float| +---------------------+----------------+--------------------------------------------------+ - | :const:`min_exp` | DBL_MIN_EXP | minimum integer e such that ``radix**(e-1)`` is | + | :const:`min_exp` | DBL_MIN_EXP | minimum integer *e* such that ``radix**(e-1)`` is| | | | a normalized float | +---------------------+----------------+--------------------------------------------------+ - | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer e such that ``10**e`` is a | + | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer *e* such that ``10**e`` is a | | | | normalized float | +---------------------+----------------+--------------------------------------------------+ | :const:`radix` | FLT_RADIX | radix of exponent representation | From webhook-mailer at python.org Mon Jan 13 14:30:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 13 Jan 2020 19:30:05 -0000 Subject: [Python-checkins] bpo-39310: Update sys.float_info documentation (GH-17982) Message-ID: https://github.com/python/cpython/commit/dfe159ca552870f801e34cc57e9bb7d6836ce7df commit: dfe159ca552870f801e34cc57e9bb7d6836ce7df branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-13T11:30:00-08:00 summary: bpo-39310: Update sys.float_info documentation (GH-17982) Specify that sys.float_info.min is only the minimum normalized float. (cherry picked from commit 9362f8526e42157baf27df982b16f23f212c3c3a) Co-authored-by: Victor Stinner files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 45708686c1773..1760ae3cd50f0 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -378,8 +378,8 @@ always available. +---------------------+----------------+--------------------------------------------------+ | attribute | float.h macro | explanation | +=====================+================+==================================================+ - | :const:`epsilon` | DBL_EPSILON | difference between 1 and the least value greater | - | | | than 1 that is representable as a float | + | :const:`epsilon` | DBL_EPSILON | difference between 1.0 and the least value | + | | | greater than 1.0 that is representable as a float| +---------------------+----------------+--------------------------------------------------+ | :const:`dig` | DBL_DIG | maximum number of decimal digits that can be | | | | faithfully represented in a float; see below | @@ -387,20 +387,20 @@ always available. | :const:`mant_dig` | DBL_MANT_DIG | float precision: the number of base-``radix`` | | | | digits in the significand of a float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max` | DBL_MAX | maximum representable finite float | + | :const:`max` | DBL_MAX | maximum representable positive finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_exp` | DBL_MAX_EXP | maximum integer e such that ``radix**(e-1)`` is | + | :const:`max_exp` | DBL_MAX_EXP | maximum integer *e* such that ``radix**(e-1)`` is| | | | a representable finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer e such that ``10**e`` is in the | + | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer *e* such that ``10**e`` is in the| | | | range of representable finite floats | +---------------------+----------------+--------------------------------------------------+ - | :const:`min` | DBL_MIN | minimum positive normalized float | + | :const:`min` | DBL_MIN | minimum representable positive *normalized* float| +---------------------+----------------+--------------------------------------------------+ - | :const:`min_exp` | DBL_MIN_EXP | minimum integer e such that ``radix**(e-1)`` is | + | :const:`min_exp` | DBL_MIN_EXP | minimum integer *e* such that ``radix**(e-1)`` is| | | | a normalized float | +---------------------+----------------+--------------------------------------------------+ - | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer e such that ``10**e`` is a | + | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer *e* such that ``10**e`` is a | | | | normalized float | +---------------------+----------------+--------------------------------------------------+ | :const:`radix` | FLT_RADIX | radix of exponent representation | From webhook-mailer at python.org Mon Jan 13 14:34:41 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 13 Jan 2020 19:34:41 -0000 Subject: [Python-checkins] bpo-39259: ftplib.FTP/FTP_TLS now reject timeout = 0 (GH-17959) Message-ID: https://github.com/python/cpython/commit/a190e2ade1a704a6b5a94464a0a19b140c7dd031 commit: a190e2ade1a704a6b5a94464a0a19b140c7dd031 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-13T20:34:34+01:00 summary: bpo-39259: ftplib.FTP/FTP_TLS now reject timeout = 0 (GH-17959) files: A Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst M Doc/library/ftplib.rst M Doc/whatsnew/3.9.rst M Lib/ftplib.py M Lib/test/test_ftplib.py diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 79a0286fb544d..a4bb695a9ab10 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -72,6 +72,9 @@ The module defines the following items: .. versionchanged:: 3.3 *source_address* parameter was added. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket .. class:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None) @@ -105,6 +108,10 @@ The module defines the following items: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket + Here's a sample session using the :class:`FTP_TLS` class:: >>> ftps = FTP_TLS('ftp.pureftpd.org') diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b6ffa23453626..859bf440f89af 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -159,6 +159,13 @@ Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK` and :data:`~fcntl.F_OFD_SETLKW`. (Contributed by Dong-hee Na in :issue:`38602`.) +ftplib +------- + +:class:`~ftplib.FTP` and :class:`~ftplib.FTP_TLS` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + gc -- diff --git a/Lib/ftplib.py b/Lib/ftplib.py index c339eb25bc2d7..71b3c289551fd 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -146,6 +146,8 @@ def connect(self, host='', port=0, timeout=-999, source_address=None): self.port = port if timeout != -999: self.timeout = timeout + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if source_address is not None: self.source_address = source_address sys.audit("ftplib.connect", self, self.host, self.port) @@ -725,12 +727,12 @@ def __init__(self, host='', user='', passwd='', acct='', keyfile=None, keyfile=keyfile) self.context = context self._prot_p = False - FTP.__init__(self, host, user, passwd, acct, timeout, source_address) + super().__init__(host, user, passwd, acct, timeout, source_address) def login(self, user='', passwd='', acct='', secure=True): if secure and not isinstance(self.sock, ssl.SSLSocket): self.auth() - return FTP.login(self, user, passwd, acct) + return super().login(user, passwd, acct) def auth(self): '''Set up secure control connection by using TLS/SSL.''' @@ -740,8 +742,7 @@ def auth(self): resp = self.voidcmd('AUTH TLS') else: resp = self.voidcmd('AUTH SSL') - self.sock = self.context.wrap_socket(self.sock, - server_hostname=self.host) + self.sock = self.context.wrap_socket(self.sock, server_hostname=self.host) self.file = self.sock.makefile(mode='r', encoding=self.encoding) return resp @@ -778,7 +779,7 @@ def prot_c(self): # --- Overridden FTP methods def ntransfercmd(self, cmd, rest=None): - conn, size = FTP.ntransfercmd(self, cmd, rest) + conn, size = super().ntransfercmd(cmd, rest) if self._prot_p: conn = self.context.wrap_socket(conn, server_hostname=self.host) diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 62f673c06156a..f40f3a4d9f7ab 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -1045,6 +1045,10 @@ def testTimeoutValue(self): self.evt.wait() ftp.close() + # bpo-39259 + with self.assertRaises(ValueError): + ftplib.FTP(HOST, timeout=0) + def testTimeoutConnect(self): ftp = ftplib.FTP() ftp.connect(HOST, timeout=30) diff --git a/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst b/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst new file mode 100644 index 0000000000000..bfcaff3c3d006 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst @@ -0,0 +1,3 @@ +:class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 14 01:40:15 2020 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 14 Jan 2020 06:40:15 -0000 Subject: [Python-checkins] bpo-39160 Align the verbs, grammar and defaults for `./configure --help` (GH-17747) Message-ID: https://github.com/python/cpython/commit/2de064e6305008d16571a21e5f0c178e62e81f27 commit: 2de064e6305008d16571a21e5f0c178e62e81f27 branch: master author: Anthony Shaw committer: Ned Deily date: 2020-01-14T01:40:10-05:00 summary: bpo-39160 Align the verbs, grammar and defaults for `./configure --help` (GH-17747) files: A Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst M configure M configure.ac M m4/ax_check_openssl.m4 diff --git a/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst b/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst new file mode 100644 index 0000000000000..9fb4088de0e70 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst @@ -0,0 +1 @@ +Updated the documentation in `./configure --help` to show default values, reference documentation where required and add additional explanation where needed. \ No newline at end of file diff --git a/configure b/configure index a2c7ddf595db2..c8253b1455f65 100755 --- a/configure +++ b/configure @@ -1483,80 +1483,102 @@ Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-universalsdk[=SDKDIR] - Build fat binary against Mac OS X SDK + create a universal binary build. SDKDIR specifies + which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no) --enable-framework[=INSTALLDIR] - Build (MacOSX|Darwin) framework - --enable-shared disable/enable building shared python library - --enable-profiling enable C-level code profiling - --enable-optimizations Enable expensive, stable optimizations (PGO, etc). - Disabled by default. + create a Python.framework rather than a traditional + Unix install. optional INSTALLDIR specifies the + installation path. see Mac/README.rst (default is + no) + --enable-shared enable building a shared Python library (default is + no) + --enable-profiling enable C-level code profiling with gprof (default is + no) + --enable-optimizations enable expensive, stable optimizations (PGO, etc.) + (default is no) --enable-loadable-sqlite-extensions - support loadable extensions in _sqlite module - --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support - --enable-big-digits[=BITS] - use big digits for Python longs [[BITS=30]] + support loadable extensions in _sqlite module, see + Doc/library/sqlite3.rst (default is no) + --enable-ipv6 enable ipv6 (with ipv4) support, see + Doc/library/socket.rst (default is yes if supported) + --enable-big-digits[=15|30] + use big digits (30 or 15 bits) for Python longs + (default is system-dependent)] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-universal-archs=ARCH - select architectures for universal build ("32-bit", - "64-bit", "3-way", "intel", "intel-32", "intel-64", - or "all") + specify the kind of universal binary that should be + created. this option is only valid when + --enable-universalsdk is set; options are: + ("32-bit", "64-bit", "3-way", "intel", "intel-32", + "intel-64", or "all") see Mac/README.rst --with-framework-name=FRAMEWORK - specify an alternate name of the framework built - with --enable-framework - --with-cxx-main= - compile main() and link python executable with C++ - compiler - --with-suffix=.exe set executable suffix - --with-pydebug build with Py_DEBUG defined + specify the name for the python framework on macOS + only valid when --enable-framework is set. see + Mac/README.rst (default is 'Python') + --with-cxx-main[=COMPILER] + compile main() and link Python executable with C++ + compiler specified in COMPILER (default is $CXX) + --with-suffix=SUFFIX set executable suffix to SUFFIX (default is '.exe') + --with-pydebug build with Py_DEBUG defined (default is no) --with-trace-refs enable tracing references for debugging purpose - --with-assertions build with C assertions enabled - --with-lto Enable Link Time Optimization in any build. Disabled - by default. + (default is no) + --with-assertions build with C assertions enabled (default is no) + --with-lto enable Link-Time-Optimization in any build (default + is no) --with-hash-algorithm=[fnv|siphash24] - select hash algorithm + select hash algorithm for use in Python/pyhash.c + (default is SipHash24) --with-address-sanitizer - enable AddressSanitizer (asan) - --with-memory-sanitizer enable MemorySanitizer (msan) + enable AddressSanitizer memory error detector, + 'asan' (default is no) + --with-memory-sanitizer enable MemorySanitizer allocation error detector, + 'msan' (default is no) --with-undefined-behavior-sanitizer - enable UndefinedBehaviorSanitizer (ubsan) - --with-libs='lib1 ...' link against additional libs + enable UndefinedBehaviorSanitizer undefined + behaviour detector, 'ubsan' (default is no) + --with-libs='lib1 ...' link against additional libs (default is no) --with-system-expat build pyexpat module using an installed expat - library - --with-system-ffi build _ctypes module using an installed ffi library + library, see Doc/library/pyexpat.rst (default is no) + --with-system-ffi build _ctypes module using an installed ffi library, + see Doc/library/ctypes.rst (default is + system-dependent) --with-system-libmpdec build _decimal module using an installed libmpdec - library + library, see Doc/library/decimal.rst (default is no) --with-tcltk-includes='-I...' override search for Tcl and Tk include files --with-tcltk-libs='-L...' override search for Tcl and Tk libs --with-dbmliborder=db1:db2:... - order to check db backends for dbm. Valid value is a - colon separated string with the backend names - `ndbm', `gdbm' and `bdb'. - --with(out)-doc-strings disable/enable documentation strings - --with(out)-pymalloc disable/enable specialized mallocs - --with(out)-c-locale-coercion - disable/enable C locale coercion to a UTF-8 based - locale - --with-valgrind Enable Valgrind support - --with(out)-dtrace disable/enable DTrace support - --with-libm=STRING math library - --with-libc=STRING C library - --with(out)-computed-gotos - Use computed gotos in evaluation loop (enabled by + override order to check db backends for dbm; a valid + value is a colon separated string with the backend + names `ndbm', `gdbm' and `bdb'. + --with-doc-strings enable documentation strings (default is yes) + --with-pymalloc enable specialized mallocs (default is yes) + --with-c-locale-coercion + enable C locale coercion to a UTF-8 based locale + (default is yes) + --with-valgrind enable Valgrind support (default is no) + --with-dtrace enable DTrace support (default is no) + --with-libm=STRING override libm math library to STRING (default is + system-dependent) + --with-libc=STRING override libc C library to STRING (default is + system-dependent) + --with-computed-gotos enable computed gotos in evaluation loop (enabled by default on supported compilers) - --with(out)-ensurepip=[=upgrade] - "install" or "upgrade" using bundled pip - --with-openssl=DIR root of the OpenSSL directory + --with-ensurepip[=install|upgrade|no] + "install" or "upgrade" using bundled pip (default is + upgrade) + --with-openssl=DIR override root of the OpenSSL directory to DIR --with-ssl-default-suites=[python|openssl|STRING] - Override default cipher suites string, python: use + override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a - custom string, PROTOCOL_SSLv2 ignores the setting + custom string, PROTOCOL_SSLv2 ignores the setting, + see Doc/library/ssl.rst Some influential environment variables: MACHDEP name for machine-dependent library files @@ -3248,7 +3270,7 @@ _ACEOF ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files diff --git a/configure.ac b/configure.ac index 57dca35723c67..bcef99c496225 100644 --- a/configure.ac +++ b/configure.ac @@ -149,7 +149,10 @@ CONFIG_ARGS="$ac_configure_args" AC_MSG_CHECKING([for --enable-universalsdk]) AC_ARG_ENABLE(universalsdk, - AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], [Build fat binary against Mac OS X SDK]), + AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], + [create a universal binary build. + SDKDIR specifies which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no)]), [ case $enableval in yes) @@ -212,7 +215,11 @@ fi AC_SUBST(LIPO_32BIT_FLAGS) AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, - AS_HELP_STRING([--with-universal-archs=ARCH], [select architectures for universal build ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all")]), + AS_HELP_STRING([--with-universal-archs=ARCH], + [specify the kind of universal binary that should be created. this option is + only valid when --enable-universalsdk is set; options are: + ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all") + see Mac/README.rst]), [ UNIVERSAL_ARCHS="$withval" ], @@ -226,7 +233,9 @@ fi AC_ARG_WITH(framework-name, AS_HELP_STRING([--with-framework-name=FRAMEWORK], - [specify an alternate name of the framework built with --enable-framework]), + [specify the name for the python framework on macOS + only valid when --enable-framework is set. see Mac/README.rst + (default is 'Python')]), [ PYTHONFRAMEWORK=${withval} PYTHONFRAMEWORKDIR=${withval}.framework @@ -238,7 +247,10 @@ AC_ARG_WITH(framework-name, ]) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_ENABLE(framework, - AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], [Build (MacOSX|Darwin) framework]), + AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], + [create a Python.framework rather than a traditional Unix install. + optional INSTALLDIR specifies the installation path. see Mac/README.rst + (default is no)]), [ case $enableval in yes) @@ -357,7 +369,7 @@ AC_DEFINE_UNQUOTED(_PYTHONFRAMEWORK, "${PYTHONFRAMEWORK}", [framework name]) ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files AC_ARG_VAR([MACHDEP], [name for machine-dependent library files]) @@ -647,8 +659,8 @@ AC_SUBST(CXX) AC_SUBST(MAINCC) AC_MSG_CHECKING(for --with-cxx-main=) AC_ARG_WITH(cxx_main, - AS_HELP_STRING([--with-cxx-main=], - [compile main() and link python executable with C++ compiler]), + AS_HELP_STRING([--with-cxx-main@<:@=COMPILER@:>@], + [compile main() and link Python executable with C++ compiler specified in COMPILER (default is $CXX)]), [ case $withval in @@ -928,7 +940,7 @@ esac AC_EXEEXT AC_MSG_CHECKING(for --with-suffix) AC_ARG_WITH(suffix, - AS_HELP_STRING([--with-suffix=.exe], [set executable suffix]), + AS_HELP_STRING([--with-suffix=SUFFIX], [set executable suffix to SUFFIX (default is '.exe')]), [ case $withval in no) EXEEXT=;; @@ -1050,7 +1062,7 @@ AC_MSG_RESULT($GNULD) AC_MSG_CHECKING(for --enable-shared) AC_ARG_ENABLE(shared, - AS_HELP_STRING([--enable-shared], [disable/enable building shared python library])) + AS_HELP_STRING([--enable-shared], [enable building a shared Python library (default is no)])) if test -z "$enable_shared" then @@ -1065,7 +1077,7 @@ AC_MSG_RESULT($enable_shared) AC_MSG_CHECKING(for --enable-profiling) AC_ARG_ENABLE(profiling, - AS_HELP_STRING([--enable-profiling], [enable C-level code profiling])) + AS_HELP_STRING([--enable-profiling], [enable C-level code profiling with gprof (default is no)])) if test "x$enable_profiling" = xyes; then ac_save_cc="$CC" CC="$CC -pg" @@ -1216,7 +1228,7 @@ ABIFLAGS="" # Check for --with-pydebug AC_MSG_CHECKING(for --with-pydebug) AC_ARG_WITH(pydebug, - AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined]), + AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined (default is no)]), [ if test "$withval" != no then @@ -1233,7 +1245,9 @@ fi], # --with-trace-refs AC_MSG_CHECKING(for --with-trace-refs) AC_ARG_WITH(trace-refs, - AS_HELP_STRING([--with-trace-refs],[enable tracing references for debugging purpose]),, + AS_HELP_STRING( + [--with-trace-refs], + [enable tracing references for debugging purpose (default is no)]),, with_trace_refs=no) AC_MSG_RESULT($with_trace_refs) @@ -1247,7 +1261,7 @@ fi assertions='false' AC_MSG_CHECKING(for --with-assertions) AC_ARG_WITH(assertions, - AS_HELP_STRING([--with-assertions],[build with C assertions enabled]), + AS_HELP_STRING([--with-assertions],[build with C assertions enabled (default is no)]), [ if test "$withval" != no then @@ -1268,7 +1282,9 @@ AC_SUBST(DEF_MAKE_ALL_RULE) AC_SUBST(DEF_MAKE_RULE) Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) -AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive, stable optimizations (PGO, etc). Disabled by default.]), +AC_ARG_ENABLE(optimizations, AS_HELP_STRING( + [--enable-optimizations], + [enable expensive, stable optimizations (PGO, etc.) (default is no)]), [ if test "$enableval" != no then @@ -1323,7 +1339,7 @@ fi # Enable LTO flags AC_MSG_CHECKING(for --with-lto) -AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in any build. Disabled by default.]), +AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [enable Link-Time-Optimization in any build (default is no)]), [ if test "$withval" != no then @@ -2907,7 +2923,7 @@ AC_MSG_CHECKING(for --with-hash-algorithm) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_WITH(hash_algorithm, AS_HELP_STRING([--with-hash-algorithm=@<:@fnv|siphash24@:>@], - [select hash algorithm]), + [select hash algorithm for use in Python/pyhash.c (default is SipHash24)]), [ AC_MSG_RESULT($withval) case "$withval" in @@ -2927,7 +2943,7 @@ esac AC_MSG_CHECKING(for --with-address-sanitizer) AC_ARG_WITH(address_sanitizer, AS_HELP_STRING([--with-address-sanitizer], - [enable AddressSanitizer (asan)]), + [enable AddressSanitizer memory error detector, 'asan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS" @@ -2940,7 +2956,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-memory-sanitizer) AC_ARG_WITH(memory_sanitizer, AS_HELP_STRING([--with-memory-sanitizer], - [enable MemorySanitizer (msan)]), + [enable MemorySanitizer allocation error detector, 'msan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" @@ -2953,7 +2969,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-undefined-behavior-sanitizer) AC_ARG_WITH(undefined_behavior_sanitizer, AS_HELP_STRING([--with-undefined-behavior-sanitizer], - [enable UndefinedBehaviorSanitizer (ubsan)]), + [enable UndefinedBehaviorSanitizer undefined behaviour detector, 'ubsan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=undefined $BASECFLAGS" @@ -2967,7 +2983,7 @@ AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets AC_MSG_CHECKING(for --with-libs) AC_ARG_WITH(libs, - AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs]), + AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs (default is no)]), [ AC_MSG_RESULT($withval) LIBS="$withval $LIBS" @@ -2979,7 +2995,7 @@ PKG_PROG_PKG_CONFIG # Check for use of the system expat library AC_MSG_CHECKING(for --with-system-expat) AC_ARG_WITH(system_expat, - AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library]), + AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library, see Doc/library/pyexpat.rst (default is no)]), [], [with_system_expat="no"]) @@ -2988,7 +3004,7 @@ AC_MSG_RESULT($with_system_expat) # Check for use of the system libffi library AC_MSG_CHECKING(for --with-system-ffi) AC_ARG_WITH(system_ffi, - AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library]),,,) + AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst (default is system-dependent)]),,,) if test "$ac_sys_system" = "Darwin" then @@ -3022,7 +3038,7 @@ AC_SUBST(LIBFFI_INCLUDEDIR) # Check for use of the system libmpdec library AC_MSG_CHECKING(for --with-system-libmpdec) AC_ARG_WITH(system_libmpdec, - AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library]), + AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library, see Doc/library/decimal.rst (default is no)]), [], [with_system_libmpdec="no"]) @@ -3031,7 +3047,8 @@ AC_MSG_RESULT($with_system_libmpdec) # Check for support for loadable sqlite extensions AC_MSG_CHECKING(for --enable-loadable-sqlite-extensions) AC_ARG_ENABLE(loadable-sqlite-extensions, - AS_HELP_STRING([--enable-loadable-sqlite-extensions], [support loadable extensions in _sqlite module]), + AS_HELP_STRING([--enable-loadable-sqlite-extensions], + [support loadable extensions in _sqlite module, see Doc/library/sqlite3.rst (default is no)]), [], [enable_loadable_sqlite_extensions="no"]) @@ -3068,7 +3085,7 @@ fi # Check for --with-dbmliborder AC_MSG_CHECKING(for --with-dbmliborder) AC_ARG_WITH(dbmliborder, - AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [order to check db backends for dbm. Valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), + AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), [ if test x$with_dbmliborder = xyes then @@ -3240,8 +3257,8 @@ fi AH_TEMPLATE(ENABLE_IPV6, [Define if --enable-ipv6 is specified]) AC_MSG_CHECKING([if --enable-ipv6 is specified]) AC_ARG_ENABLE(ipv6, -[ --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support], + AS_HELP_STRING([--enable-ipv6], + [enable ipv6 (with ipv4) support, see Doc/library/socket.rst (default is yes if supported)]), [ case "$enableval" in no) AC_MSG_RESULT(no) @@ -3412,7 +3429,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ /* CAN_RAW_FD_FRAMES available check */ # Check for --with-doc-strings AC_MSG_CHECKING(for --with-doc-strings) AC_ARG_WITH(doc-strings, - AS_HELP_STRING([--with(out)-doc-strings], [disable/enable documentation strings])) + AS_HELP_STRING([--with-doc-strings], [enable documentation strings (default is yes)])) if test -z "$with_doc_strings" then with_doc_strings="yes" @@ -3427,7 +3444,7 @@ AC_MSG_RESULT($with_doc_strings) # Check for Python-specific malloc support AC_MSG_CHECKING(for --with-pymalloc) AC_ARG_WITH(pymalloc, - AS_HELP_STRING([--with(out)-pymalloc], [disable/enable specialized mallocs])) + AS_HELP_STRING([--with-pymalloc], [enable specialized mallocs (default is yes)])) if test -z "$with_pymalloc" then @@ -3443,8 +3460,8 @@ AC_MSG_RESULT($with_pymalloc) # Check for --with-c-locale-coercion AC_MSG_CHECKING(for --with-c-locale-coercion) AC_ARG_WITH(c-locale-coercion, - AS_HELP_STRING([--with(out)-c-locale-coercion], - [disable/enable C locale coercion to a UTF-8 based locale])) + AS_HELP_STRING([--with-c-locale-coercion], + [enable C locale coercion to a UTF-8 based locale (default is yes)])) if test -z "$with_c_locale_coercion" then @@ -3460,7 +3477,7 @@ AC_MSG_RESULT($with_c_locale_coercion) # Check for Valgrind support AC_MSG_CHECKING([for --with-valgrind]) AC_ARG_WITH([valgrind], - AS_HELP_STRING([--with-valgrind], [Enable Valgrind support]),, + AS_HELP_STRING([--with-valgrind], [enable Valgrind support (default is no)]),, with_valgrind=no) AC_MSG_RESULT([$with_valgrind]) if test "$with_valgrind" != no; then @@ -3474,7 +3491,7 @@ fi # Check for DTrace support AC_MSG_CHECKING(for --with-dtrace) AC_ARG_WITH(dtrace, - AS_HELP_STRING([--with(out)-dtrace],[disable/enable DTrace support]),, + AS_HELP_STRING([--with-dtrace],[enable DTrace support (default is no)]),, with_dtrace=no) AC_MSG_RESULT($with_dtrace) @@ -4321,7 +4338,7 @@ Darwin) ;; esac AC_MSG_CHECKING(for --with-libm=STRING) AC_ARG_WITH(libm, - AS_HELP_STRING([--with-libm=STRING], [math library]), + AS_HELP_STRING([--with-libm=STRING], [override libm math library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBM= @@ -4337,7 +4354,7 @@ fi], AC_SUBST(LIBC) AC_MSG_CHECKING(for --with-libc=STRING) AC_ARG_WITH(libc, - AS_HELP_STRING([--with-libc=STRING], [C library]), + AS_HELP_STRING([--with-libc=STRING], [override libc C library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBC= @@ -4555,7 +4572,7 @@ AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTL # determine what size digit to use for Python's longs AC_MSG_CHECKING([digit size for Python's longs]) AC_ARG_ENABLE(big-digits, -AS_HELP_STRING([--enable-big-digits@<:@=BITS@:>@],[use big digits for Python longs [[BITS=30]]]), +AS_HELP_STRING([--enable-big-digits@<:@=15|30@:>@],[use big digits (30 or 15 bits) for Python longs (default is system-dependent)]]), [case $enable_big_digits in yes) enable_big_digits=30 ;; @@ -5267,8 +5284,8 @@ fi # Check for --with-computed-gotos AC_MSG_CHECKING(for --with-computed-gotos) AC_ARG_WITH(computed-gotos, - AS_HELP_STRING([--with(out)-computed-gotos], - [Use computed gotos in evaluation loop (enabled by default on supported compilers)]), + AS_HELP_STRING([--with-computed-gotos], + [enable computed gotos in evaluation loop (enabled by default on supported compilers)]), [ if test "$withval" = yes then @@ -5464,8 +5481,8 @@ fi # ensurepip option AC_MSG_CHECKING(for ensurepip) AC_ARG_WITH(ensurepip, - [AS_HELP_STRING([--with(out)-ensurepip=@<:@=upgrade@:>@], - ["install" or "upgrade" using bundled pip])], + [AS_HELP_STRING([--with-ensurepip@<:@=install|upgrade|no@:>@], + ["install" or "upgrade" using bundled pip (default is upgrade)])], [], [with_ensurepip=upgrade]) AS_CASE($with_ensurepip, @@ -5621,11 +5638,11 @@ AH_TEMPLATE(PY_SSL_DEFAULT_CIPHER_STRING, AC_MSG_CHECKING(for --with-ssl-default-suites) AC_ARG_WITH(ssl-default-suites, AS_HELP_STRING([--with-ssl-default-suites=@<:@python|openssl|STRING@:>@], - [Override default cipher suites string, + [override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a custom string, - PROTOCOL_SSLv2 ignores the setting]), + PROTOCOL_SSLv2 ignores the setting, see Doc/library/ssl.rst]), [ AC_MSG_RESULT($withval) case "$withval" in diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4 index 28e48cbefb68a..2846fd14c49de 100644 --- a/m4/ax_check_openssl.m4 +++ b/m4/ax_check_openssl.m4 @@ -39,7 +39,7 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ found=false AC_ARG_WITH([openssl], [AS_HELP_STRING([--with-openssl=DIR], - [root of the OpenSSL directory])], + [override root of the OpenSSL directory to DIR])], [ case "$withval" in "" | y | ye | yes | n | no) From webhook-mailer at python.org Tue Jan 14 02:50:06 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 Jan 2020 07:50:06 -0000 Subject: [Python-checkins] bpo-39259: smtp.SMTP/SMTP_SSL now reject timeout = 0 (GH-17958) Message-ID: https://github.com/python/cpython/commit/62e3973395fb9fab2eb8f651bcd0fea4e695e1cf commit: 62e3973395fb9fab2eb8f651bcd0fea4e695e1cf branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-14T08:49:59+01:00 summary: bpo-39259: smtp.SMTP/SMTP_SSL now reject timeout = 0 (GH-17958) files: A Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst M Doc/library/smtplib.rst M Doc/whatsnew/3.9.rst M Lib/smtplib.py M Lib/test/test_smtplib.py diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 6176c35a0e4a5..f6ac123823b69 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -70,6 +70,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). .. versionadded:: 3.5 The SMTPUTF8 extension (:rfc:`6531`) is now supported. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket .. class:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, \ certfile=None [, timeout], context=None, \ @@ -108,6 +111,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket .. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 859bf440f89af..00409af4387d8 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -259,6 +259,13 @@ now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative import attempts. (Contributed by Ngalim Siregar in :issue:`37444`.) +smtplib +------- + +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + signal ------ diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 6513842eb6c61..4d5cdb5ac0ad9 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -303,6 +303,8 @@ def _print_debug(self, *args): def _get_socket(self, host, port, timeout): # This makes it simpler for SMTP_SSL to use the SMTP connect code # and just alter the socket connection bit. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if self.debuglevel > 0: self._print_debug('connect: to', (host, port), self.source_address) return socket.create_connection((host, port), timeout, @@ -1030,13 +1032,12 @@ def __init__(self, host='', port=0, local_hostname=None, keyfile=keyfile) self.context = context SMTP.__init__(self, host, port, local_hostname, timeout, - source_address) + source_address) def _get_socket(self, host, port, timeout): if self.debuglevel > 0: self._print_debug('connect:', (host, port)) - new_socket = socket.create_connection((host, port), timeout, - self.source_address) + new_socket = super()._get_socket(host, port, timeout) new_socket = self.context.wrap_socket(new_socket, server_hostname=self._host) return new_socket @@ -1065,15 +1066,15 @@ class LMTP(SMTP): ehlo_msg = "lhlo" def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): + source_address=None): """Initialize a new instance.""" - SMTP.__init__(self, host, port, local_hostname=local_hostname, - source_address=source_address) + super().__init__(host, port, local_hostname=local_hostname, + source_address=source_address) def connect(self, host='localhost', port=0, source_address=None): """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" if host[0] != '/': - return SMTP.connect(self, host, port, source_address=source_address) + return super().connect(host, port, source_address=source_address) # Handle Unix-domain sockets. try: diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index faf013ac9a66e..cc5c4b1346488 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -122,6 +122,11 @@ def testTimeoutNone(self): self.assertIsNone(smtp.sock.gettimeout()) smtp.close() + def testTimeoutZero(self): + mock_socket.reply_with(b"220 Hola mundo") + with self.assertRaises(ValueError): + smtplib.SMTP(HOST, self.port, timeout=0) + def testTimeoutValue(self): mock_socket.reply_with(b"220 Hola mundo") smtp = smtplib.SMTP(HOST, self.port, timeout=30) diff --git a/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst b/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst new file mode 100644 index 0000000000000..6cc490eb35e6e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst @@ -0,0 +1,3 @@ +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 14 05:13:10 2020 From: webhook-mailer at python.org (Mark Shannon) Date: Tue, 14 Jan 2020 10:13:10 -0000 Subject: [Python-checkins] bpo-39156: Break up COMPARE_OP into four logically distinct opcodes. (GH-17754) Message-ID: https://github.com/python/cpython/commit/9af0e47b1705457bb6b327c197f2ec5737a1d8f6 commit: 9af0e47b1705457bb6b327c197f2ec5737a1d8f6 branch: master author: Mark Shannon committer: GitHub date: 2020-01-14T10:12:45Z summary: bpo-39156: Break up COMPARE_OP into four logically distinct opcodes. (GH-17754) Break up COMPARE_OP into four logically distinct opcodes: * COMPARE_OP for rich comparisons * IS_OP for 'is' and 'is not' tests * CONTAINS_OP for 'in' and 'is not' tests * JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. files: A Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst M Doc/library/dis.rst M Include/opcode.h M Lib/importlib/_bootstrap_external.py M Lib/opcode.py M Lib/test/test_dis.py M Lib/test/test_peepholer.py M Lib/test/test_positional_only_arg.py M PC/launcher.c M Python/ceval.c M Python/compile.c M Python/importlib.h M Python/importlib_external.h M Python/importlib_zipimport.h M Python/opcode_targets.h M Python/peephole.c M Tools/scripts/generate_opcode_h.py diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 1f540d95078f6..d3124f973f1d0 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -927,6 +927,20 @@ All of the following opcodes use their arguments. ``cmp_op[opname]``. +.. opcode:: IS_OP (invert) + + Performs ``is`` comparison, or ``is not`` if ``invert`` is 1. + + .. versionadded:: 3.9 + + +.. opcode:: CONTAINS_OP (invert) + + Performs ``in`` comparison, or ``not in`` if ``invert`` is 1. + + .. versionadded:: 3.9 + + .. opcode:: IMPORT_NAME (namei) Imports the module ``co_names[namei]``. TOS and TOS1 are popped and provide @@ -961,6 +975,13 @@ All of the following opcodes use their arguments. .. versionadded:: 3.1 +.. opcode:: JUMP_IF_NOT_EXC_MATCH (target) + + Tests whether the second value on the stack is an exception matching TOS, + and jumps if it is not. Pops two values from the stack. + + .. versionadded:: 3.9 + .. opcode:: JUMP_IF_TRUE_OR_POP (target) diff --git a/Include/opcode.h b/Include/opcode.h index 712664224dc8e..05354847958f7 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -93,6 +93,9 @@ extern "C" { #define POP_JUMP_IF_FALSE 114 #define POP_JUMP_IF_TRUE 115 #define LOAD_GLOBAL 116 +#define IS_OP 117 +#define CONTAINS_OP 118 +#define JUMP_IF_NOT_EXC_MATCH 121 #define SETUP_FINALLY 122 #define LOAD_FAST 124 #define STORE_FAST 125 @@ -132,11 +135,6 @@ extern "C" { remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index d62c6cb77cddd..b86612beac841 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -274,6 +274,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.9a0 3420 (add LOAD_ASSERTION_ERROR #34880) # Python 3.9a0 3421 (simplified bytecode for with blocks #32949) # Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) +# Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -282,7 +283,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3422).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3423).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/opcode.py b/Lib/opcode.py index 1898a38abbb0d..e31563bfbcb43 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -21,8 +21,7 @@ except ImportError: pass -cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', - 'is not', 'exception match', 'BAD') +cmp_op = ('<', '<=', '==', '!=', '>', '>=') hasconst = [] hasname = [] @@ -159,6 +158,10 @@ def jabs_op(name, op): name_op('LOAD_GLOBAL', 116) # Index in name list +def_op('IS_OP', 117) +def_op('CONTAINS_OP', 118) + +jabs_op('JUMP_IF_NOT_EXC_MATCH', 121) jrel_op('SETUP_FINALLY', 122) # Distance to target address def_op('LOAD_FAST', 124) # Local variable number diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 313eefd9b8859..ac5836d288978 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -278,34 +278,33 @@ def bug1333982(x=[]): --> 6 BINARY_TRUE_DIVIDE 8 POP_TOP 10 POP_BLOCK - 12 JUMP_FORWARD 44 (to 58) + 12 JUMP_FORWARD 42 (to 56) %3d >> 14 DUP_TOP 16 LOAD_GLOBAL 0 (Exception) - 18 COMPARE_OP 10 (exception match) - 20 POP_JUMP_IF_FALSE 56 - 22 POP_TOP - 24 STORE_FAST 0 (e) - 26 POP_TOP - 28 SETUP_FINALLY 18 (to 48) - -%3d 30 LOAD_FAST 0 (e) - 32 LOAD_ATTR 1 (__traceback__) - 34 STORE_FAST 1 (tb) - 36 POP_BLOCK - 38 POP_EXCEPT - 40 LOAD_CONST 0 (None) - 42 STORE_FAST 0 (e) - 44 DELETE_FAST 0 (e) - 46 JUMP_FORWARD 10 (to 58) - >> 48 LOAD_CONST 0 (None) - 50 STORE_FAST 0 (e) - 52 DELETE_FAST 0 (e) - 54 RERAISE - >> 56 RERAISE - -%3d >> 58 LOAD_FAST 1 (tb) - 60 RETURN_VALUE + 18 JUMP_IF_NOT_EXC_MATCH 54 + 20 POP_TOP + 22 STORE_FAST 0 (e) + 24 POP_TOP + 26 SETUP_FINALLY 18 (to 46) + +%3d 28 LOAD_FAST 0 (e) + 30 LOAD_ATTR 1 (__traceback__) + 32 STORE_FAST 1 (tb) + 34 POP_BLOCK + 36 POP_EXCEPT + 38 LOAD_CONST 0 (None) + 40 STORE_FAST 0 (e) + 42 DELETE_FAST 0 (e) + 44 JUMP_FORWARD 10 (to 56) + >> 46 LOAD_CONST 0 (None) + 48 STORE_FAST 0 (e) + 50 DELETE_FAST 0 (e) + 52 RERAISE + >> 54 RERAISE + +%3d >> 56 LOAD_FAST 1 (tb) + 58 RETURN_VALUE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 3, @@ -506,7 +505,8 @@ def test_boundaries(self): def test_widths(self): for opcode, opname in enumerate(dis.opname): if opname in ('BUILD_MAP_UNPACK_WITH_CALL', - 'BUILD_TUPLE_UNPACK_WITH_CALL'): + 'BUILD_TUPLE_UNPACK_WITH_CALL', + 'JUMP_IF_NOT_EXC_MATCH'): continue with self.subTest(opname=opname): width = dis._OPNAME_WIDTH @@ -1045,63 +1045,62 @@ def jumpy(): Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=98, argval=202, argrepr='to 202', offset=102, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=200, argrepr='to 200', offset=102, starts_line=20, is_jump_target=True), Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=28, argval=146, argrepr='to 146', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=144, argrepr='to 144', offset=116, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=122, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=144, argval=144, argrepr='', offset=124, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=142, argval=142, argrepr='', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=190, argrepr='to 190', offset=142, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=174, argrepr='to 174', offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=162, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=130, starts_line=23, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=132, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), - Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=190, argrepr='to 190', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=174, starts_line=None, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=180, argval=180, argrepr='', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=True), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=190, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=192, starts_line=28, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=194, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=196, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=198, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=212, argrepr='to 212', offset=200, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=202, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=204, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=206, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=210, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=212, starts_line=None, is_jump_target=True), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=214, starts_line=None, is_jump_target=False) + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=210, argrepr='to 210', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=200, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=202, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=210, starts_line=None, is_jump_target=True), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 23cc36c605375..567e6a14361d1 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -65,14 +65,14 @@ def unot(x): self.check_lnotab(unot) def test_elim_inversion_of_is_or_in(self): - for line, cmp_op in ( - ('not a is b', 'is not',), - ('not a in b', 'not in',), - ('not a is not b', 'is',), - ('not a not in b', 'in',), + for line, cmp_op, invert in ( + ('not a is b', 'IS_OP', 1,), + ('not a is not b', 'IS_OP', 0,), + ('not a in b', 'CONTAINS_OP', 1,), + ('not a not in b', 'CONTAINS_OP', 0,), ): code = compile(line, '', 'single') - self.assertInBytecode(code, 'COMPARE_OP', cmp_op) + self.assertInBytecode(code, cmp_op, invert) self.check_lnotab(code) def test_global_as_constant(self): diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index bf332e552590b..0a9503e2025d6 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -434,11 +434,11 @@ def g(): def f(x: not (int is int), /): ... # without constant folding we end up with - # COMPARE_OP(is), UNARY_NOT - # with constant folding we should expect a COMPARE_OP(is not) + # COMPARE_OP(is), IS_OP (0) + # with constant folding we should expect a IS_OP (1) codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] self.assertNotIn(('UNARY_NOT', None), codes) - self.assertIn(('COMPARE_OP', 'is not'), codes) + self.assertIn(('IS_OP', 1), codes) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst new file mode 100644 index 0000000000000..f8d1a1a88a78f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst @@ -0,0 +1,9 @@ +Split the COMPARE_OP bytecode instruction into four distinct instructions. + +* COMPARE_OP for rich comparisons +* IS_OP for 'is' and 'is not' tests +* CONTAINS_OP for 'in' and 'is not' tests +* JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. + +This improves the clarity of the interpreter and should provide a modest +speedup. diff --git a/PC/launcher.c b/PC/launcher.c index 2749a4e705467..fd5ad0ab1a1d9 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1247,6 +1247,7 @@ static PYC_MAGIC magic_values[] = { { 3360, 3379, L"3.6" }, { 3390, 3399, L"3.7" }, { 3400, 3419, L"3.8" }, + { 3420, 3429, L"3.9" }, { 0 } }; @@ -1830,7 +1831,7 @@ process(int argc, wchar_t ** argv) #if !defined(VENV_REDIRECT) /* bpo-35811: The __PYVENV_LAUNCHER__ variable is used to - * override sys.executable and locate the original prefix path. + * override sys.executable and locate the original prefix path. * However, if it is silently inherited by a non-venv Python * process, that process will believe it is running in the venv * still. This is the only place where *we* can clear it (that is, diff --git a/Python/ceval.c b/Python/ceval.c index e8931c88820d5..096645aeebfb9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -67,7 +67,6 @@ static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *); static void dtrace_function_entry(PyFrameObject *); static void dtrace_function_return(PyFrameObject *); -static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *); static PyObject * import_name(PyThreadState *, PyFrameObject *, PyObject *, PyObject *, PyObject *); static PyObject * import_from(PyThreadState *, PyObject *, PyObject *); @@ -2897,12 +2896,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(COMPARE_OP): { + assert(oparg <= Py_GE); PyObject *right = POP(); PyObject *left = TOP(); - PyObject *res = cmp_outcome(tstate, oparg, left, right); + PyObject *res = PyObject_RichCompare(left, right, oparg); + SET_TOP(res); Py_DECREF(left); Py_DECREF(right); - SET_TOP(res); if (res == NULL) goto error; PREDICT(POP_JUMP_IF_FALSE); @@ -2910,6 +2910,81 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } + case TARGET(IS_OP): { + PyObject *right = POP(); + PyObject *left = TOP(); + int res = (left == right)^oparg; + PyObject *b = res ? Py_True : Py_False; + Py_INCREF(b); + SET_TOP(b); + Py_DECREF(left); + Py_DECREF(right); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + + case TARGET(CONTAINS_OP): { + PyObject *right = POP(); + PyObject *left = POP(); + int res = PySequence_Contains(right, left); + Py_DECREF(left); + Py_DECREF(right); + if (res < 0) { + goto error; + } + PyObject *b = (res^oparg) ? Py_True : Py_False; + Py_INCREF(b); + PUSH(b); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + +#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ + "BaseException is not allowed" + + case TARGET(JUMP_IF_NOT_EXC_MATCH): { + PyObject *right = POP(); + PyObject *left = POP(); + if (PyTuple_Check(right)) { + Py_ssize_t i, length; + length = PyTuple_GET_SIZE(right); + for (i = 0; i < length; i++) { + PyObject *exc = PyTuple_GET_ITEM(right, i); + if (!PyExceptionClass_Check(exc)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + } + else { + if (!PyExceptionClass_Check(right)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + int res = PyErr_GivenExceptionMatches(left, right); + Py_DECREF(left); + Py_DECREF(right); + if (res > 0) { + /* Exception matches -- Do nothing */; + } + else if (res == 0) { + JUMPTO(oparg); + } + else { + goto error; + } + DISPATCH(); + } + case TARGET(IMPORT_NAME): { PyObject *name = GETITEM(names, oparg); PyObject *fromlist = POP(); @@ -4951,62 +5026,6 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) return 1; } - -#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ - "BaseException is not allowed" - -static PyObject * -cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w) -{ - int res = 0; - switch (op) { - case PyCmp_IS: - res = (v == w); - break; - case PyCmp_IS_NOT: - res = (v != w); - break; - case PyCmp_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - break; - case PyCmp_NOT_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - res = !res; - break; - case PyCmp_EXC_MATCH: - if (PyTuple_Check(w)) { - Py_ssize_t i, length; - length = PyTuple_Size(w); - for (i = 0; i < length; i += 1) { - PyObject *exc = PyTuple_GET_ITEM(w, i); - if (!PyExceptionClass_Check(exc)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - } - else { - if (!PyExceptionClass_Check(w)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - res = PyErr_GivenExceptionMatches(v, w); - break; - default: - return PyObject_RichCompare(v, w, op); - } - v = res ? Py_True : Py_False; - Py_INCREF(v); - return v; -} - static PyObject * import_name(PyThreadState *tstate, PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *level) diff --git a/Python/compile.c b/Python/compile.c index ce6f18a1f571d..3138a3f50dd1c 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1021,7 +1021,11 @@ stack_effect(int opcode, int oparg, int jump) case LOAD_ATTR: return 0; case COMPARE_OP: + case IS_OP: + case CONTAINS_OP: return -1; + case JUMP_IF_NOT_EXC_MATCH: + return -2; case IMPORT_NAME: return -1; case IMPORT_FROM: @@ -1502,6 +1506,12 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) return 0; \ } + +#define ADDOP_COMPARE(C, CMP) { \ + if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \ + return 0; \ +} + /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use the ASDL name to synthesize the name of the C type and the visit function. */ @@ -2433,35 +2443,49 @@ check_compare(struct compiler *c, expr_ty e) return 1; } -static int -cmpop(cmpop_ty op) +static int compiler_addcompare(struct compiler *c, cmpop_ty op) { + int cmp; switch (op) { case Eq: - return PyCmp_EQ; + cmp = Py_EQ; + break; case NotEq: - return PyCmp_NE; + cmp = Py_NE; + break; case Lt: - return PyCmp_LT; + cmp = Py_LT; + break; case LtE: - return PyCmp_LE; + cmp = Py_LE; + break; case Gt: - return PyCmp_GT; + cmp = Py_GT; + break; case GtE: - return PyCmp_GE; + cmp = Py_GE; + break; case Is: - return PyCmp_IS; + ADDOP_I(c, IS_OP, 0); + return 1; case IsNot: - return PyCmp_IS_NOT; + ADDOP_I(c, IS_OP, 1); + return 1; case In: - return PyCmp_IN; + ADDOP_I(c, CONTAINS_OP, 0); + return 1; case NotIn: - return PyCmp_NOT_IN; + ADDOP_I(c, CONTAINS_OP, 1); + return 1; default: - return PyCmp_BAD; + Py_UNREACHABLE(); } + ADDOP_I(c, COMPARE_OP, cmp); + return 1; } + + static int compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) { @@ -2526,14 +2550,12 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next); basicblock *end = compiler_new_block(c); if (end == NULL) @@ -2976,8 +2998,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L1: DUP ) [tb, val, exc, exc] ) - [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1 - [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 ) + [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1 [tb, val, exc] POP [tb, val] (or POP if no V1) [tb] POP @@ -3029,8 +3050,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) if (handler->v.ExceptHandler.type) { ADDOP(c, DUP_TOP); VISIT(c, expr, handler->v.ExceptHandler.type); - ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); - ADDOP_JABS(c, POP_JUMP_IF_FALSE, except); + ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except); } ADDOP(c, POP_TOP); if (handler->v.ExceptHandler.name) { @@ -3873,8 +3893,7 @@ compiler_compare(struct compiler *c, expr_ty e) n = asdl_seq_LEN(e->v.Compare.ops) - 1; if (n == 0) { VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0)); } else { basicblock *cleanup = compiler_new_block(c); @@ -3885,14 +3904,12 @@ compiler_compare(struct compiler *c, expr_ty e) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); basicblock *end = compiler_new_block(c); if (end == NULL) return 0; diff --git a/Python/importlib.h b/Python/importlib.h index dea619e29d755..63e2064889b92 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -121,7 +121,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, 67,0,0,0,115,60,0,0,0,116,0,160,1,161,0,125, 1,124,0,106,2,125,2,116,3,160,4,124,2,161,1,125, - 3,124,3,100,0,107,8,114,36,100,1,83,0,124,3,106, + 3,124,3,100,0,117,0,114,36,100,1,83,0,124,3,106, 2,125,2,124,2,124,1,107,2,114,14,100,2,83,0,113, 14,100,0,83,0,41,3,78,70,84,41,5,114,23,0,0, 0,218,9,103,101,116,95,105,100,101,110,116,114,26,0,0, @@ -303,461 +303,460 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,114,49,0,0,0,141,0,0,0,115,6,0,0, 0,8,2,8,4,8,4,114,49,0,0,0,99,1,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, - 0,67,0,0,0,115,138,0,0,0,116,0,160,1,161,0, - 1,0,122,114,122,14,116,2,124,0,25,0,131,0,125,1, - 87,0,110,24,4,0,116,3,107,10,114,48,1,0,1,0, - 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, - 107,8,114,112,116,4,100,1,107,8,114,76,116,5,124,0, - 131,1,125,1,110,8,116,6,124,0,131,1,125,1,124,0, - 102,1,100,2,100,3,132,1,125,2,116,7,160,8,124,1, - 124,2,161,2,116,2,124,0,60,0,87,0,116,0,160,9, - 161,0,1,0,110,10,116,0,160,9,161,0,1,0,48,0, - 124,1,83,0,41,4,122,139,71,101,116,32,111,114,32,99, - 114,101,97,116,101,32,116,104,101,32,109,111,100,117,108,101, - 32,108,111,99,107,32,102,111,114,32,97,32,103,105,118,101, - 110,32,109,111,100,117,108,101,32,110,97,109,101,46,10,10, - 32,32,32,32,65,99,113,117,105,114,101,47,114,101,108,101, - 97,115,101,32,105,110,116,101,114,110,97,108,108,121,32,116, - 104,101,32,103,108,111,98,97,108,32,105,109,112,111,114,116, - 32,108,111,99,107,32,116,111,32,112,114,111,116,101,99,116, - 10,32,32,32,32,95,109,111,100,117,108,101,95,108,111,99, - 107,115,46,78,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,8,0,0,0,83,0,0,0,115,56,0, - 0,0,116,0,160,1,161,0,1,0,122,32,116,2,160,3, - 124,1,161,1,124,0,107,8,114,30,116,2,124,1,61,0, - 87,0,116,0,160,4,161,0,1,0,110,10,116,0,160,4, - 161,0,1,0,48,0,100,0,83,0,114,13,0,0,0,41, - 5,218,4,95,105,109,112,218,12,97,99,113,117,105,114,101, - 95,108,111,99,107,218,13,95,109,111,100,117,108,101,95,108, - 111,99,107,115,114,34,0,0,0,218,12,114,101,108,101,97, - 115,101,95,108,111,99,107,41,2,218,3,114,101,102,114,17, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,2,99,98,176,0,0,0,115,12,0,0,0,0, - 1,8,1,2,4,14,1,8,2,10,0,122,28,95,103,101, - 116,95,109,111,100,117,108,101,95,108,111,99,107,46,60,108, - 111,99,97,108,115,62,46,99,98,41,10,114,56,0,0,0, - 114,57,0,0,0,114,58,0,0,0,218,8,75,101,121,69, - 114,114,111,114,114,23,0,0,0,114,48,0,0,0,114,20, - 0,0,0,218,8,95,119,101,97,107,114,101,102,114,60,0, - 0,0,114,59,0,0,0,41,3,114,17,0,0,0,114,24, - 0,0,0,114,61,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,52,0,0,0,157,0,0,0, - 115,30,0,0,0,0,6,8,1,2,1,2,1,14,1,14, - 1,10,2,8,1,8,1,10,2,8,2,12,11,18,2,10, - 0,10,2,114,52,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, - 0,115,54,0,0,0,116,0,124,0,131,1,125,1,122,12, - 124,1,160,1,161,0,1,0,87,0,110,20,4,0,116,2, - 107,10,114,40,1,0,1,0,1,0,89,0,110,10,48,0, - 124,1,160,3,161,0,1,0,100,1,83,0,41,2,122,189, - 65,99,113,117,105,114,101,115,32,116,104,101,110,32,114,101, - 108,101,97,115,101,115,32,116,104,101,32,109,111,100,117,108, - 101,32,108,111,99,107,32,102,111,114,32,97,32,103,105,118, - 101,110,32,109,111,100,117,108,101,32,110,97,109,101,46,10, - 10,32,32,32,32,84,104,105,115,32,105,115,32,117,115,101, - 100,32,116,111,32,101,110,115,117,114,101,32,97,32,109,111, - 100,117,108,101,32,105,115,32,99,111,109,112,108,101,116,101, - 108,121,32,105,110,105,116,105,97,108,105,122,101,100,44,32, - 105,110,32,116,104,101,10,32,32,32,32,101,118,101,110,116, - 32,105,116,32,105,115,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,32,98,121,32,97,110,111,116,104,101,114, - 32,116,104,114,101,97,100,46,10,32,32,32,32,78,41,4, - 114,52,0,0,0,114,38,0,0,0,114,19,0,0,0,114, - 39,0,0,0,41,2,114,17,0,0,0,114,24,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 19,95,108,111,99,107,95,117,110,108,111,99,107,95,109,111, - 100,117,108,101,194,0,0,0,115,12,0,0,0,0,6,8, - 1,2,1,12,1,14,3,6,2,114,64,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,79,0,0,0,115,10,0,0,0,124,0,124,1, - 124,2,142,1,83,0,41,1,97,46,1,0,0,114,101,109, - 111,118,101,95,105,109,112,111,114,116,108,105,98,95,102,114, - 97,109,101,115,32,105,110,32,105,109,112,111,114,116,46,99, - 32,119,105,108,108,32,97,108,119,97,121,115,32,114,101,109, - 111,118,101,32,115,101,113,117,101,110,99,101,115,10,32,32, - 32,32,111,102,32,105,109,112,111,114,116,108,105,98,32,102, - 114,97,109,101,115,32,116,104,97,116,32,101,110,100,32,119, - 105,116,104,32,97,32,99,97,108,108,32,116,111,32,116,104, - 105,115,32,102,117,110,99,116,105,111,110,10,10,32,32,32, - 32,85,115,101,32,105,116,32,105,110,115,116,101,97,100,32, - 111,102,32,97,32,110,111,114,109,97,108,32,99,97,108,108, - 32,105,110,32,112,108,97,99,101,115,32,119,104,101,114,101, - 32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,105, - 109,112,111,114,116,108,105,98,10,32,32,32,32,102,114,97, - 109,101,115,32,105,110,116,114,111,100,117,99,101,115,32,117, - 110,119,97,110,116,101,100,32,110,111,105,115,101,32,105,110, - 116,111,32,116,104,101,32,116,114,97,99,101,98,97,99,107, - 32,40,101,46,103,46,32,119,104,101,110,32,101,120,101,99, - 117,116,105,110,103,10,32,32,32,32,109,111,100,117,108,101, - 32,99,111,100,101,41,10,32,32,32,32,114,10,0,0,0, - 41,3,218,1,102,114,54,0,0,0,90,4,107,119,100,115, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 25,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109, - 101,115,95,114,101,109,111,118,101,100,211,0,0,0,115,2, - 0,0,0,0,8,114,66,0,0,0,114,37,0,0,0,41, - 1,218,9,118,101,114,98,111,115,105,116,121,99,1,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,4,0,0, - 0,71,0,0,0,115,54,0,0,0,116,0,106,1,106,2, - 124,1,107,5,114,50,124,0,160,3,100,1,161,1,115,30, - 100,2,124,0,23,0,125,0,116,4,124,0,106,5,124,2, - 142,0,116,0,106,6,100,3,141,2,1,0,100,4,83,0, - 41,5,122,61,80,114,105,110,116,32,116,104,101,32,109,101, - 115,115,97,103,101,32,116,111,32,115,116,100,101,114,114,32, - 105,102,32,45,118,47,80,89,84,72,79,78,86,69,82,66, - 79,83,69,32,105,115,32,116,117,114,110,101,100,32,111,110, - 46,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, - 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,15, - 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, - 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, - 5,112,114,105,110,116,114,44,0,0,0,218,6,115,116,100, - 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,67, - 0,0,0,114,54,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,16,95,118,101,114,98,111,115, - 101,95,109,101,115,115,97,103,101,222,0,0,0,115,8,0, - 0,0,0,2,12,1,10,1,8,1,114,75,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, - 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, - 2,1,0,124,1,83,0,41,3,122,49,68,101,99,111,114, - 97,116,111,114,32,116,111,32,118,101,114,105,102,121,32,116, - 104,101,32,110,97,109,101,100,32,109,111,100,117,108,101,32, - 105,115,32,98,117,105,108,116,45,105,110,46,99,2,0,0, + 0,67,0,0,0,115,136,0,0,0,116,0,160,1,161,0, + 1,0,122,112,122,14,116,2,124,0,25,0,131,0,125,1, + 87,0,110,22,4,0,116,3,121,46,1,0,1,0,1,0, + 100,1,125,1,89,0,110,2,48,0,124,1,100,1,117,0, + 114,110,116,4,100,1,117,0,114,74,116,5,124,0,131,1, + 125,1,110,8,116,6,124,0,131,1,125,1,124,0,102,1, + 100,2,100,3,132,1,125,2,116,7,160,8,124,1,124,2, + 161,2,116,2,124,0,60,0,87,0,116,0,160,9,161,0, + 1,0,110,10,116,0,160,9,161,0,1,0,48,0,124,1, + 83,0,41,4,122,139,71,101,116,32,111,114,32,99,114,101, + 97,116,101,32,116,104,101,32,109,111,100,117,108,101,32,108, + 111,99,107,32,102,111,114,32,97,32,103,105,118,101,110,32, + 109,111,100,117,108,101,32,110,97,109,101,46,10,10,32,32, + 32,32,65,99,113,117,105,114,101,47,114,101,108,101,97,115, + 101,32,105,110,116,101,114,110,97,108,108,121,32,116,104,101, + 32,103,108,111,98,97,108,32,105,109,112,111,114,116,32,108, + 111,99,107,32,116,111,32,112,114,111,116,101,99,116,10,32, + 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, + 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,83,0,0,0,115,56,0,0,0, + 116,0,160,1,161,0,1,0,122,32,116,2,160,3,124,1, + 161,1,124,0,117,0,114,30,116,2,124,1,61,0,87,0, + 116,0,160,4,161,0,1,0,110,10,116,0,160,4,161,0, + 1,0,48,0,100,0,83,0,114,13,0,0,0,41,5,218, + 4,95,105,109,112,218,12,97,99,113,117,105,114,101,95,108, + 111,99,107,218,13,95,109,111,100,117,108,101,95,108,111,99, + 107,115,114,34,0,0,0,218,12,114,101,108,101,97,115,101, + 95,108,111,99,107,41,2,218,3,114,101,102,114,17,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,2,99,98,176,0,0,0,115,12,0,0,0,0,1,8, + 1,2,4,14,1,8,2,10,0,122,28,95,103,101,116,95, + 109,111,100,117,108,101,95,108,111,99,107,46,60,108,111,99, + 97,108,115,62,46,99,98,41,10,114,56,0,0,0,114,57, + 0,0,0,114,58,0,0,0,218,8,75,101,121,69,114,114, + 111,114,114,23,0,0,0,114,48,0,0,0,114,20,0,0, + 0,218,8,95,119,101,97,107,114,101,102,114,60,0,0,0, + 114,59,0,0,0,41,3,114,17,0,0,0,114,24,0,0, + 0,114,61,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,52,0,0,0,157,0,0,0,115,30, + 0,0,0,0,6,8,1,2,1,2,1,14,1,12,1,10, + 2,8,1,8,1,10,2,8,2,12,11,18,2,10,0,10, + 2,114,52,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 52,0,0,0,116,0,124,0,131,1,125,1,122,12,124,1, + 160,1,161,0,1,0,87,0,110,18,4,0,116,2,121,38, + 1,0,1,0,1,0,89,0,110,10,48,0,124,1,160,3, + 161,0,1,0,100,1,83,0,41,2,122,189,65,99,113,117, + 105,114,101,115,32,116,104,101,110,32,114,101,108,101,97,115, + 101,115,32,116,104,101,32,109,111,100,117,108,101,32,108,111, + 99,107,32,102,111,114,32,97,32,103,105,118,101,110,32,109, + 111,100,117,108,101,32,110,97,109,101,46,10,10,32,32,32, + 32,84,104,105,115,32,105,115,32,117,115,101,100,32,116,111, + 32,101,110,115,117,114,101,32,97,32,109,111,100,117,108,101, + 32,105,115,32,99,111,109,112,108,101,116,101,108,121,32,105, + 110,105,116,105,97,108,105,122,101,100,44,32,105,110,32,116, + 104,101,10,32,32,32,32,101,118,101,110,116,32,105,116,32, + 105,115,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,32,98,121,32,97,110,111,116,104,101,114,32,116,104,114, + 101,97,100,46,10,32,32,32,32,78,41,4,114,52,0,0, + 0,114,38,0,0,0,114,19,0,0,0,114,39,0,0,0, + 41,2,114,17,0,0,0,114,24,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,19,95,108,111, + 99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101, + 194,0,0,0,115,12,0,0,0,0,6,8,1,2,1,12, + 1,12,3,6,2,114,64,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,79, + 0,0,0,115,10,0,0,0,124,0,124,1,124,2,142,1, + 83,0,41,1,97,46,1,0,0,114,101,109,111,118,101,95, + 105,109,112,111,114,116,108,105,98,95,102,114,97,109,101,115, + 32,105,110,32,105,109,112,111,114,116,46,99,32,119,105,108, + 108,32,97,108,119,97,121,115,32,114,101,109,111,118,101,32, + 115,101,113,117,101,110,99,101,115,10,32,32,32,32,111,102, + 32,105,109,112,111,114,116,108,105,98,32,102,114,97,109,101, + 115,32,116,104,97,116,32,101,110,100,32,119,105,116,104,32, + 97,32,99,97,108,108,32,116,111,32,116,104,105,115,32,102, + 117,110,99,116,105,111,110,10,10,32,32,32,32,85,115,101, + 32,105,116,32,105,110,115,116,101,97,100,32,111,102,32,97, + 32,110,111,114,109,97,108,32,99,97,108,108,32,105,110,32, + 112,108,97,99,101,115,32,119,104,101,114,101,32,105,110,99, + 108,117,100,105,110,103,32,116,104,101,32,105,109,112,111,114, + 116,108,105,98,10,32,32,32,32,102,114,97,109,101,115,32, + 105,110,116,114,111,100,117,99,101,115,32,117,110,119,97,110, + 116,101,100,32,110,111,105,115,101,32,105,110,116,111,32,116, + 104,101,32,116,114,97,99,101,98,97,99,107,32,40,101,46, + 103,46,32,119,104,101,110,32,101,120,101,99,117,116,105,110, + 103,10,32,32,32,32,109,111,100,117,108,101,32,99,111,100, + 101,41,10,32,32,32,32,114,10,0,0,0,41,3,218,1, + 102,114,54,0,0,0,90,4,107,119,100,115,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,25,95,99,97, + 108,108,95,119,105,116,104,95,102,114,97,109,101,115,95,114, + 101,109,111,118,101,100,211,0,0,0,115,2,0,0,0,0, + 8,114,66,0,0,0,114,37,0,0,0,41,1,218,9,118, + 101,114,98,111,115,105,116,121,99,1,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,4,0,0,0,71,0,0, + 0,115,54,0,0,0,116,0,106,1,106,2,124,1,107,5, + 114,50,124,0,160,3,100,1,161,1,115,30,100,2,124,0, + 23,0,125,0,116,4,124,0,106,5,124,2,142,0,116,0, + 106,6,100,3,141,2,1,0,100,4,83,0,41,5,122,61, + 80,114,105,110,116,32,116,104,101,32,109,101,115,115,97,103, + 101,32,116,111,32,115,116,100,101,114,114,32,105,102,32,45, + 118,47,80,89,84,72,79,78,86,69,82,66,79,83,69,32, + 105,115,32,116,117,114,110,101,100,32,111,110,46,41,2,250, + 1,35,122,7,105,109,112,111,114,116,32,122,2,35,32,41, + 1,90,4,102,105,108,101,78,41,7,114,15,0,0,0,218, + 5,102,108,97,103,115,218,7,118,101,114,98,111,115,101,218, + 10,115,116,97,114,116,115,119,105,116,104,218,5,112,114,105, + 110,116,114,44,0,0,0,218,6,115,116,100,101,114,114,41, + 3,218,7,109,101,115,115,97,103,101,114,67,0,0,0,114, + 54,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, + 115,115,97,103,101,222,0,0,0,115,8,0,0,0,0,2, + 12,1,10,1,8,1,114,75,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 3,0,0,0,115,26,0,0,0,135,0,102,1,100,1,100, + 2,132,8,125,1,116,0,124,1,136,0,131,2,1,0,124, + 1,83,0,41,3,122,49,68,101,99,111,114,97,116,111,114, + 32,116,111,32,118,101,114,105,102,121,32,116,104,101,32,110, + 97,109,101,100,32,109,111,100,117,108,101,32,105,115,32,98, + 117,105,108,116,45,105,110,46,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0, + 0,115,38,0,0,0,124,1,116,0,106,1,118,1,114,28, + 116,2,100,1,160,3,124,1,161,1,124,1,100,2,141,2, + 130,1,136,0,124,0,124,1,131,2,83,0,41,3,78,250, + 29,123,33,114,125,32,105,115,32,110,111,116,32,97,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,114,16, + 0,0,0,41,4,114,15,0,0,0,218,20,98,117,105,108, + 116,105,110,95,109,111,100,117,108,101,95,110,97,109,101,115, + 218,11,73,109,112,111,114,116,69,114,114,111,114,114,44,0, + 0,0,169,2,114,30,0,0,0,218,8,102,117,108,108,110, + 97,109,101,169,1,218,3,102,120,110,114,10,0,0,0,114, + 11,0,0,0,218,25,95,114,101,113,117,105,114,101,115,95, + 98,117,105,108,116,105,110,95,119,114,97,112,112,101,114,232, + 0,0,0,115,10,0,0,0,0,1,10,1,10,1,2,255, + 6,2,122,52,95,114,101,113,117,105,114,101,115,95,98,117, + 105,108,116,105,110,46,60,108,111,99,97,108,115,62,46,95, + 114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,110, + 95,119,114,97,112,112,101,114,169,1,114,12,0,0,0,41, + 2,114,82,0,0,0,114,83,0,0,0,114,10,0,0,0, + 114,81,0,0,0,114,11,0,0,0,218,17,95,114,101,113, + 117,105,114,101,115,95,98,117,105,108,116,105,110,230,0,0, + 0,115,6,0,0,0,0,2,12,5,10,1,114,85,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, + 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, + 0,131,2,1,0,124,1,83,0,41,3,122,47,68,101,99, + 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121, + 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108, + 101,32,105,115,32,102,114,111,122,101,110,46,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,19,0,0,0,115,38,0,0,0,124,1,116,0,106,1, - 107,7,114,28,116,2,100,1,160,3,124,1,161,1,124,1, + 0,19,0,0,0,115,38,0,0,0,116,0,160,1,124,1, + 161,1,115,28,116,2,100,1,160,3,124,1,161,1,124,1, 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, - 41,3,78,250,29,123,33,114,125,32,105,115,32,110,111,116, - 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,114,16,0,0,0,41,4,114,15,0,0,0,218,20, - 98,117,105,108,116,105,110,95,109,111,100,117,108,101,95,110, - 97,109,101,115,218,11,73,109,112,111,114,116,69,114,114,111, - 114,114,44,0,0,0,169,2,114,30,0,0,0,218,8,102, - 117,108,108,110,97,109,101,169,1,218,3,102,120,110,114,10, - 0,0,0,114,11,0,0,0,218,25,95,114,101,113,117,105, - 114,101,115,95,98,117,105,108,116,105,110,95,119,114,97,112, - 112,101,114,232,0,0,0,115,10,0,0,0,0,1,10,1, - 10,1,2,255,6,2,122,52,95,114,101,113,117,105,114,101, - 115,95,98,117,105,108,116,105,110,46,60,108,111,99,97,108, - 115,62,46,95,114,101,113,117,105,114,101,115,95,98,117,105, - 108,116,105,110,95,119,114,97,112,112,101,114,169,1,114,12, - 0,0,0,41,2,114,82,0,0,0,114,83,0,0,0,114, - 10,0,0,0,114,81,0,0,0,114,11,0,0,0,218,17, - 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, - 110,230,0,0,0,115,6,0,0,0,0,2,12,5,10,1, - 114,85,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,26, - 0,0,0,135,0,102,1,100,1,100,2,132,8,125,1,116, - 0,124,1,136,0,131,2,1,0,124,1,83,0,41,3,122, - 47,68,101,99,111,114,97,116,111,114,32,116,111,32,118,101, - 114,105,102,121,32,116,104,101,32,110,97,109,101,100,32,109, - 111,100,117,108,101,32,105,115,32,102,114,111,122,101,110,46, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,19,0,0,0,115,38,0,0,0,116,0, - 160,1,124,1,161,1,115,28,116,2,100,1,160,3,124,1, - 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, - 131,2,83,0,169,3,78,122,27,123,33,114,125,32,105,115, - 32,110,111,116,32,97,32,102,114,111,122,101,110,32,109,111, - 100,117,108,101,114,16,0,0,0,41,4,114,56,0,0,0, - 218,9,105,115,95,102,114,111,122,101,110,114,78,0,0,0, - 114,44,0,0,0,114,79,0,0,0,114,81,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,24,95,114,101,113,117, - 105,114,101,115,95,102,114,111,122,101,110,95,119,114,97,112, - 112,101,114,243,0,0,0,115,10,0,0,0,0,1,10,1, - 10,1,2,255,6,2,122,50,95,114,101,113,117,105,114,101, - 115,95,102,114,111,122,101,110,46,60,108,111,99,97,108,115, - 62,46,95,114,101,113,117,105,114,101,115,95,102,114,111,122, - 101,110,95,119,114,97,112,112,101,114,114,84,0,0,0,41, - 2,114,82,0,0,0,114,88,0,0,0,114,10,0,0,0, - 114,81,0,0,0,114,11,0,0,0,218,16,95,114,101,113, - 117,105,114,101,115,95,102,114,111,122,101,110,241,0,0,0, - 115,6,0,0,0,0,2,12,5,10,1,114,89,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,62,0,0,0,116,0, - 124,1,124,0,131,2,125,2,124,1,116,1,106,2,107,6, - 114,50,116,1,106,2,124,1,25,0,125,3,116,3,124,2, - 124,3,131,2,1,0,116,1,106,2,124,1,25,0,83,0, - 116,4,124,2,131,1,83,0,100,1,83,0,41,2,122,128, - 76,111,97,100,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,32,109,111,100,117,108,101,32,105,110,116,111,32,115, - 121,115,46,109,111,100,117,108,101,115,32,97,110,100,32,114, - 101,116,117,114,110,32,105,116,46,10,10,32,32,32,32,84, - 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, - 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,108, - 111,97,100,101,114,46,101,120,101,99,95,109,111,100,117,108, - 101,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 78,41,5,218,16,115,112,101,99,95,102,114,111,109,95,108, - 111,97,100,101,114,114,15,0,0,0,218,7,109,111,100,117, - 108,101,115,218,5,95,101,120,101,99,218,5,95,108,111,97, - 100,41,4,114,30,0,0,0,114,80,0,0,0,218,4,115, - 112,101,99,218,6,109,111,100,117,108,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,17,95,108,111,97, - 100,95,109,111,100,117,108,101,95,115,104,105,109,253,0,0, - 0,115,12,0,0,0,0,6,10,1,10,1,10,1,10,1, - 10,2,114,96,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,8,0,0,0,67,0,0,0, - 115,226,0,0,0,116,0,124,0,100,1,100,0,131,3,125, - 1,116,1,124,1,100,2,131,2,114,56,122,12,124,1,160, - 2,124,0,161,1,87,0,83,0,4,0,116,3,107,10,114, - 54,1,0,1,0,1,0,89,0,110,2,48,0,122,10,124, - 0,106,4,125,2,87,0,110,20,4,0,116,5,107,10,114, - 86,1,0,1,0,1,0,89,0,110,18,48,0,124,2,100, - 0,107,9,114,104,116,6,124,2,131,1,83,0,122,10,124, - 0,106,7,125,3,87,0,110,24,4,0,116,5,107,10,114, - 138,1,0,1,0,1,0,100,3,125,3,89,0,110,2,48, - 0,122,10,124,0,106,8,125,4,87,0,110,58,4,0,116, - 5,107,10,114,208,1,0,1,0,1,0,124,1,100,0,107, - 8,114,188,100,4,160,9,124,3,161,1,6,0,89,0,83, - 0,100,5,160,9,124,3,124,1,161,2,6,0,89,0,83, - 0,89,0,110,14,48,0,100,6,160,9,124,3,124,4,161, - 2,83,0,100,0,83,0,41,7,78,218,10,95,95,108,111, - 97,100,101,114,95,95,218,11,109,111,100,117,108,101,95,114, - 101,112,114,250,1,63,250,13,60,109,111,100,117,108,101,32, - 123,33,114,125,62,250,20,60,109,111,100,117,108,101,32,123, - 33,114,125,32,40,123,33,114,125,41,62,250,23,60,109,111, - 100,117,108,101,32,123,33,114,125,32,102,114,111,109,32,123, - 33,114,125,62,41,10,114,6,0,0,0,114,4,0,0,0, - 114,98,0,0,0,218,9,69,120,99,101,112,116,105,111,110, - 218,8,95,95,115,112,101,99,95,95,218,14,65,116,116,114, - 105,98,117,116,101,69,114,114,111,114,218,22,95,109,111,100, - 117,108,101,95,114,101,112,114,95,102,114,111,109,95,115,112, - 101,99,114,1,0,0,0,218,8,95,95,102,105,108,101,95, - 95,114,44,0,0,0,41,5,114,95,0,0,0,218,6,108, - 111,97,100,101,114,114,94,0,0,0,114,17,0,0,0,218, - 8,102,105,108,101,110,97,109,101,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,12,95,109,111,100,117,108, - 101,95,114,101,112,114,13,1,0,0,115,46,0,0,0,0, - 2,12,1,10,4,2,1,12,1,14,1,6,1,2,1,10, - 1,14,1,6,2,8,1,8,4,2,1,10,1,14,1,10, - 1,2,1,10,1,14,1,8,1,14,2,22,2,114,110,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,64,0,0,0,115,114,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,2, - 100,2,100,3,156,3,100,4,100,5,132,2,90,4,100,6, - 100,7,132,0,90,5,100,8,100,9,132,0,90,6,101,7, - 100,10,100,11,132,0,131,1,90,8,101,8,106,9,100,12, - 100,11,132,0,131,1,90,8,101,7,100,13,100,14,132,0, - 131,1,90,10,101,7,100,15,100,16,132,0,131,1,90,11, - 101,11,106,9,100,17,100,16,132,0,131,1,90,11,100,2, - 83,0,41,18,218,10,77,111,100,117,108,101,83,112,101,99, - 97,208,5,0,0,84,104,101,32,115,112,101,99,105,102,105, - 99,97,116,105,111,110,32,102,111,114,32,97,32,109,111,100, - 117,108,101,44,32,117,115,101,100,32,102,111,114,32,108,111, - 97,100,105,110,103,46,10,10,32,32,32,32,65,32,109,111, - 100,117,108,101,39,115,32,115,112,101,99,32,105,115,32,116, - 104,101,32,115,111,117,114,99,101,32,102,111,114,32,105,110, - 102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32, - 116,104,101,32,109,111,100,117,108,101,46,32,32,70,111,114, - 10,32,32,32,32,100,97,116,97,32,97,115,115,111,99,105, - 97,116,101,100,32,119,105,116,104,32,116,104,101,32,109,111, - 100,117,108,101,44,32,105,110,99,108,117,100,105,110,103,32, - 115,111,117,114,99,101,44,32,117,115,101,32,116,104,101,32, - 115,112,101,99,39,115,10,32,32,32,32,108,111,97,100,101, - 114,46,10,10,32,32,32,32,96,110,97,109,101,96,32,105, - 115,32,116,104,101,32,97,98,115,111,108,117,116,101,32,110, - 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, - 101,46,32,32,96,108,111,97,100,101,114,96,32,105,115,32, - 116,104,101,32,108,111,97,100,101,114,10,32,32,32,32,116, - 111,32,117,115,101,32,119,104,101,110,32,108,111,97,100,105, - 110,103,32,116,104,101,32,109,111,100,117,108,101,46,32,32, - 96,112,97,114,101,110,116,96,32,105,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,116,104,101,10,32,32,32,32, - 112,97,99,107,97,103,101,32,116,104,101,32,109,111,100,117, - 108,101,32,105,115,32,105,110,46,32,32,84,104,101,32,112, - 97,114,101,110,116,32,105,115,32,100,101,114,105,118,101,100, - 32,102,114,111,109,32,116,104,101,32,110,97,109,101,46,10, - 10,32,32,32,32,96,105,115,95,112,97,99,107,97,103,101, - 96,32,100,101,116,101,114,109,105,110,101,115,32,105,102,32, - 116,104,101,32,109,111,100,117,108,101,32,105,115,32,99,111, - 110,115,105,100,101,114,101,100,32,97,32,112,97,99,107,97, - 103,101,32,111,114,10,32,32,32,32,110,111,116,46,32,32, - 79,110,32,109,111,100,117,108,101,115,32,116,104,105,115,32, - 105,115,32,114,101,102,108,101,99,116,101,100,32,98,121,32, - 116,104,101,32,96,95,95,112,97,116,104,95,95,96,32,97, - 116,116,114,105,98,117,116,101,46,10,10,32,32,32,32,96, - 111,114,105,103,105,110,96,32,105,115,32,116,104,101,32,115, - 112,101,99,105,102,105,99,32,108,111,99,97,116,105,111,110, - 32,117,115,101,100,32,98,121,32,116,104,101,32,108,111,97, - 100,101,114,32,102,114,111,109,32,119,104,105,99,104,32,116, - 111,10,32,32,32,32,108,111,97,100,32,116,104,101,32,109, - 111,100,117,108,101,44,32,105,102,32,116,104,97,116,32,105, - 110,102,111,114,109,97,116,105,111,110,32,105,115,32,97,118, - 97,105,108,97,98,108,101,46,32,32,87,104,101,110,32,102, - 105,108,101,110,97,109,101,32,105,115,10,32,32,32,32,115, - 101,116,44,32,111,114,105,103,105,110,32,119,105,108,108,32, - 109,97,116,99,104,46,10,10,32,32,32,32,96,104,97,115, - 95,108,111,99,97,116,105,111,110,96,32,105,110,100,105,99, - 97,116,101,115,32,116,104,97,116,32,97,32,115,112,101,99, - 39,115,32,34,111,114,105,103,105,110,34,32,114,101,102,108, - 101,99,116,115,32,97,32,108,111,99,97,116,105,111,110,46, - 10,32,32,32,32,87,104,101,110,32,116,104,105,115,32,105, - 115,32,84,114,117,101,44,32,96,95,95,102,105,108,101,95, - 95,96,32,97,116,116,114,105,98,117,116,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,32,105,115,32,115,101, - 116,46,10,10,32,32,32,32,96,99,97,99,104,101,100,96, - 32,105,115,32,116,104,101,32,108,111,99,97,116,105,111,110, - 32,111,102,32,116,104,101,32,99,97,99,104,101,100,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,44,32,105,102, - 32,97,110,121,46,32,32,73,116,10,32,32,32,32,99,111, - 114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101, - 32,96,95,95,99,97,99,104,101,100,95,95,96,32,97,116, - 116,114,105,98,117,116,101,46,10,10,32,32,32,32,96,115, - 117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,95, - 108,111,99,97,116,105,111,110,115,96,32,105,115,32,116,104, - 101,32,115,101,113,117,101,110,99,101,32,111,102,32,112,97, - 116,104,32,101,110,116,114,105,101,115,32,116,111,10,32,32, - 32,32,115,101,97,114,99,104,32,119,104,101,110,32,105,109, - 112,111,114,116,105,110,103,32,115,117,98,109,111,100,117,108, - 101,115,46,32,32,73,102,32,115,101,116,44,32,105,115,95, - 112,97,99,107,97,103,101,32,115,104,111,117,108,100,32,98, - 101,10,32,32,32,32,84,114,117,101,45,45,97,110,100,32, - 70,97,108,115,101,32,111,116,104,101,114,119,105,115,101,46, - 10,10,32,32,32,32,80,97,99,107,97,103,101,115,32,97, - 114,101,32,115,105,109,112,108,121,32,109,111,100,117,108,101, - 115,32,116,104,97,116,32,40,109,97,121,41,32,104,97,118, - 101,32,115,117,98,109,111,100,117,108,101,115,46,32,32,73, - 102,32,97,32,115,112,101,99,10,32,32,32,32,104,97,115, - 32,97,32,110,111,110,45,78,111,110,101,32,118,97,108,117, - 101,32,105,110,32,96,115,117,98,109,111,100,117,108,101,95, - 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115, - 96,44,32,116,104,101,32,105,109,112,111,114,116,10,32,32, - 32,32,115,121,115,116,101,109,32,119,105,108,108,32,99,111, - 110,115,105,100,101,114,32,109,111,100,117,108,101,115,32,108, - 111,97,100,101,100,32,102,114,111,109,32,116,104,101,32,115, - 112,101,99,32,97,115,32,112,97,99,107,97,103,101,115,46, - 10,10,32,32,32,32,79,110,108,121,32,102,105,110,100,101, - 114,115,32,40,115,101,101,32,105,109,112,111,114,116,108,105, - 98,46,97,98,99,46,77,101,116,97,80,97,116,104,70,105, - 110,100,101,114,32,97,110,100,10,32,32,32,32,105,109,112, - 111,114,116,108,105,98,46,97,98,99,46,80,97,116,104,69, - 110,116,114,121,70,105,110,100,101,114,41,32,115,104,111,117, - 108,100,32,109,111,100,105,102,121,32,77,111,100,117,108,101, - 83,112,101,99,32,105,110,115,116,97,110,99,101,115,46,10, - 10,32,32,32,32,78,41,3,218,6,111,114,105,103,105,110, - 218,12,108,111,97,100,101,114,95,115,116,97,116,101,218,10, - 105,115,95,112,97,99,107,97,103,101,99,3,0,0,0,0, - 0,0,0,3,0,0,0,6,0,0,0,2,0,0,0,67, - 0,0,0,115,54,0,0,0,124,1,124,0,95,0,124,2, - 124,0,95,1,124,3,124,0,95,2,124,4,124,0,95,3, - 124,5,114,32,103,0,110,2,100,0,124,0,95,4,100,1, - 124,0,95,5,100,0,124,0,95,6,100,0,83,0,41,2, - 78,70,41,7,114,17,0,0,0,114,108,0,0,0,114,112, - 0,0,0,114,113,0,0,0,218,26,115,117,98,109,111,100, + 169,3,78,122,27,123,33,114,125,32,105,115,32,110,111,116, + 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 114,16,0,0,0,41,4,114,56,0,0,0,218,9,105,115, + 95,102,114,111,122,101,110,114,78,0,0,0,114,44,0,0, + 0,114,79,0,0,0,114,81,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,24,95,114,101,113,117,105,114,101,115, + 95,102,114,111,122,101,110,95,119,114,97,112,112,101,114,243, + 0,0,0,115,10,0,0,0,0,1,10,1,10,1,2,255, + 6,2,122,50,95,114,101,113,117,105,114,101,115,95,102,114, + 111,122,101,110,46,60,108,111,99,97,108,115,62,46,95,114, + 101,113,117,105,114,101,115,95,102,114,111,122,101,110,95,119, + 114,97,112,112,101,114,114,84,0,0,0,41,2,114,82,0, + 0,0,114,88,0,0,0,114,10,0,0,0,114,81,0,0, + 0,114,11,0,0,0,218,16,95,114,101,113,117,105,114,101, + 115,95,102,114,111,122,101,110,241,0,0,0,115,6,0,0, + 0,0,2,12,5,10,1,114,89,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, + 0,67,0,0,0,115,62,0,0,0,116,0,124,1,124,0, + 131,2,125,2,124,1,116,1,106,2,118,0,114,50,116,1, + 106,2,124,1,25,0,125,3,116,3,124,2,124,3,131,2, + 1,0,116,1,106,2,124,1,25,0,83,0,116,4,124,2, + 131,1,83,0,100,1,83,0,41,2,122,128,76,111,97,100, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, + 111,100,117,108,101,32,105,110,116,111,32,115,121,115,46,109, + 111,100,117,108,101,115,32,97,110,100,32,114,101,116,117,114, + 110,32,105,116,46,10,10,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,108,111,97,100,101, + 114,46,101,120,101,99,95,109,111,100,117,108,101,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,78,41,5,218, + 16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,101, + 114,114,15,0,0,0,218,7,109,111,100,117,108,101,115,218, + 5,95,101,120,101,99,218,5,95,108,111,97,100,41,4,114, + 30,0,0,0,114,80,0,0,0,218,4,115,112,101,99,218, + 6,109,111,100,117,108,101,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,17,95,108,111,97,100,95,109,111, + 100,117,108,101,95,115,104,105,109,253,0,0,0,115,12,0, + 0,0,0,6,10,1,10,1,10,1,10,1,10,2,114,96, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,8,0,0,0,67,0,0,0,115,218,0,0, + 0,116,0,124,0,100,1,100,0,131,3,125,1,116,1,124, + 1,100,2,131,2,114,54,122,12,124,1,160,2,124,0,161, + 1,87,0,83,0,4,0,116,3,121,52,1,0,1,0,1, + 0,89,0,110,2,48,0,122,10,124,0,106,4,125,2,87, + 0,110,18,4,0,116,5,121,82,1,0,1,0,1,0,89, + 0,110,18,48,0,124,2,100,0,117,1,114,100,116,6,124, + 2,131,1,83,0,122,10,124,0,106,7,125,3,87,0,110, + 22,4,0,116,5,121,132,1,0,1,0,1,0,100,3,125, + 3,89,0,110,2,48,0,122,10,124,0,106,8,125,4,87, + 0,110,56,4,0,116,5,121,200,1,0,1,0,1,0,124, + 1,100,0,117,0,114,180,100,4,160,9,124,3,161,1,6, + 0,89,0,83,0,100,5,160,9,124,3,124,1,161,2,6, + 0,89,0,83,0,89,0,110,14,48,0,100,6,160,9,124, + 3,124,4,161,2,83,0,100,0,83,0,41,7,78,218,10, + 95,95,108,111,97,100,101,114,95,95,218,11,109,111,100,117, + 108,101,95,114,101,112,114,250,1,63,250,13,60,109,111,100, + 117,108,101,32,123,33,114,125,62,250,20,60,109,111,100,117, + 108,101,32,123,33,114,125,32,40,123,33,114,125,41,62,250, + 23,60,109,111,100,117,108,101,32,123,33,114,125,32,102,114, + 111,109,32,123,33,114,125,62,41,10,114,6,0,0,0,114, + 4,0,0,0,114,98,0,0,0,218,9,69,120,99,101,112, + 116,105,111,110,218,8,95,95,115,112,101,99,95,95,218,14, + 65,116,116,114,105,98,117,116,101,69,114,114,111,114,218,22, + 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, + 109,95,115,112,101,99,114,1,0,0,0,218,8,95,95,102, + 105,108,101,95,95,114,44,0,0,0,41,5,114,95,0,0, + 0,218,6,108,111,97,100,101,114,114,94,0,0,0,114,17, + 0,0,0,218,8,102,105,108,101,110,97,109,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,12,95,109, + 111,100,117,108,101,95,114,101,112,114,13,1,0,0,115,46, + 0,0,0,0,2,12,1,10,4,2,1,12,1,12,1,6, + 1,2,1,10,1,12,1,6,2,8,1,8,4,2,1,10, + 1,12,1,10,1,2,1,10,1,12,1,8,1,14,2,22, + 2,114,110,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 114,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,2,100,2,100,3,156,3,100,4,100,5,132,2, + 90,4,100,6,100,7,132,0,90,5,100,8,100,9,132,0, + 90,6,101,7,100,10,100,11,132,0,131,1,90,8,101,8, + 106,9,100,12,100,11,132,0,131,1,90,8,101,7,100,13, + 100,14,132,0,131,1,90,10,101,7,100,15,100,16,132,0, + 131,1,90,11,101,11,106,9,100,17,100,16,132,0,131,1, + 90,11,100,2,83,0,41,18,218,10,77,111,100,117,108,101, + 83,112,101,99,97,208,5,0,0,84,104,101,32,115,112,101, + 99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,97, + 32,109,111,100,117,108,101,44,32,117,115,101,100,32,102,111, + 114,32,108,111,97,100,105,110,103,46,10,10,32,32,32,32, + 65,32,109,111,100,117,108,101,39,115,32,115,112,101,99,32, + 105,115,32,116,104,101,32,115,111,117,114,99,101,32,102,111, + 114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98, + 111,117,116,32,116,104,101,32,109,111,100,117,108,101,46,32, + 32,70,111,114,10,32,32,32,32,100,97,116,97,32,97,115, + 115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104, + 101,32,109,111,100,117,108,101,44,32,105,110,99,108,117,100, + 105,110,103,32,115,111,117,114,99,101,44,32,117,115,101,32, + 116,104,101,32,115,112,101,99,39,115,10,32,32,32,32,108, + 111,97,100,101,114,46,10,10,32,32,32,32,96,110,97,109, + 101,96,32,105,115,32,116,104,101,32,97,98,115,111,108,117, + 116,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, + 111,100,117,108,101,46,32,32,96,108,111,97,100,101,114,96, + 32,105,115,32,116,104,101,32,108,111,97,100,101,114,10,32, + 32,32,32,116,111,32,117,115,101,32,119,104,101,110,32,108, + 111,97,100,105,110,103,32,116,104,101,32,109,111,100,117,108, + 101,46,32,32,96,112,97,114,101,110,116,96,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,10, + 32,32,32,32,112,97,99,107,97,103,101,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,105,110,46,32,32,84, + 104,101,32,112,97,114,101,110,116,32,105,115,32,100,101,114, + 105,118,101,100,32,102,114,111,109,32,116,104,101,32,110,97, + 109,101,46,10,10,32,32,32,32,96,105,115,95,112,97,99, + 107,97,103,101,96,32,100,101,116,101,114,109,105,110,101,115, + 32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,112, + 97,99,107,97,103,101,32,111,114,10,32,32,32,32,110,111, + 116,46,32,32,79,110,32,109,111,100,117,108,101,115,32,116, + 104,105,115,32,105,115,32,114,101,102,108,101,99,116,101,100, + 32,98,121,32,116,104,101,32,96,95,95,112,97,116,104,95, + 95,96,32,97,116,116,114,105,98,117,116,101,46,10,10,32, + 32,32,32,96,111,114,105,103,105,110,96,32,105,115,32,116, + 104,101,32,115,112,101,99,105,102,105,99,32,108,111,99,97, + 116,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101, + 32,108,111,97,100,101,114,32,102,114,111,109,32,119,104,105, + 99,104,32,116,111,10,32,32,32,32,108,111,97,100,32,116, + 104,101,32,109,111,100,117,108,101,44,32,105,102,32,116,104, + 97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,105, + 115,32,97,118,97,105,108,97,98,108,101,46,32,32,87,104, + 101,110,32,102,105,108,101,110,97,109,101,32,105,115,10,32, + 32,32,32,115,101,116,44,32,111,114,105,103,105,110,32,119, + 105,108,108,32,109,97,116,99,104,46,10,10,32,32,32,32, + 96,104,97,115,95,108,111,99,97,116,105,111,110,96,32,105, + 110,100,105,99,97,116,101,115,32,116,104,97,116,32,97,32, + 115,112,101,99,39,115,32,34,111,114,105,103,105,110,34,32, + 114,101,102,108,101,99,116,115,32,97,32,108,111,99,97,116, + 105,111,110,46,10,32,32,32,32,87,104,101,110,32,116,104, + 105,115,32,105,115,32,84,114,117,101,44,32,96,95,95,102, + 105,108,101,95,95,96,32,97,116,116,114,105,98,117,116,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,115,101,116,46,10,10,32,32,32,32,96,99,97,99, + 104,101,100,96,32,105,115,32,116,104,101,32,108,111,99,97, + 116,105,111,110,32,111,102,32,116,104,101,32,99,97,99,104, + 101,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 44,32,105,102,32,97,110,121,46,32,32,73,116,10,32,32, + 32,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111, + 32,116,104,101,32,96,95,95,99,97,99,104,101,100,95,95, + 96,32,97,116,116,114,105,98,117,116,101,46,10,10,32,32, + 32,32,96,115,117,98,109,111,100,117,108,101,95,115,101,97, + 114,99,104,95,108,111,99,97,116,105,111,110,115,96,32,105, + 115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,111, + 102,32,112,97,116,104,32,101,110,116,114,105,101,115,32,116, + 111,10,32,32,32,32,115,101,97,114,99,104,32,119,104,101, + 110,32,105,109,112,111,114,116,105,110,103,32,115,117,98,109, + 111,100,117,108,101,115,46,32,32,73,102,32,115,101,116,44, + 32,105,115,95,112,97,99,107,97,103,101,32,115,104,111,117, + 108,100,32,98,101,10,32,32,32,32,84,114,117,101,45,45, + 97,110,100,32,70,97,108,115,101,32,111,116,104,101,114,119, + 105,115,101,46,10,10,32,32,32,32,80,97,99,107,97,103, + 101,115,32,97,114,101,32,115,105,109,112,108,121,32,109,111, + 100,117,108,101,115,32,116,104,97,116,32,40,109,97,121,41, + 32,104,97,118,101,32,115,117,98,109,111,100,117,108,101,115, + 46,32,32,73,102,32,97,32,115,112,101,99,10,32,32,32, + 32,104,97,115,32,97,32,110,111,110,45,78,111,110,101,32, + 118,97,108,117,101,32,105,110,32,96,115,117,98,109,111,100, 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,218,13,95,115,101,116,95,102,105,108,101,97, - 116,116,114,218,7,95,99,97,99,104,101,100,41,6,114,30, - 0,0,0,114,17,0,0,0,114,108,0,0,0,114,112,0, - 0,0,114,113,0,0,0,114,114,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,31,0,0,0, - 86,1,0,0,115,14,0,0,0,0,2,6,1,6,1,6, - 1,6,1,14,3,6,1,122,19,77,111,100,117,108,101,83, - 112,101,99,46,95,95,105,110,105,116,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0, - 0,67,0,0,0,115,102,0,0,0,100,1,160,0,124,0, - 106,1,161,1,100,2,160,0,124,0,106,2,161,1,103,2, - 125,1,124,0,106,3,100,0,107,9,114,52,124,1,160,4, - 100,3,160,0,124,0,106,3,161,1,161,1,1,0,124,0, - 106,5,100,0,107,9,114,80,124,1,160,4,100,4,160,0, - 124,0,106,5,161,1,161,1,1,0,100,5,160,0,124,0, - 106,6,106,7,100,6,160,8,124,1,161,1,161,2,83,0, - 41,7,78,122,9,110,97,109,101,61,123,33,114,125,122,11, - 108,111,97,100,101,114,61,123,33,114,125,122,11,111,114,105, - 103,105,110,61,123,33,114,125,122,29,115,117,98,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,61,123,125,122,6,123,125,40,123,125,41,122, - 2,44,32,41,9,114,44,0,0,0,114,17,0,0,0,114, - 108,0,0,0,114,112,0,0,0,218,6,97,112,112,101,110, - 100,114,115,0,0,0,218,9,95,95,99,108,97,115,115,95, - 95,114,1,0,0,0,218,4,106,111,105,110,41,2,114,30, - 0,0,0,114,54,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,47,0,0,0,98,1,0,0, - 115,20,0,0,0,0,1,10,1,10,255,4,2,10,1,18, - 1,10,1,8,1,4,255,6,2,122,19,77,111,100,117,108, - 101,83,112,101,99,46,95,95,114,101,112,114,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,108,0,0,0,124,0,106,0, - 125,2,122,72,124,0,106,1,124,1,106,1,107,2,111,76, - 124,0,106,2,124,1,106,2,107,2,111,76,124,0,106,3, - 124,1,106,3,107,2,111,76,124,2,124,1,106,0,107,2, - 111,76,124,0,106,4,124,1,106,4,107,2,111,76,124,0, - 106,5,124,1,106,5,107,2,87,0,83,0,4,0,116,6, - 107,10,114,102,1,0,1,0,1,0,116,7,6,0,89,0, - 83,0,48,0,100,0,83,0,114,13,0,0,0,41,8,114, - 115,0,0,0,114,17,0,0,0,114,108,0,0,0,114,112, - 0,0,0,218,6,99,97,99,104,101,100,218,12,104,97,115, - 95,108,111,99,97,116,105,111,110,114,105,0,0,0,218,14, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,41,3, - 114,30,0,0,0,90,5,111,116,104,101,114,90,4,115,109, - 115,108,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,6,95,95,101,113,95,95,108,1,0,0,115,30,0, - 0,0,0,1,6,1,2,1,12,1,10,255,2,2,10,254, - 2,3,8,253,2,4,10,252,2,5,10,251,4,6,14,1, - 122,17,77,111,100,117,108,101,83,112,101,99,46,95,95,101, - 113,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,58,0,0, - 0,124,0,106,0,100,0,107,8,114,52,124,0,106,1,100, - 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, - 8,114,38,116,4,130,1,116,3,160,5,124,0,106,1,161, - 1,124,0,95,0,124,0,106,0,83,0,114,13,0,0,0, - 41,6,114,117,0,0,0,114,112,0,0,0,114,116,0,0, - 0,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, - 116,101,114,110,97,108,218,19,78,111,116,73,109,112,108,101, - 109,101,110,116,101,100,69,114,114,111,114,90,11,95,103,101, - 116,95,99,97,99,104,101,100,114,46,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,121,0,0, - 0,120,1,0,0,115,12,0,0,0,0,2,10,1,16,1, - 8,1,4,1,14,1,122,17,77,111,100,117,108,101,83,112, - 101,99,46,99,97,99,104,101,100,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,10,0,0,0,124,1,124,0,95,0,100,0,83, - 0,114,13,0,0,0,41,1,114,117,0,0,0,41,2,114, - 30,0,0,0,114,121,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,121,0,0,0,129,1,0, - 0,115,2,0,0,0,0,2,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,36,0,0,0,124,0,106,0,100,1,107,8,114,26, - 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, - 124,0,106,1,83,0,100,1,83,0,41,4,122,32,84,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, - 1,46,114,22,0,0,0,41,3,114,115,0,0,0,114,17, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 105,111,110,115,96,44,32,116,104,101,32,105,109,112,111,114, + 116,10,32,32,32,32,115,121,115,116,101,109,32,119,105,108, + 108,32,99,111,110,115,105,100,101,114,32,109,111,100,117,108, + 101,115,32,108,111,97,100,101,100,32,102,114,111,109,32,116, + 104,101,32,115,112,101,99,32,97,115,32,112,97,99,107,97, + 103,101,115,46,10,10,32,32,32,32,79,110,108,121,32,102, + 105,110,100,101,114,115,32,40,115,101,101,32,105,109,112,111, + 114,116,108,105,98,46,97,98,99,46,77,101,116,97,80,97, + 116,104,70,105,110,100,101,114,32,97,110,100,10,32,32,32, + 32,105,109,112,111,114,116,108,105,98,46,97,98,99,46,80, + 97,116,104,69,110,116,114,121,70,105,110,100,101,114,41,32, + 115,104,111,117,108,100,32,109,111,100,105,102,121,32,77,111, + 100,117,108,101,83,112,101,99,32,105,110,115,116,97,110,99, + 101,115,46,10,10,32,32,32,32,78,41,3,218,6,111,114, + 105,103,105,110,218,12,108,111,97,100,101,114,95,115,116,97, + 116,101,218,10,105,115,95,112,97,99,107,97,103,101,99,3, + 0,0,0,0,0,0,0,3,0,0,0,6,0,0,0,2, + 0,0,0,67,0,0,0,115,54,0,0,0,124,1,124,0, + 95,0,124,2,124,0,95,1,124,3,124,0,95,2,124,4, + 124,0,95,3,124,5,114,32,103,0,110,2,100,0,124,0, + 95,4,100,1,124,0,95,5,100,0,124,0,95,6,100,0, + 83,0,41,2,78,70,41,7,114,17,0,0,0,114,108,0, + 0,0,114,112,0,0,0,114,113,0,0,0,218,26,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,218,13,95,115,101,116,95,102, + 105,108,101,97,116,116,114,218,7,95,99,97,99,104,101,100, + 41,6,114,30,0,0,0,114,17,0,0,0,114,108,0,0, + 0,114,112,0,0,0,114,113,0,0,0,114,114,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 31,0,0,0,86,1,0,0,115,14,0,0,0,0,2,6, + 1,6,1,6,1,6,1,14,3,6,1,122,19,77,111,100, + 117,108,101,83,112,101,99,46,95,95,105,110,105,116,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,6,0,0,0,67,0,0,0,115,102,0,0,0,100,1, + 160,0,124,0,106,1,161,1,100,2,160,0,124,0,106,2, + 161,1,103,2,125,1,124,0,106,3,100,0,117,1,114,52, + 124,1,160,4,100,3,160,0,124,0,106,3,161,1,161,1, + 1,0,124,0,106,5,100,0,117,1,114,80,124,1,160,4, + 100,4,160,0,124,0,106,5,161,1,161,1,1,0,100,5, + 160,0,124,0,106,6,106,7,100,6,160,8,124,1,161,1, + 161,2,83,0,41,7,78,122,9,110,97,109,101,61,123,33, + 114,125,122,11,108,111,97,100,101,114,61,123,33,114,125,122, + 11,111,114,105,103,105,110,61,123,33,114,125,122,29,115,117, + 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, + 111,99,97,116,105,111,110,115,61,123,125,122,6,123,125,40, + 123,125,41,122,2,44,32,41,9,114,44,0,0,0,114,17, + 0,0,0,114,108,0,0,0,114,112,0,0,0,218,6,97, + 112,112,101,110,100,114,115,0,0,0,218,9,95,95,99,108, + 97,115,115,95,95,114,1,0,0,0,218,4,106,111,105,110, + 41,2,114,30,0,0,0,114,54,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,47,0,0,0, + 98,1,0,0,115,20,0,0,0,0,1,10,1,10,255,4, + 2,10,1,18,1,10,1,8,1,4,255,6,2,122,19,77, + 111,100,117,108,101,83,112,101,99,46,95,95,114,101,112,114, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,8,0,0,0,67,0,0,0,115,106,0,0,0, + 124,0,106,0,125,2,122,72,124,0,106,1,124,1,106,1, + 107,2,111,76,124,0,106,2,124,1,106,2,107,2,111,76, + 124,0,106,3,124,1,106,3,107,2,111,76,124,2,124,1, + 106,0,107,2,111,76,124,0,106,4,124,1,106,4,107,2, + 111,76,124,0,106,5,124,1,106,5,107,2,87,0,83,0, + 4,0,116,6,121,100,1,0,1,0,1,0,116,7,6,0, + 89,0,83,0,48,0,100,0,83,0,114,13,0,0,0,41, + 8,114,115,0,0,0,114,17,0,0,0,114,108,0,0,0, + 114,112,0,0,0,218,6,99,97,99,104,101,100,218,12,104, + 97,115,95,108,111,99,97,116,105,111,110,114,105,0,0,0, + 218,14,78,111,116,73,109,112,108,101,109,101,110,116,101,100, + 41,3,114,30,0,0,0,90,5,111,116,104,101,114,90,4, + 115,109,115,108,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,6,95,95,101,113,95,95,108,1,0,0,115, + 30,0,0,0,0,1,6,1,2,1,12,1,10,255,2,2, + 10,254,2,3,8,253,2,4,10,252,2,5,10,251,4,6, + 12,1,122,17,77,111,100,117,108,101,83,112,101,99,46,95, + 95,101,113,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,58, + 0,0,0,124,0,106,0,100,0,117,0,114,52,124,0,106, + 1,100,0,117,1,114,52,124,0,106,2,114,52,116,3,100, + 0,117,0,114,38,116,4,130,1,116,3,160,5,124,0,106, + 1,161,1,124,0,95,0,124,0,106,0,83,0,114,13,0, + 0,0,41,6,114,117,0,0,0,114,112,0,0,0,114,116, + 0,0,0,218,19,95,98,111,111,116,115,116,114,97,112,95, + 101,120,116,101,114,110,97,108,218,19,78,111,116,73,109,112, + 108,101,109,101,110,116,101,100,69,114,114,111,114,90,11,95, + 103,101,116,95,99,97,99,104,101,100,114,46,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,121, + 0,0,0,120,1,0,0,115,12,0,0,0,0,2,10,1, + 16,1,8,1,4,1,14,1,122,17,77,111,100,117,108,101, + 83,112,101,99,46,99,97,99,104,101,100,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, + 67,0,0,0,115,10,0,0,0,124,1,124,0,95,0,100, + 0,83,0,114,13,0,0,0,41,1,114,117,0,0,0,41, + 2,114,30,0,0,0,114,121,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,121,0,0,0,129, + 1,0,0,115,2,0,0,0,0,2,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,36,0,0,0,124,0,106,0,100,1,117,0, + 114,26,124,0,106,1,160,2,100,2,161,1,100,3,25,0, + 83,0,124,0,106,1,83,0,100,1,83,0,41,4,122,32, + 84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,39,115,32,112,97,114,101,110,116,46, + 78,218,1,46,114,22,0,0,0,41,3,114,115,0,0,0, + 114,17,0,0,0,218,10,114,112,97,114,116,105,116,105,111, + 110,114,46,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,6,112,97,114,101,110,116,133,1,0, + 0,115,6,0,0,0,0,3,10,1,16,2,122,17,77,111, + 100,117,108,101,83,112,101,99,46,112,97,114,101,110,116,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, + 0,83,0,114,13,0,0,0,41,1,114,116,0,0,0,114, 46,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,6,112,97,114,101,110,116,133,1,0,0,115, - 6,0,0,0,0,3,10,1,16,2,122,17,77,111,100,117, - 108,101,83,112,101,99,46,112,97,114,101,110,116,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, - 0,114,13,0,0,0,41,1,114,116,0,0,0,114,46,0, + 0,0,0,114,122,0,0,0,141,1,0,0,115,2,0,0, + 0,0,2,122,23,77,111,100,117,108,101,83,112,101,99,46, + 104,97,115,95,108,111,99,97,116,105,111,110,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,14,0,0,0,116,0,124,1,131,1, + 124,0,95,1,100,0,83,0,114,13,0,0,0,41,2,218, + 4,98,111,111,108,114,116,0,0,0,41,2,114,30,0,0, + 0,218,5,118,97,108,117,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,122,0,0,0,145,1,0,0, + 115,2,0,0,0,0,2,41,12,114,1,0,0,0,114,0, + 0,0,0,114,2,0,0,0,114,3,0,0,0,114,31,0, + 0,0,114,47,0,0,0,114,124,0,0,0,218,8,112,114, + 111,112,101,114,116,121,114,121,0,0,0,218,6,115,101,116, + 116,101,114,114,129,0,0,0,114,122,0,0,0,114,10,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,122,0,0,0,141,1,0,0,115,2,0,0,0,0, - 2,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, - 115,95,108,111,99,97,116,105,111,110,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, - 0,0,0,115,14,0,0,0,116,0,124,1,131,1,124,0, - 95,1,100,0,83,0,114,13,0,0,0,41,2,218,4,98, - 111,111,108,114,116,0,0,0,41,2,114,30,0,0,0,218, - 5,118,97,108,117,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,122,0,0,0,145,1,0,0,115,2, - 0,0,0,0,2,41,12,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,3,0,0,0,114,31,0,0,0, - 114,47,0,0,0,114,124,0,0,0,218,8,112,114,111,112, - 101,114,116,121,114,121,0,0,0,218,6,115,101,116,116,101, - 114,114,129,0,0,0,114,122,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 111,0,0,0,49,1,0,0,115,32,0,0,0,8,1,4, - 36,4,1,2,255,12,12,8,10,8,12,2,1,10,8,4, - 1,10,3,2,1,10,7,2,1,10,3,4,1,114,111,0, - 0,0,169,2,114,112,0,0,0,114,114,0,0,0,99,2, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,154,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,107,8,114,48, - 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, - 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, - 100,4,141,3,83,0,124,3,100,2,107,8,114,138,116,0, - 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, - 1,0,1,0,1,0,100,2,125,3,89,0,113,138,48,0, + 0,114,111,0,0,0,49,1,0,0,115,32,0,0,0,8, + 1,4,36,4,1,2,255,12,12,8,10,8,12,2,1,10, + 8,4,1,10,3,2,1,10,7,2,1,10,3,4,1,114, + 111,0,0,0,169,2,114,112,0,0,0,114,114,0,0,0, + 99,2,0,0,0,0,0,0,0,2,0,0,0,6,0,0, + 0,8,0,0,0,67,0,0,0,115,152,0,0,0,116,0, + 124,1,100,1,131,2,114,74,116,1,100,2,117,0,114,22, + 116,2,130,1,116,1,106,3,125,4,124,3,100,2,117,0, + 114,48,124,4,124,0,124,1,100,3,141,2,83,0,124,3, + 114,56,103,0,110,2,100,2,125,5,124,4,124,0,124,1, + 124,5,100,4,141,3,83,0,124,3,100,2,117,0,114,136, + 116,0,124,1,100,5,131,2,114,132,122,14,124,1,160,4, + 124,0,161,1,125,3,87,0,113,136,4,0,116,5,121,128, + 1,0,1,0,1,0,100,2,125,3,89,0,113,136,48,0, 110,4,100,6,125,3,116,6,124,0,124,1,124,2,124,3, 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, @@ -775,1030 +774,1027 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,114,11,0,0,0,114,90,0,0,0,150,1,0,0, 115,36,0,0,0,0,2,10,1,8,1,4,1,6,2,8, 1,12,1,12,1,6,1,2,255,6,3,8,1,10,1,2, - 1,14,1,14,1,12,3,4,2,114,90,0,0,0,99,3, + 1,14,1,12,1,12,3,4,2,114,90,0,0,0,99,3, 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, - 0,0,0,67,0,0,0,115,56,1,0,0,122,10,124,0, - 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, - 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, - 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, - 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, - 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, - 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, - 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, - 100,0,125,5,89,0,110,2,48,0,124,2,100,0,107,8, - 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, - 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, - 1,0,1,0,100,0,125,2,89,0,113,184,48,0,110,4, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, - 4,0,116,1,107,10,114,218,1,0,1,0,1,0,100,0, - 125,6,89,0,110,2,48,0,122,14,116,7,124,0,106,8, - 131,1,125,7,87,0,110,26,4,0,116,1,107,10,144,1, - 114,4,1,0,1,0,1,0,100,0,125,7,89,0,110,2, - 48,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, - 124,5,100,0,107,8,144,1,114,34,100,2,110,2,100,3, - 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, - 124,3,83,0,41,4,78,169,1,114,112,0,0,0,70,84, - 41,13,114,104,0,0,0,114,105,0,0,0,114,1,0,0, - 0,114,97,0,0,0,114,107,0,0,0,218,7,95,79,82, - 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, - 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, - 114,111,0,0,0,114,116,0,0,0,114,121,0,0,0,114, - 115,0,0,0,41,8,114,95,0,0,0,114,108,0,0,0, - 114,112,0,0,0,114,94,0,0,0,114,17,0,0,0,90, - 8,108,111,99,97,116,105,111,110,114,121,0,0,0,114,115, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, - 111,100,117,108,101,176,1,0,0,115,72,0,0,0,0,2, - 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, - 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, - 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, - 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, - 20,1,6,1,6,1,114,141,0,0,0,70,169,1,218,8, - 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,226,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, - 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,74, - 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, - 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, - 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, + 0,0,0,67,0,0,0,115,42,1,0,0,122,10,124,0, + 106,0,125,3,87,0,110,18,4,0,116,1,121,28,1,0, + 1,0,1,0,89,0,110,14,48,0,124,3,100,0,117,1, + 114,42,124,3,83,0,124,0,106,2,125,4,124,1,100,0, + 117,0,114,86,122,10,124,0,106,3,125,1,87,0,110,18, + 4,0,116,1,121,84,1,0,1,0,1,0,89,0,110,2, + 48,0,122,10,124,0,106,4,125,5,87,0,110,22,4,0, + 116,1,121,118,1,0,1,0,1,0,100,0,125,5,89,0, + 110,2,48,0,124,2,100,0,117,0,114,176,124,5,100,0, + 117,0,114,172,122,10,124,1,106,5,125,2,87,0,113,176, + 4,0,116,1,121,168,1,0,1,0,1,0,100,0,125,2, + 89,0,113,176,48,0,110,4,124,5,125,2,122,10,124,0, + 106,6,125,6,87,0,110,22,4,0,116,1,121,208,1,0, + 1,0,1,0,100,0,125,6,89,0,110,2,48,0,122,14, + 116,7,124,0,106,8,131,1,125,7,87,0,110,22,4,0, + 116,1,121,246,1,0,1,0,1,0,100,0,125,7,89,0, + 110,2,48,0,116,9,124,4,124,1,124,2,100,1,141,3, + 125,3,124,5,100,0,117,0,144,1,114,20,100,2,110,2, + 100,3,124,3,95,10,124,6,124,3,95,11,124,7,124,3, + 95,12,124,3,83,0,41,4,78,169,1,114,112,0,0,0, + 70,84,41,13,114,104,0,0,0,114,105,0,0,0,114,1, + 0,0,0,114,97,0,0,0,114,107,0,0,0,218,7,95, + 79,82,73,71,73,78,218,10,95,95,99,97,99,104,101,100, + 95,95,218,4,108,105,115,116,218,8,95,95,112,97,116,104, + 95,95,114,111,0,0,0,114,116,0,0,0,114,121,0,0, + 0,114,115,0,0,0,41,8,114,95,0,0,0,114,108,0, + 0,0,114,112,0,0,0,114,94,0,0,0,114,17,0,0, + 0,90,8,108,111,99,97,116,105,111,110,114,121,0,0,0, + 114,115,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,17,95,115,112,101,99,95,102,114,111,109, + 95,109,111,100,117,108,101,176,1,0,0,115,72,0,0,0, + 0,2,2,1,10,1,12,1,6,2,8,1,4,2,6,1, + 8,1,2,1,10,1,12,2,6,1,2,1,10,1,12,1, + 10,1,8,1,8,1,2,1,10,1,12,1,12,2,4,1, + 2,1,10,1,12,1,10,1,2,1,14,1,12,1,10,2, + 14,1,20,1,6,1,6,1,114,141,0,0,0,70,169,1, + 218,8,111,118,101,114,114,105,100,101,99,2,0,0,0,0, + 0,0,0,1,0,0,0,5,0,0,0,8,0,0,0,67, + 0,0,0,115,210,1,0,0,124,2,115,20,116,0,124,1, + 100,1,100,0,131,3,100,0,117,0,114,52,122,12,124,0, + 106,1,124,1,95,2,87,0,110,18,4,0,116,3,121,50, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,72, + 116,0,124,1,100,2,100,0,131,3,100,0,117,0,114,174, + 124,0,106,4,125,3,124,3,100,0,117,0,114,144,124,0, + 106,5,100,0,117,1,114,144,116,6,100,0,117,0,114,108, 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, - 87,0,110,20,4,0,116,3,107,10,114,176,1,0,1,0, - 1,0,89,0,110,2,48,0,124,2,115,198,116,0,124,1, - 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, - 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, - 114,230,1,0,1,0,1,0,89,0,110,2,48,0,122,10, - 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, - 144,1,114,8,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, - 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, - 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, - 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, - 1,0,89,0,110,2,48,0,124,0,106,17,144,1,114,222, - 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, - 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, - 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, - 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, - 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, - 116,3,107,10,144,1,114,220,1,0,1,0,1,0,89,0, - 110,2,48,0,124,1,83,0,41,7,78,114,1,0,0,0, - 114,97,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,140,0,0,0,114,107,0,0,0,114,138,0,0, - 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, - 0,0,114,105,0,0,0,114,108,0,0,0,114,115,0,0, - 0,114,125,0,0,0,114,126,0,0,0,218,16,95,78,97, - 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, - 95,110,101,119,95,95,90,5,95,112,97,116,104,114,107,0, - 0,0,114,97,0,0,0,114,129,0,0,0,114,144,0,0, - 0,114,104,0,0,0,114,140,0,0,0,114,122,0,0,0, - 114,112,0,0,0,114,121,0,0,0,114,138,0,0,0,41, - 5,114,94,0,0,0,114,95,0,0,0,114,143,0,0,0, - 114,108,0,0,0,114,145,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, - 95,109,111,100,117,108,101,95,97,116,116,114,115,221,1,0, - 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,1, - 6,2,20,1,6,1,8,2,10,1,8,1,4,1,6,2, - 10,1,8,1,6,11,6,1,2,1,10,1,14,1,6,2, - 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, - 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, - 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, - 12,1,16,1,6,1,114,147,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, - 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, - 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, - 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,107, - 8,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, - 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, - 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, - 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, - 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, - 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, - 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, - 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, - 116,101,95,109,111,100,117,108,101,40,41,41,7,114,4,0, - 0,0,114,108,0,0,0,114,148,0,0,0,114,78,0,0, - 0,114,18,0,0,0,114,17,0,0,0,114,147,0,0,0, - 169,2,114,94,0,0,0,114,95,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,16,109,111,100, - 117,108,101,95,102,114,111,109,95,115,112,101,99,37,2,0, - 0,115,18,0,0,0,0,3,4,1,12,3,14,1,12,1, - 8,2,8,1,10,1,10,1,114,151,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, - 0,0,67,0,0,0,115,106,0,0,0,124,0,106,0,100, - 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, - 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, - 8,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, - 3,124,1,124,0,106,2,161,2,83,0,110,36,124,0,106, - 4,114,86,100,5,160,3,124,1,124,0,106,1,161,2,83, - 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, - 0,100,1,83,0,41,7,122,38,82,101,116,117,114,110,32, - 116,104,101,32,114,101,112,114,32,116,111,32,117,115,101,32, - 102,111,114,32,116,104,101,32,109,111,100,117,108,101,46,78, - 114,99,0,0,0,114,100,0,0,0,114,101,0,0,0,114, - 102,0,0,0,250,18,60,109,111,100,117,108,101,32,123,33, - 114,125,32,40,123,125,41,62,41,5,114,17,0,0,0,114, - 112,0,0,0,114,108,0,0,0,114,44,0,0,0,114,122, - 0,0,0,41,2,114,94,0,0,0,114,17,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,106, - 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, - 10,1,10,1,10,2,16,2,6,1,14,2,114,106,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,10,0,0,0,67,0,0,0,115,250,0,0,0,124, - 0,106,0,125,2,116,1,124,2,131,1,143,216,1,0,116, - 2,106,3,160,4,124,2,161,1,124,1,107,9,114,54,100, - 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, - 2,141,2,130,1,122,132,124,0,106,7,100,3,107,8,114, - 106,124,0,106,8,100,3,107,8,114,90,116,6,100,4,124, - 0,106,0,100,2,141,2,130,1,116,9,124,0,124,1,100, - 5,100,6,141,3,1,0,110,52,116,9,124,0,124,1,100, - 5,100,6,141,3,1,0,116,10,124,0,106,7,100,7,131, - 2,115,146,124,0,106,7,160,11,124,2,161,1,1,0,110, - 12,124,0,106,7,160,12,124,1,161,1,1,0,87,0,116, - 2,106,3,160,13,124,0,106,0,161,1,125,1,124,1,116, - 2,106,3,124,0,106,0,60,0,110,28,116,2,106,3,160, - 13,124,0,106,0,161,1,125,1,124,1,116,2,106,3,124, - 0,106,0,60,0,48,0,87,0,100,3,4,0,4,0,131, - 3,1,0,110,16,49,0,115,236,48,0,1,0,1,0,1, - 0,89,0,1,0,124,1,83,0,41,8,122,70,69,120,101, - 99,117,116,101,32,116,104,101,32,115,112,101,99,39,115,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, - 32,105,110,32,97,110,32,101,120,105,115,116,105,110,103,32, - 109,111,100,117,108,101,39,115,32,110,97,109,101,115,112,97, - 99,101,46,122,30,109,111,100,117,108,101,32,123,33,114,125, - 32,110,111,116,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,114,16,0,0,0,78,250,14,109,105,115,115,105, - 110,103,32,108,111,97,100,101,114,84,114,142,0,0,0,114, - 149,0,0,0,41,14,114,17,0,0,0,114,49,0,0,0, - 114,15,0,0,0,114,91,0,0,0,114,34,0,0,0,114, - 44,0,0,0,114,78,0,0,0,114,108,0,0,0,114,115, - 0,0,0,114,147,0,0,0,114,4,0,0,0,218,11,108, - 111,97,100,95,109,111,100,117,108,101,114,149,0,0,0,218, - 3,112,111,112,41,4,114,94,0,0,0,114,95,0,0,0, - 114,17,0,0,0,218,3,109,115,103,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,92,0,0,0,71,2, - 0,0,115,38,0,0,0,0,2,6,1,10,1,16,1,10, - 1,12,1,2,1,10,1,10,1,14,2,16,2,14,1,12, - 4,14,2,14,4,14,1,14,255,14,1,44,1,114,92,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,26,1,0,0, - 122,18,124,0,106,0,160,1,124,0,106,2,161,1,1,0, - 87,0,110,52,1,0,1,0,1,0,124,0,106,2,116,3, - 106,4,107,6,114,64,116,3,106,4,160,5,124,0,106,2, - 161,1,125,1,124,1,116,3,106,4,124,0,106,2,60,0, - 130,0,89,0,110,2,48,0,116,3,106,4,160,5,124,0, + 87,0,110,18,4,0,116,3,121,172,1,0,1,0,1,0, + 89,0,110,2,48,0,124,2,115,194,116,0,124,1,100,3, + 100,0,131,3,100,0,117,0,114,226,122,12,124,0,106,13, + 124,1,95,14,87,0,110,18,4,0,116,3,121,224,1,0, + 1,0,1,0,89,0,110,2,48,0,122,10,124,0,124,1, + 95,15,87,0,110,18,4,0,116,3,121,254,1,0,1,0, + 1,0,89,0,110,2,48,0,124,2,144,1,115,24,116,0, + 124,1,100,4,100,0,131,3,100,0,117,0,144,1,114,70, + 124,0,106,5,100,0,117,1,144,1,114,70,122,12,124,0, + 106,5,124,1,95,16,87,0,110,20,4,0,116,3,144,1, + 121,68,1,0,1,0,1,0,89,0,110,2,48,0,124,0, + 106,17,144,1,114,206,124,2,144,1,115,102,116,0,124,1, + 100,5,100,0,131,3,100,0,117,0,144,1,114,136,122,12, + 124,0,106,18,124,1,95,11,87,0,110,20,4,0,116,3, + 144,1,121,134,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,144,1,115,160,116,0,124,1,100,6,100,0,131,3, + 100,0,117,0,144,1,114,206,124,0,106,19,100,0,117,1, + 144,1,114,206,122,12,124,0,106,19,124,1,95,20,87,0, + 110,20,4,0,116,3,144,1,121,204,1,0,1,0,1,0, + 89,0,110,2,48,0,124,1,83,0,41,7,78,114,1,0, + 0,0,114,97,0,0,0,218,11,95,95,112,97,99,107,97, + 103,101,95,95,114,140,0,0,0,114,107,0,0,0,114,138, + 0,0,0,41,21,114,6,0,0,0,114,17,0,0,0,114, + 1,0,0,0,114,105,0,0,0,114,108,0,0,0,114,115, + 0,0,0,114,125,0,0,0,114,126,0,0,0,218,16,95, + 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,218, + 7,95,95,110,101,119,95,95,90,5,95,112,97,116,104,114, + 107,0,0,0,114,97,0,0,0,114,129,0,0,0,114,144, + 0,0,0,114,104,0,0,0,114,140,0,0,0,114,122,0, + 0,0,114,112,0,0,0,114,121,0,0,0,114,138,0,0, + 0,41,5,114,94,0,0,0,114,95,0,0,0,114,143,0, + 0,0,114,108,0,0,0,114,145,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,18,95,105,110, + 105,116,95,109,111,100,117,108,101,95,97,116,116,114,115,221, + 1,0,0,115,96,0,0,0,0,4,20,1,2,1,12,1, + 12,1,6,2,20,1,6,1,8,2,10,1,8,1,4,1, + 6,2,10,1,8,1,6,11,6,1,2,1,10,1,12,1, + 6,2,20,1,2,1,12,1,12,1,6,2,2,1,10,1, + 12,1,6,2,24,1,12,1,2,1,12,1,14,1,6,2, + 8,1,24,1,2,1,12,1,14,1,6,2,24,1,12,1, + 2,1,12,1,14,1,6,1,114,147,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,82,0,0,0,100,1,125,1,116, + 0,124,0,106,1,100,2,131,2,114,30,124,0,106,1,160, + 2,124,0,161,1,125,1,110,20,116,0,124,0,106,1,100, + 3,131,2,114,50,116,3,100,4,131,1,130,1,124,1,100, + 1,117,0,114,68,116,4,124,0,106,5,131,1,125,1,116, + 6,124,0,124,1,131,2,1,0,124,1,83,0,41,5,122, + 43,67,114,101,97,116,101,32,97,32,109,111,100,117,108,101, + 32,98,97,115,101,100,32,111,110,32,116,104,101,32,112,114, + 111,118,105,100,101,100,32,115,112,101,99,46,78,218,13,99, + 114,101,97,116,101,95,109,111,100,117,108,101,218,11,101,120, + 101,99,95,109,111,100,117,108,101,122,66,108,111,97,100,101, + 114,115,32,116,104,97,116,32,100,101,102,105,110,101,32,101, + 120,101,99,95,109,111,100,117,108,101,40,41,32,109,117,115, + 116,32,97,108,115,111,32,100,101,102,105,110,101,32,99,114, + 101,97,116,101,95,109,111,100,117,108,101,40,41,41,7,114, + 4,0,0,0,114,108,0,0,0,114,148,0,0,0,114,78, + 0,0,0,114,18,0,0,0,114,17,0,0,0,114,147,0, + 0,0,169,2,114,94,0,0,0,114,95,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,16,109, + 111,100,117,108,101,95,102,114,111,109,95,115,112,101,99,37, + 2,0,0,115,18,0,0,0,0,3,4,1,12,3,14,1, + 12,1,8,2,8,1,10,1,10,1,114,151,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,106,0,0,0,124,0,106, + 0,100,1,117,0,114,14,100,2,110,4,124,0,106,0,125, + 1,124,0,106,1,100,1,117,0,114,66,124,0,106,2,100, + 1,117,0,114,50,100,3,160,3,124,1,161,1,83,0,100, + 4,160,3,124,1,124,0,106,2,161,2,83,0,110,36,124, + 0,106,4,114,86,100,5,160,3,124,1,124,0,106,1,161, + 2,83,0,100,6,160,3,124,0,106,0,124,0,106,1,161, + 2,83,0,100,1,83,0,41,7,122,38,82,101,116,117,114, + 110,32,116,104,101,32,114,101,112,114,32,116,111,32,117,115, + 101,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101, + 46,78,114,99,0,0,0,114,100,0,0,0,114,101,0,0, + 0,114,102,0,0,0,250,18,60,109,111,100,117,108,101,32, + 123,33,114,125,32,40,123,125,41,62,41,5,114,17,0,0, + 0,114,112,0,0,0,114,108,0,0,0,114,44,0,0,0, + 114,122,0,0,0,41,2,114,94,0,0,0,114,17,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,106,0,0,0,54,2,0,0,115,16,0,0,0,0,3, + 20,1,10,1,10,1,10,2,16,2,6,1,14,2,114,106, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 4,0,0,0,10,0,0,0,67,0,0,0,115,250,0,0, + 0,124,0,106,0,125,2,116,1,124,2,131,1,143,216,1, + 0,116,2,106,3,160,4,124,2,161,1,124,1,117,1,114, + 54,100,1,160,5,124,2,161,1,125,3,116,6,124,3,124, + 2,100,2,141,2,130,1,122,132,124,0,106,7,100,3,117, + 0,114,106,124,0,106,8,100,3,117,0,114,90,116,6,100, + 4,124,0,106,0,100,2,141,2,130,1,116,9,124,0,124, + 1,100,5,100,6,141,3,1,0,110,52,116,9,124,0,124, + 1,100,5,100,6,141,3,1,0,116,10,124,0,106,7,100, + 7,131,2,115,146,124,0,106,7,160,11,124,2,161,1,1, + 0,110,12,124,0,106,7,160,12,124,1,161,1,1,0,87, + 0,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,110,28,116,2,106, + 3,160,13,124,0,106,0,161,1,125,1,124,1,116,2,106, + 3,124,0,106,0,60,0,48,0,87,0,100,3,4,0,4, + 0,131,3,1,0,110,16,49,0,115,236,48,0,1,0,1, + 0,1,0,89,0,1,0,124,1,83,0,41,8,122,70,69, + 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, + 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, + 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, + 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, + 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, + 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, + 115,105,110,103,32,108,111,97,100,101,114,84,114,142,0,0, + 0,114,149,0,0,0,41,14,114,17,0,0,0,114,49,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, + 0,114,44,0,0,0,114,78,0,0,0,114,108,0,0,0, + 114,115,0,0,0,114,147,0,0,0,114,4,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,114,149,0,0, + 0,218,3,112,111,112,41,4,114,94,0,0,0,114,95,0, + 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,92,0,0,0, + 71,2,0,0,115,38,0,0,0,0,2,6,1,10,1,16, + 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, + 1,12,4,14,2,14,4,14,1,14,255,14,1,44,1,114, + 92,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,20,1, + 0,0,122,18,124,0,106,0,160,1,124,0,106,2,161,1, + 1,0,87,0,110,52,1,0,1,0,1,0,124,0,106,2, + 116,3,106,4,118,0,114,64,116,3,106,4,160,5,124,0, 106,2,161,1,125,1,124,1,116,3,106,4,124,0,106,2, - 60,0,116,6,124,1,100,1,100,0,131,3,100,0,107,8, - 114,148,122,12,124,0,106,0,124,1,95,7,87,0,110,20, - 4,0,116,8,107,10,114,146,1,0,1,0,1,0,89,0, + 60,0,130,0,89,0,110,2,48,0,116,3,106,4,160,5, + 124,0,106,2,161,1,125,1,124,1,116,3,106,4,124,0, + 106,2,60,0,116,6,124,1,100,1,100,0,131,3,100,0, + 117,0,114,146,122,12,124,0,106,0,124,1,95,7,87,0, + 110,18,4,0,116,8,121,144,1,0,1,0,1,0,89,0, 110,2,48,0,116,6,124,1,100,2,100,0,131,3,100,0, - 107,8,114,226,122,40,124,1,106,9,124,1,95,10,116,11, - 124,1,100,3,131,2,115,202,124,0,106,2,160,12,100,4, - 161,1,100,5,25,0,124,1,95,10,87,0,110,20,4,0, - 116,8,107,10,114,224,1,0,1,0,1,0,89,0,110,2, - 48,0,116,6,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,22,122,10,124,0,124,1,95,13,87,0,110,22, - 4,0,116,8,107,10,144,1,114,20,1,0,1,0,1,0, - 89,0,110,2,48,0,124,1,83,0,41,7,78,114,97,0, - 0,0,114,144,0,0,0,114,140,0,0,0,114,127,0,0, - 0,114,22,0,0,0,114,104,0,0,0,41,14,114,108,0, - 0,0,114,154,0,0,0,114,17,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,155,0,0,0,114,6,0,0,0, - 114,97,0,0,0,114,105,0,0,0,114,1,0,0,0,114, - 144,0,0,0,114,4,0,0,0,114,128,0,0,0,114,104, - 0,0,0,114,150,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,25,95,108,111,97,100,95,98, - 97,99,107,119,97,114,100,95,99,111,109,112,97,116,105,98, - 108,101,101,2,0,0,115,54,0,0,0,0,4,2,1,18, - 1,6,1,12,1,14,1,12,1,8,3,14,1,12,1,16, - 1,2,1,12,1,14,1,6,1,16,1,2,4,8,1,10, - 1,22,1,14,1,6,1,18,1,2,1,10,1,16,1,6, - 1,114,157,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, - 226,0,0,0,124,0,106,0,100,0,107,9,114,30,116,1, - 124,0,106,0,100,1,131,2,115,30,116,2,124,0,131,1, - 83,0,116,3,124,0,131,1,125,1,100,2,124,0,95,4, - 122,168,124,1,116,5,106,6,124,0,106,7,60,0,122,52, - 124,0,106,0,100,0,107,8,114,96,124,0,106,8,100,0, - 107,8,114,108,116,9,100,3,124,0,106,7,100,4,141,2, - 130,1,110,12,124,0,106,0,160,10,124,1,161,1,1,0, - 87,0,110,50,1,0,1,0,1,0,122,14,116,5,106,6, - 124,0,106,7,61,0,87,0,110,20,4,0,116,11,107,10, - 114,152,1,0,1,0,1,0,89,0,110,2,48,0,130,0, - 89,0,110,2,48,0,116,5,106,6,160,12,124,0,106,7, - 161,1,125,1,124,1,116,5,106,6,124,0,106,7,60,0, - 116,13,100,5,124,0,106,7,124,0,106,0,131,3,1,0, - 87,0,100,6,124,0,95,4,110,8,100,6,124,0,95,4, - 48,0,124,1,83,0,41,7,78,114,149,0,0,0,84,114, - 153,0,0,0,114,16,0,0,0,122,18,105,109,112,111,114, - 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,14, - 114,108,0,0,0,114,4,0,0,0,114,157,0,0,0,114, - 151,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,15,0,0,0,114,91,0,0,0,114,17,0, - 0,0,114,115,0,0,0,114,78,0,0,0,114,149,0,0, - 0,114,62,0,0,0,114,155,0,0,0,114,75,0,0,0, - 114,150,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,138,2,0,0,115,48,0,0,0,0,2,10, - 2,12,1,8,2,8,5,6,1,2,1,12,1,2,1,10, - 1,10,1,16,3,16,1,6,1,2,1,14,1,14,1,6, - 1,8,5,14,1,12,1,18,2,8,0,8,2,114,158,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, - 116,0,124,0,106,1,131,1,143,24,1,0,116,2,124,0, - 131,1,87,0,2,0,100,1,4,0,4,0,131,3,1,0, - 83,0,49,0,115,40,48,0,1,0,1,0,1,0,89,0, - 1,0,100,1,83,0,41,2,122,191,82,101,116,117,114,110, - 32,97,32,110,101,119,32,109,111,100,117,108,101,32,111,98, - 106,101,99,116,44,32,108,111,97,100,101,100,32,98,121,32, - 116,104,101,32,115,112,101,99,39,115,32,108,111,97,100,101, - 114,46,10,10,32,32,32,32,84,104,101,32,109,111,100,117, - 108,101,32,105,115,32,110,111,116,32,97,100,100,101,100,32, - 116,111,32,105,116,115,32,112,97,114,101,110,116,46,10,10, - 32,32,32,32,73,102,32,97,32,109,111,100,117,108,101,32, - 105,115,32,97,108,114,101,97,100,121,32,105,110,32,115,121, - 115,46,109,111,100,117,108,101,115,44,32,116,104,97,116,32, - 101,120,105,115,116,105,110,103,32,109,111,100,117,108,101,32, - 103,101,116,115,10,32,32,32,32,99,108,111,98,98,101,114, - 101,100,46,10,10,32,32,32,32,78,41,3,114,49,0,0, - 0,114,17,0,0,0,114,158,0,0,0,41,1,114,94,0, + 117,0,114,222,122,40,124,1,106,9,124,1,95,10,116,11, + 124,1,100,3,131,2,115,200,124,0,106,2,160,12,100,4, + 161,1,100,5,25,0,124,1,95,10,87,0,110,18,4,0, + 116,8,121,220,1,0,1,0,1,0,89,0,110,2,48,0, + 116,6,124,1,100,6,100,0,131,3,100,0,117,0,144,1, + 114,16,122,10,124,0,124,1,95,13,87,0,110,20,4,0, + 116,8,144,1,121,14,1,0,1,0,1,0,89,0,110,2, + 48,0,124,1,83,0,41,7,78,114,97,0,0,0,114,144, + 0,0,0,114,140,0,0,0,114,127,0,0,0,114,22,0, + 0,0,114,104,0,0,0,41,14,114,108,0,0,0,114,154, + 0,0,0,114,17,0,0,0,114,15,0,0,0,114,91,0, + 0,0,114,155,0,0,0,114,6,0,0,0,114,97,0,0, + 0,114,105,0,0,0,114,1,0,0,0,114,144,0,0,0, + 114,4,0,0,0,114,128,0,0,0,114,104,0,0,0,114, + 150,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,25,95,108,111,97,100,95,98,97,99,107,119, + 97,114,100,95,99,111,109,112,97,116,105,98,108,101,101,2, + 0,0,115,54,0,0,0,0,4,2,1,18,1,6,1,12, + 1,14,1,12,1,8,3,14,1,12,1,16,1,2,1,12, + 1,12,1,6,1,16,1,2,4,8,1,10,1,22,1,12, + 1,6,1,18,1,2,1,10,1,14,1,6,1,114,157,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,11,0,0,0,67,0,0,0,115,224,0,0,0, + 124,0,106,0,100,0,117,1,114,30,116,1,124,0,106,0, + 100,1,131,2,115,30,116,2,124,0,131,1,83,0,116,3, + 124,0,131,1,125,1,100,2,124,0,95,4,122,166,124,1, + 116,5,106,6,124,0,106,7,60,0,122,52,124,0,106,0, + 100,0,117,0,114,96,124,0,106,8,100,0,117,0,114,108, + 116,9,100,3,124,0,106,7,100,4,141,2,130,1,110,12, + 124,0,106,0,160,10,124,1,161,1,1,0,87,0,110,48, + 1,0,1,0,1,0,122,14,116,5,106,6,124,0,106,7, + 61,0,87,0,110,18,4,0,116,11,121,150,1,0,1,0, + 1,0,89,0,110,2,48,0,130,0,89,0,110,2,48,0, + 116,5,106,6,160,12,124,0,106,7,161,1,125,1,124,1, + 116,5,106,6,124,0,106,7,60,0,116,13,100,5,124,0, + 106,7,124,0,106,0,131,3,1,0,87,0,100,6,124,0, + 95,4,110,8,100,6,124,0,95,4,48,0,124,1,83,0, + 41,7,78,114,149,0,0,0,84,114,153,0,0,0,114,16, + 0,0,0,122,18,105,109,112,111,114,116,32,123,33,114,125, + 32,35,32,123,33,114,125,70,41,14,114,108,0,0,0,114, + 4,0,0,0,114,157,0,0,0,114,151,0,0,0,90,13, + 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, + 0,0,114,91,0,0,0,114,17,0,0,0,114,115,0,0, + 0,114,78,0,0,0,114,149,0,0,0,114,62,0,0,0, + 114,155,0,0,0,114,75,0,0,0,114,150,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, + 95,108,111,97,100,95,117,110,108,111,99,107,101,100,138,2, + 0,0,115,48,0,0,0,0,2,10,2,12,1,8,2,8, + 5,6,1,2,1,12,1,2,1,10,1,10,1,16,3,16, + 1,6,1,2,1,14,1,12,1,6,1,8,5,14,1,12, + 1,18,2,8,0,8,2,114,158,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, + 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, + 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, + 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, + 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, + 101,99,39,115,32,108,111,97,100,101,114,46,10,10,32,32, + 32,32,84,104,101,32,109,111,100,117,108,101,32,105,115,32, + 110,111,116,32,97,100,100,101,100,32,116,111,32,105,116,115, + 32,112,97,114,101,110,116,46,10,10,32,32,32,32,73,102, + 32,97,32,109,111,100,117,108,101,32,105,115,32,97,108,114, + 101,97,100,121,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, + 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, + 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, + 32,32,32,78,41,3,114,49,0,0,0,114,17,0,0,0, + 114,158,0,0,0,41,1,114,94,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, + 180,2,0,0,115,4,0,0,0,0,9,12,1,114,93,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, + 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, + 100,9,132,1,131,1,90,9,101,7,100,10,100,11,132,0, + 131,1,90,10,101,7,100,12,100,13,132,0,131,1,90,11, + 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, + 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, + 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, + 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, + 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, + 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, + 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, + 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, + 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, + 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, + 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, + 32,122,8,98,117,105,108,116,45,105,110,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, + 67,0,0,0,115,22,0,0,0,100,1,124,0,106,0,155, + 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, + 4,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, + 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, + 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, + 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, + 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, + 32,32,32,32,32,32,122,8,60,109,111,100,117,108,101,32, + 122,2,32,40,122,2,41,62,41,3,114,1,0,0,0,114, + 159,0,0,0,114,137,0,0,0,41,1,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 98,0,0,0,206,2,0,0,115,2,0,0,0,0,7,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,46,0,0,0,124,2,100,0,117, + 1,114,12,100,0,83,0,116,0,160,1,124,1,161,1,114, + 38,116,2,124,1,124,0,124,0,106,3,100,1,141,3,83, + 0,100,0,83,0,100,0,83,0,169,2,78,114,136,0,0, + 0,41,4,114,56,0,0,0,90,10,105,115,95,98,117,105, + 108,116,105,110,114,90,0,0,0,114,137,0,0,0,169,4, + 218,3,99,108,115,114,80,0,0,0,218,4,112,97,116,104, + 218,6,116,97,114,103,101,116,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,9,102,105,110,100,95,115,112, + 101,99,215,2,0,0,115,10,0,0,0,0,2,8,1,4, + 1,10,1,16,2,122,25,66,117,105,108,116,105,110,73,109, + 112,111,114,116,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, + 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, + 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, + 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, + 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, + 97,105,108,117,114,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, + 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, + 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, + 41,2,114,166,0,0,0,114,108,0,0,0,41,4,114,163, + 0,0,0,114,80,0,0,0,114,164,0,0,0,114,94,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,93,0,0,0,180,2,0,0,115,4,0,0,0,0, - 9,12,1,114,93,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,140,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,90,4,101,5,100,3,100,4,132,0,131,1, - 90,6,101,7,100,20,100,6,100,7,132,1,131,1,90,8, - 101,7,100,21,100,8,100,9,132,1,131,1,90,9,101,7, - 100,10,100,11,132,0,131,1,90,10,101,7,100,12,100,13, - 132,0,131,1,90,11,101,7,101,12,100,14,100,15,132,0, - 131,1,131,1,90,13,101,7,101,12,100,16,100,17,132,0, - 131,1,131,1,90,14,101,7,101,12,100,18,100,19,132,0, - 131,1,131,1,90,15,101,7,101,16,131,1,90,17,100,5, - 83,0,41,22,218,15,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,122,144,77,101,116,97,32,112,97,116,104, - 32,105,109,112,111,114,116,32,102,111,114,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,46,10,10,32, - 32,32,32,65,108,108,32,109,101,116,104,111,100,115,32,97, - 114,101,32,101,105,116,104,101,114,32,99,108,97,115,115,32, - 111,114,32,115,116,97,116,105,99,32,109,101,116,104,111,100, - 115,32,116,111,32,97,118,111,105,100,32,116,104,101,32,110, - 101,101,100,32,116,111,10,32,32,32,32,105,110,115,116,97, - 110,116,105,97,116,101,32,116,104,101,32,99,108,97,115,115, - 46,10,10,32,32,32,32,122,8,98,117,105,108,116,45,105, - 110,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,5,0,0,0,67,0,0,0,115,22,0,0,0,100, - 1,124,0,106,0,155,2,100,2,116,1,106,2,155,0,100, - 3,157,5,83,0,41,4,250,115,82,101,116,117,114,110,32, - 114,101,112,114,32,102,111,114,32,116,104,101,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 101,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,84,104,101,32,105,109,112, - 111,114,116,32,109,97,99,104,105,110,101,114,121,32,100,111, - 101,115,32,116,104,101,32,106,111,98,32,105,116,115,101,108, - 102,46,10,10,32,32,32,32,32,32,32,32,122,8,60,109, - 111,100,117,108,101,32,122,2,32,40,122,2,41,62,41,3, - 114,1,0,0,0,114,159,0,0,0,114,137,0,0,0,41, - 1,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,98,0,0,0,206,2,0,0,115,2, - 0,0,0,0,7,122,27,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,109,111,100,117,108,101,95,114,101, - 112,114,78,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,5,0,0,0,67,0,0,0,115,46,0,0, - 0,124,2,100,0,107,9,114,12,100,0,83,0,116,0,160, - 1,124,1,161,1,114,38,116,2,124,1,124,0,124,0,106, - 3,100,1,141,3,83,0,100,0,83,0,100,0,83,0,169, - 2,78,114,136,0,0,0,41,4,114,56,0,0,0,90,10, - 105,115,95,98,117,105,108,116,105,110,114,90,0,0,0,114, - 137,0,0,0,169,4,218,3,99,108,115,114,80,0,0,0, - 218,4,112,97,116,104,218,6,116,97,114,103,101,116,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,9,102, - 105,110,100,95,115,112,101,99,215,2,0,0,115,10,0,0, - 0,0,2,8,1,4,1,10,1,16,2,122,25,66,117,105, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,224,2, + 0,0,115,4,0,0,0,0,9,12,1,122,27,66,117,105, 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, - 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,1,107,9,114,26,124,3,106,1,83,0,100,1, - 83,0,41,2,122,175,70,105,110,100,32,116,104,101,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,73,102,32,39,112,97,116, - 104,39,32,105,115,32,101,118,101,114,32,115,112,101,99,105, - 102,105,101,100,32,116,104,101,110,32,116,104,101,32,115,101, - 97,114,99,104,32,105,115,32,99,111,110,115,105,100,101,114, - 101,100,32,97,32,102,97,105,108,117,114,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,41,2,114,166,0,0,0,114,108,0, - 0,0,41,4,114,163,0,0,0,114,80,0,0,0,114,164, - 0,0,0,114,94,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,224,2,0,0,115,4,0,0,0,0,9,12, - 1,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,46,0,0,0,124,1,106,0, - 116,1,106,2,107,7,114,34,116,3,100,1,160,4,124,1, - 106,0,161,1,124,1,106,0,100,2,141,2,130,1,116,5, - 116,6,106,7,124,1,131,2,83,0,41,3,122,24,67,114, - 101,97,116,101,32,97,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,114,76,0,0,0,114,16,0,0,0, - 41,8,114,17,0,0,0,114,15,0,0,0,114,77,0,0, - 0,114,78,0,0,0,114,44,0,0,0,114,66,0,0,0, - 114,56,0,0,0,90,14,99,114,101,97,116,101,95,98,117, - 105,108,116,105,110,41,2,114,30,0,0,0,114,94,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,148,0,0,0,236,2,0,0,115,10,0,0,0,0,3, - 12,1,12,1,4,255,6,2,122,29,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,116,1,106,2,124,1,131,2,1, - 0,100,1,83,0,41,2,122,22,69,120,101,99,32,97,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,78, - 41,3,114,66,0,0,0,114,56,0,0,0,90,12,101,120, - 101,99,95,98,117,105,108,116,105,110,41,2,114,30,0,0, - 0,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,149,0,0,0,244,2,0,0,115,2, - 0,0,0,0,3,122,27,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,57,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104, - 97,118,101,32,99,111,100,101,32,111,98,106,101,99,116,115, - 46,78,114,10,0,0,0,169,2,114,163,0,0,0,114,80, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,103,101,116,95,99,111,100,101,249,2,0,0, - 115,2,0,0,0,0,4,122,24,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, + 100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,46,0,0,0,124,1,106,0,116,1,106,2,118,1, + 114,34,116,3,100,1,160,4,124,1,106,0,161,1,124,1, + 106,0,100,2,141,2,130,1,116,5,116,6,106,7,124,1, + 131,2,83,0,41,3,122,24,67,114,101,97,116,101,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 114,76,0,0,0,114,16,0,0,0,41,8,114,17,0,0, + 0,114,15,0,0,0,114,77,0,0,0,114,78,0,0,0, + 114,44,0,0,0,114,66,0,0,0,114,56,0,0,0,90, + 14,99,114,101,97,116,101,95,98,117,105,108,116,105,110,41, + 2,114,30,0,0,0,114,94,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,148,0,0,0,236, + 2,0,0,115,10,0,0,0,0,3,12,1,12,1,4,255, + 6,2,122,29,66,117,105,108,116,105,110,73,109,112,111,114, + 116,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,56,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,115,32,100,111,32,110,111,116,32,104,97, - 118,101,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,10,0,0,0,114,168,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,255,2,0,0,115,2,0,0,0,0,4, - 122,26,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,103,101,116,95,115,111,117,114,99,101,99,2,0,0, + 0,0,3,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,116,1,106,2,124,1,131,2,1,0,100,1,83,0,41, + 2,122,22,69,120,101,99,32,97,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,78,41,3,114,66,0,0, + 0,114,56,0,0,0,90,12,101,120,101,99,95,98,117,105, + 108,116,105,110,41,2,114,30,0,0,0,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 149,0,0,0,244,2,0,0,115,2,0,0,0,0,3,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,52,82,101,116,117,114,110,32,70,97,108,115,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99, - 107,97,103,101,115,46,70,114,10,0,0,0,114,168,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,114,0,0,0,5,3,0,0,115,2,0,0,0,0,4, - 122,26,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,105,115,95,112,97,99,107,97,103,101,41,2,78,78, - 41,1,78,41,18,114,1,0,0,0,114,0,0,0,0,114, - 2,0,0,0,114,3,0,0,0,114,137,0,0,0,218,12, - 115,116,97,116,105,99,109,101,116,104,111,100,114,98,0,0, - 0,218,11,99,108,97,115,115,109,101,116,104,111,100,114,166, - 0,0,0,114,167,0,0,0,114,148,0,0,0,114,149,0, - 0,0,114,85,0,0,0,114,169,0,0,0,114,170,0,0, - 0,114,114,0,0,0,114,96,0,0,0,114,154,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,159,0,0,0,195,2,0,0,115,44,0, - 0,0,8,2,4,7,4,2,2,1,10,8,2,1,12,8, - 2,1,12,11,2,1,10,7,2,1,10,4,2,1,2,1, - 12,4,2,1,2,1,12,4,2,1,2,1,12,4,114,159, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,64,0,0,0,115,144,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,90, - 4,101,5,100,3,100,4,132,0,131,1,90,6,101,7,100, - 22,100,6,100,7,132,1,131,1,90,8,101,7,100,23,100, - 8,100,9,132,1,131,1,90,9,101,7,100,10,100,11,132, - 0,131,1,90,10,101,5,100,12,100,13,132,0,131,1,90, - 11,101,7,100,14,100,15,132,0,131,1,90,12,101,7,101, - 13,100,16,100,17,132,0,131,1,131,1,90,14,101,7,101, - 13,100,18,100,19,132,0,131,1,131,1,90,15,101,7,101, - 13,100,20,100,21,132,0,131,1,131,1,90,16,100,5,83, - 0,41,24,218,14,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,122,142,77,101,116,97,32,112,97,116,104,32,105, - 109,112,111,114,116,32,102,111,114,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, - 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, - 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, - 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, - 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, - 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, - 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, - 32,32,32,90,6,102,114,111,122,101,110,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, - 67,0,0,0,115,16,0,0,0,100,1,160,0,124,0,106, - 1,116,2,106,3,161,2,83,0,41,2,114,160,0,0,0, - 114,152,0,0,0,41,4,114,44,0,0,0,114,1,0,0, - 0,114,173,0,0,0,114,137,0,0,0,41,1,218,1,109, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 98,0,0,0,25,3,0,0,115,2,0,0,0,0,7,122, - 26,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, - 109,111,100,117,108,101,95,114,101,112,114,78,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, - 0,67,0,0,0,115,34,0,0,0,116,0,160,1,124,1, - 161,1,114,26,116,2,124,1,124,0,124,0,106,3,100,1, - 141,3,83,0,100,0,83,0,100,0,83,0,114,161,0,0, - 0,41,4,114,56,0,0,0,114,87,0,0,0,114,90,0, - 0,0,114,137,0,0,0,114,162,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,166,0,0,0, - 34,3,0,0,115,6,0,0,0,0,2,10,1,16,2,122, - 24,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, - 102,105,110,100,95,115,112,101,99,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,18,0,0,0,116,0,160,1,124,1,161,1,114, - 14,124,0,83,0,100,1,83,0,41,2,122,93,70,105,110, - 100,32,97,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, - 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,78,41,2,114,56,0, - 0,0,114,87,0,0,0,41,3,114,163,0,0,0,114,80, - 0,0,0,114,164,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,167,0,0,0,41,3,0,0, - 115,2,0,0,0,0,7,122,26,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,102,105,110,100,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,42,85,115,101,32,100,101,102, - 97,117,108,116,32,115,101,109,97,110,116,105,99,115,32,102, - 111,114,32,109,111,100,117,108,101,32,99,114,101,97,116,105, - 111,110,46,78,114,10,0,0,0,41,2,114,163,0,0,0, - 114,94,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,148,0,0,0,50,3,0,0,115,2,0, - 0,0,0,2,122,28,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,4,0,0,0,67,0,0,0,115,64,0,0,0, - 124,0,106,0,106,1,125,1,116,2,160,3,124,1,161,1, - 115,36,116,4,100,1,160,5,124,1,161,1,124,1,100,2, - 141,2,130,1,116,6,116,2,106,7,124,1,131,2,125,2, - 116,8,124,2,124,0,106,9,131,2,1,0,100,0,83,0, - 114,86,0,0,0,41,10,114,104,0,0,0,114,17,0,0, - 0,114,56,0,0,0,114,87,0,0,0,114,78,0,0,0, - 114,44,0,0,0,114,66,0,0,0,218,17,103,101,116,95, - 102,114,111,122,101,110,95,111,98,106,101,99,116,218,4,101, - 120,101,99,114,7,0,0,0,41,3,114,95,0,0,0,114, - 17,0,0,0,218,4,99,111,100,101,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,149,0,0,0,54,3, - 0,0,115,14,0,0,0,0,2,8,1,10,1,10,1,2, - 255,6,2,12,1,122,26,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,46,101,120,101,99,95,109,111,100,117,108, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, - 0,124,0,124,1,131,2,83,0,41,1,122,95,76,111,97, - 100,32,97,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, - 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,41,1,114,96, - 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,154,0,0,0,63,3,0,0, - 115,2,0,0,0,0,7,122,26,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,108,111,97,100,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, - 0,116,0,160,1,124,1,161,1,83,0,41,1,122,45,82, - 101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,111, - 98,106,101,99,116,32,102,111,114,32,116,104,101,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,46,41,2,114,56, - 0,0,0,114,175,0,0,0,114,168,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,169,0,0, - 0,72,3,0,0,115,2,0,0,0,0,4,122,23,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,46,103,101,116, - 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,54,82,101,116,117,114, - 110,32,78,111,110,101,32,97,115,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,115,32,100,111,32,110,111,116,32, - 104,97,118,101,32,115,111,117,114,99,101,32,99,111,100,101, - 46,78,114,10,0,0,0,114,168,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,170,0,0,0, - 78,3,0,0,115,2,0,0,0,0,4,122,25,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,103,101,116,95, + 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, + 100,101,32,111,98,106,101,99,116,115,46,78,114,10,0,0, + 0,169,2,114,163,0,0,0,114,80,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,8,103,101, + 116,95,99,111,100,101,249,2,0,0,115,2,0,0,0,0, + 4,122,24,66,117,105,108,116,105,110,73,109,112,111,114,116, + 101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, + 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, + 168,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,255, + 2,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,103,101,116,95, 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 10,0,0,0,116,0,160,1,124,1,161,1,83,0,41,1, - 122,46,82,101,116,117,114,110,32,84,114,117,101,32,105,102, - 32,116,104,101,32,102,114,111,122,101,110,32,109,111,100,117, - 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46, - 41,2,114,56,0,0,0,90,17,105,115,95,102,114,111,122, - 101,110,95,112,97,99,107,97,103,101,114,168,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,114, - 0,0,0,84,3,0,0,115,2,0,0,0,0,4,122,25, - 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,105, - 115,95,112,97,99,107,97,103,101,41,2,78,78,41,1,78, - 41,17,114,1,0,0,0,114,0,0,0,0,114,2,0,0, - 0,114,3,0,0,0,114,137,0,0,0,114,171,0,0,0, - 114,98,0,0,0,114,172,0,0,0,114,166,0,0,0,114, - 167,0,0,0,114,148,0,0,0,114,149,0,0,0,114,154, - 0,0,0,114,89,0,0,0,114,169,0,0,0,114,170,0, - 0,0,114,114,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,173,0,0,0, - 14,3,0,0,115,46,0,0,0,8,2,4,7,4,2,2, - 1,10,8,2,1,12,6,2,1,12,8,2,1,10,3,2, - 1,10,8,2,1,10,8,2,1,2,1,12,4,2,1,2, - 1,12,4,2,1,2,1,114,173,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,32,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,83,0,41,7,218,18,95,73, - 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, - 122,36,67,111,110,116,101,120,116,32,109,97,110,97,103,101, - 114,32,102,111,114,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,160,1,161,0,1,0,100,1,83,0, - 41,2,122,24,65,99,113,117,105,114,101,32,116,104,101,32, - 105,109,112,111,114,116,32,108,111,99,107,46,78,41,2,114, - 56,0,0,0,114,57,0,0,0,114,46,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,53,0, - 0,0,97,3,0,0,115,2,0,0,0,0,2,122,28,95, - 73,109,112,111,114,116,76,111,99,107,67,111,110,116,101,120, - 116,46,95,95,101,110,116,101,114,95,95,99,4,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,2,0,0,0, - 67,0,0,0,115,12,0,0,0,116,0,160,1,161,0,1, - 0,100,1,83,0,41,2,122,60,82,101,108,101,97,115,101, - 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, - 32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,97, - 110,121,32,114,97,105,115,101,100,32,101,120,99,101,112,116, - 105,111,110,115,46,78,41,2,114,56,0,0,0,114,59,0, - 0,0,41,4,114,30,0,0,0,218,8,101,120,99,95,116, - 121,112,101,218,9,101,120,99,95,118,97,108,117,101,218,13, - 101,120,99,95,116,114,97,99,101,98,97,99,107,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,55,0,0, - 0,101,3,0,0,115,2,0,0,0,0,2,122,27,95,73, - 109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,116, - 46,95,95,101,120,105,116,95,95,78,41,6,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,53,0,0,0,114,55,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,178, - 0,0,0,93,3,0,0,115,6,0,0,0,8,2,4,2, - 8,4,114,178,0,0,0,99,3,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, - 115,64,0,0,0,124,1,160,0,100,1,124,2,100,2,24, - 0,161,2,125,3,116,1,124,3,131,1,124,2,107,0,114, - 36,116,2,100,3,131,1,130,1,124,3,100,4,25,0,125, - 4,124,0,114,60,100,5,160,3,124,4,124,0,161,2,83, - 0,124,4,83,0,41,6,122,50,82,101,115,111,108,118,101, - 32,97,32,114,101,108,97,116,105,118,101,32,109,111,100,117, - 108,101,32,110,97,109,101,32,116,111,32,97,110,32,97,98, - 115,111,108,117,116,101,32,111,110,101,46,114,127,0,0,0, - 114,37,0,0,0,122,50,97,116,116,101,109,112,116,101,100, - 32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,116, - 32,98,101,121,111,110,100,32,116,111,112,45,108,101,118,101, - 108,32,112,97,99,107,97,103,101,114,22,0,0,0,250,5, - 123,125,46,123,125,41,4,218,6,114,115,112,108,105,116,218, - 3,108,101,110,114,78,0,0,0,114,44,0,0,0,41,5, - 114,17,0,0,0,218,7,112,97,99,107,97,103,101,218,5, - 108,101,118,101,108,90,4,98,105,116,115,90,4,98,97,115, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,13,95,114,101,115,111,108,118,101,95,110,97,109,101,106, - 3,0,0,115,10,0,0,0,0,2,16,1,12,1,8,1, - 8,1,114,187,0,0,0,99,3,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,34,0,0,0,124,0,160,0,124,1,124,2,161,2,125, - 3,124,3,100,0,107,8,114,24,100,0,83,0,116,1,124, - 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,167, - 0,0,0,114,90,0,0,0,41,4,218,6,102,105,110,100, - 101,114,114,17,0,0,0,114,164,0,0,0,114,108,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,17,95,102,105,110,100,95,115,112,101,99,95,108,101,103, - 97,99,121,115,3,0,0,115,8,0,0,0,0,3,12,1, - 8,1,4,1,114,189,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,10,0,0,0,10,0,0,0,67,0, - 0,0,115,36,1,0,0,116,0,106,1,125,3,124,3,100, - 1,107,8,114,22,116,2,100,2,131,1,130,1,124,3,115, - 38,116,3,160,4,100,3,116,5,161,2,1,0,124,0,116, - 0,106,6,107,6,125,4,124,3,68,0,93,234,125,5,116, - 7,131,0,143,96,1,0,122,10,124,5,106,8,125,6,87, - 0,110,56,4,0,116,9,107,10,114,130,1,0,1,0,1, - 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, - 1,107,8,114,126,89,0,87,0,100,1,4,0,4,0,131, - 3,1,0,113,52,89,0,110,14,48,0,124,6,124,0,124, - 1,124,2,131,3,125,7,87,0,100,1,4,0,4,0,131, - 3,1,0,110,16,49,0,115,164,48,0,1,0,1,0,1, - 0,89,0,1,0,124,7,100,1,107,9,114,52,124,4,144, - 1,115,22,124,0,116,0,106,6,107,6,144,1,114,22,116, - 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, - 9,87,0,110,28,4,0,116,9,107,10,114,248,1,0,1, - 0,1,0,124,7,6,0,89,0,2,0,1,0,83,0,48, - 0,124,9,100,1,107,8,144,1,114,12,124,7,2,0,1, - 0,83,0,124,9,2,0,1,0,83,0,113,52,124,7,2, - 0,1,0,83,0,113,52,100,1,83,0,41,4,122,21,70, - 105,110,100,32,97,32,109,111,100,117,108,101,39,115,32,115, - 112,101,99,46,78,122,53,115,121,115,46,109,101,116,97,95, - 112,97,116,104,32,105,115,32,78,111,110,101,44,32,80,121, - 116,104,111,110,32,105,115,32,108,105,107,101,108,121,32,115, - 104,117,116,116,105,110,103,32,100,111,119,110,122,22,115,121, - 115,46,109,101,116,97,95,112,97,116,104,32,105,115,32,101, - 109,112,116,121,41,12,114,15,0,0,0,218,9,109,101,116, - 97,95,112,97,116,104,114,78,0,0,0,218,9,95,119,97, - 114,110,105,110,103,115,218,4,119,97,114,110,218,13,73,109, - 112,111,114,116,87,97,114,110,105,110,103,114,91,0,0,0, - 114,178,0,0,0,114,166,0,0,0,114,105,0,0,0,114, - 189,0,0,0,114,104,0,0,0,41,10,114,17,0,0,0, - 114,164,0,0,0,114,165,0,0,0,114,190,0,0,0,90, - 9,105,115,95,114,101,108,111,97,100,114,188,0,0,0,114, - 166,0,0,0,114,94,0,0,0,114,95,0,0,0,114,104, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,102,105,110,100,95,115,112,101,99,124,3, - 0,0,115,54,0,0,0,0,2,6,1,8,2,8,3,4, - 1,12,5,10,1,8,1,8,1,2,1,10,1,14,1,12, - 1,8,1,22,2,42,1,8,2,18,1,10,1,2,1,10, - 1,14,4,14,2,10,1,8,2,10,2,10,2,114,194,0, - 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,5,0,0,0,67,0,0,0,115,108,0,0,0, - 116,0,124,0,116,1,131,2,115,28,116,2,100,1,160,3, - 116,4,124,0,131,1,161,1,131,1,130,1,124,2,100,2, - 107,0,114,44,116,5,100,3,131,1,130,1,124,2,100,2, - 107,4,114,84,116,0,124,1,116,1,131,2,115,72,116,2, - 100,4,131,1,130,1,110,12,124,1,115,84,116,6,100,5, - 131,1,130,1,124,0,115,104,124,2,100,2,107,2,114,104, - 116,5,100,6,131,1,130,1,100,7,83,0,41,8,122,28, - 86,101,114,105,102,121,32,97,114,103,117,109,101,110,116,115, - 32,97,114,101,32,34,115,97,110,101,34,46,122,31,109,111, - 100,117,108,101,32,110,97,109,101,32,109,117,115,116,32,98, - 101,32,115,116,114,44,32,110,111,116,32,123,125,114,22,0, - 0,0,122,18,108,101,118,101,108,32,109,117,115,116,32,98, - 101,32,62,61,32,48,122,31,95,95,112,97,99,107,97,103, - 101,95,95,32,110,111,116,32,115,101,116,32,116,111,32,97, - 32,115,116,114,105,110,103,122,54,97,116,116,101,109,112,116, - 101,100,32,114,101,108,97,116,105,118,101,32,105,109,112,111, - 114,116,32,119,105,116,104,32,110,111,32,107,110,111,119,110, - 32,112,97,114,101,110,116,32,112,97,99,107,97,103,101,122, - 17,69,109,112,116,121,32,109,111,100,117,108,101,32,110,97, - 109,101,78,41,7,218,10,105,115,105,110,115,116,97,110,99, - 101,218,3,115,116,114,218,9,84,121,112,101,69,114,114,111, - 114,114,44,0,0,0,114,14,0,0,0,218,10,86,97,108, - 117,101,69,114,114,111,114,114,78,0,0,0,169,3,114,17, - 0,0,0,114,185,0,0,0,114,186,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,13,95,115, - 97,110,105,116,121,95,99,104,101,99,107,171,3,0,0,115, - 22,0,0,0,0,2,10,1,18,1,8,1,8,1,8,1, - 10,1,10,1,4,1,8,2,12,1,114,200,0,0,0,122, - 16,78,111,32,109,111,100,117,108,101,32,110,97,109,101,100, - 32,122,4,123,33,114,125,99,2,0,0,0,0,0,0,0, - 0,0,0,0,8,0,0,0,8,0,0,0,67,0,0,0, - 115,220,0,0,0,100,0,125,2,124,0,160,0,100,1,161, - 1,100,2,25,0,125,3,124,3,114,134,124,3,116,1,106, - 2,107,7,114,42,116,3,124,1,124,3,131,2,1,0,124, - 0,116,1,106,2,107,6,114,62,116,1,106,2,124,0,25, - 0,83,0,116,1,106,2,124,3,25,0,125,4,122,10,124, - 4,106,4,125,2,87,0,110,50,4,0,116,5,107,10,114, - 132,1,0,1,0,1,0,116,6,100,3,23,0,160,7,124, - 0,124,3,161,2,125,5,116,8,124,5,124,0,100,4,141, - 2,100,0,130,2,89,0,110,2,48,0,116,9,124,0,124, - 2,131,2,125,6,124,6,100,0,107,8,114,172,116,8,116, - 6,160,7,124,0,161,1,124,0,100,4,141,2,130,1,110, - 8,116,10,124,6,131,1,125,7,124,3,114,216,116,1,106, - 2,124,3,25,0,125,4,116,11,124,4,124,0,160,0,100, - 1,161,1,100,5,25,0,124,7,131,3,1,0,124,7,83, - 0,41,6,78,114,127,0,0,0,114,22,0,0,0,122,23, - 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, - 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, - 0,41,12,114,128,0,0,0,114,15,0,0,0,114,91,0, - 0,0,114,66,0,0,0,114,140,0,0,0,114,105,0,0, - 0,218,8,95,69,82,82,95,77,83,71,114,44,0,0,0, - 218,19,77,111,100,117,108,101,78,111,116,70,111,117,110,100, - 69,114,114,111,114,114,194,0,0,0,114,158,0,0,0,114, - 5,0,0,0,41,8,114,17,0,0,0,218,7,105,109,112, - 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, - 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, - 0,0,114,94,0,0,0,114,95,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,23,95,102,105, - 110,100,95,97,110,100,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,190,3,0,0,115,42,0,0,0,0,1,4, - 1,14,1,4,1,10,1,10,2,10,1,10,1,10,1,2, - 1,10,1,14,1,16,1,20,1,10,1,8,1,20,2,8, - 1,4,2,10,1,22,1,114,205,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,8,0,0, - 0,67,0,0,0,115,128,0,0,0,116,0,124,0,131,1, - 143,62,1,0,116,1,106,2,160,3,124,0,116,4,161,2, - 125,2,124,2,116,4,107,8,114,56,116,5,124,0,124,1, - 131,2,87,0,2,0,100,1,4,0,4,0,131,3,1,0, - 83,0,87,0,100,1,4,0,4,0,131,3,1,0,110,16, - 49,0,115,76,48,0,1,0,1,0,1,0,89,0,1,0, - 124,2,100,1,107,8,114,116,100,2,160,6,124,0,161,1, - 125,3,116,7,124,3,124,0,100,3,141,2,130,1,116,8, - 124,0,131,1,1,0,124,2,83,0,41,4,122,25,70,105, - 110,100,32,97,110,100,32,108,111,97,100,32,116,104,101,32, - 109,111,100,117,108,101,46,78,122,40,105,109,112,111,114,116, - 32,111,102,32,123,125,32,104,97,108,116,101,100,59,32,78, - 111,110,101,32,105,110,32,115,121,115,46,109,111,100,117,108, - 101,115,114,16,0,0,0,41,9,114,49,0,0,0,114,15, - 0,0,0,114,91,0,0,0,114,34,0,0,0,218,14,95, - 78,69,69,68,83,95,76,79,65,68,73,78,71,114,205,0, - 0,0,114,44,0,0,0,114,203,0,0,0,114,64,0,0, - 0,41,4,114,17,0,0,0,114,204,0,0,0,114,95,0, - 0,0,114,74,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,14,95,102,105,110,100,95,97,110, - 100,95,108,111,97,100,220,3,0,0,115,22,0,0,0,0, - 2,10,1,14,1,8,1,54,2,8,1,4,1,2,255,4, - 2,12,2,8,1,114,207,0,0,0,114,22,0,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,42,0,0,0,116,0,124, - 0,124,1,124,2,131,3,1,0,124,2,100,1,107,4,114, - 32,116,1,124,0,124,1,124,2,131,3,125,0,116,2,124, - 0,116,3,131,2,83,0,41,2,97,50,1,0,0,73,109, - 112,111,114,116,32,97,110,100,32,114,101,116,117,114,110,32, - 116,104,101,32,109,111,100,117,108,101,32,98,97,115,101,100, - 32,111,110,32,105,116,115,32,110,97,109,101,44,32,116,104, - 101,32,112,97,99,107,97,103,101,32,116,104,101,32,99,97, - 108,108,32,105,115,10,32,32,32,32,98,101,105,110,103,32, - 109,97,100,101,32,102,114,111,109,44,32,97,110,100,32,116, - 104,101,32,108,101,118,101,108,32,97,100,106,117,115,116,109, - 101,110,116,46,10,10,32,32,32,32,84,104,105,115,32,102, - 117,110,99,116,105,111,110,32,114,101,112,114,101,115,101,110, - 116,115,32,116,104,101,32,103,114,101,97,116,101,115,116,32, - 99,111,109,109,111,110,32,100,101,110,111,109,105,110,97,116, - 111,114,32,111,102,32,102,117,110,99,116,105,111,110,97,108, - 105,116,121,10,32,32,32,32,98,101,116,119,101,101,110,32, - 105,109,112,111,114,116,95,109,111,100,117,108,101,32,97,110, - 100,32,95,95,105,109,112,111,114,116,95,95,46,32,84,104, - 105,115,32,105,110,99,108,117,100,101,115,32,115,101,116,116, - 105,110,103,32,95,95,112,97,99,107,97,103,101,95,95,32, - 105,102,10,32,32,32,32,116,104,101,32,108,111,97,100,101, - 114,32,100,105,100,32,110,111,116,46,10,10,32,32,32,32, - 114,22,0,0,0,41,4,114,200,0,0,0,114,187,0,0, - 0,114,207,0,0,0,218,11,95,103,99,100,95,105,109,112, - 111,114,116,114,199,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,208,0,0,0,236,3,0,0, - 115,8,0,0,0,0,9,12,1,8,1,12,1,114,208,0, - 0,0,169,1,218,9,114,101,99,117,114,115,105,118,101,99, - 3,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, - 11,0,0,0,67,0,0,0,115,234,0,0,0,124,1,68, - 0,93,224,125,4,116,0,124,4,116,1,131,2,115,66,124, - 3,114,34,124,0,106,2,100,1,23,0,125,5,110,4,100, - 2,125,5,116,3,100,3,124,5,155,0,100,4,116,4,124, - 4,131,1,106,2,155,0,157,4,131,1,130,1,113,4,124, - 4,100,5,107,2,114,108,124,3,115,228,116,5,124,0,100, - 6,131,2,114,228,116,6,124,0,124,0,106,7,124,2,100, - 7,100,8,141,4,1,0,113,4,116,5,124,0,124,4,131, - 2,115,4,100,9,160,8,124,0,106,2,124,4,161,2,125, - 6,122,14,116,9,124,2,124,6,131,2,1,0,87,0,113, - 4,4,0,116,10,107,10,114,226,1,0,125,7,1,0,122, - 54,124,7,106,11,124,6,107,2,114,204,116,12,106,13,160, - 14,124,6,116,15,161,2,100,10,107,9,114,204,87,0,89, - 0,100,10,125,7,126,7,113,4,130,0,87,0,89,0,100, - 10,125,7,126,7,113,4,100,10,125,7,126,7,48,0,48, - 0,113,4,124,0,83,0,41,11,122,238,70,105,103,117,114, - 101,32,111,117,116,32,119,104,97,116,32,95,95,105,109,112, - 111,114,116,95,95,32,115,104,111,117,108,100,32,114,101,116, - 117,114,110,46,10,10,32,32,32,32,84,104,101,32,105,109, - 112,111,114,116,95,32,112,97,114,97,109,101,116,101,114,32, - 105,115,32,97,32,99,97,108,108,97,98,108,101,32,119,104, - 105,99,104,32,116,97,107,101,115,32,116,104,101,32,110,97, - 109,101,32,111,102,32,109,111,100,117,108,101,32,116,111,10, - 32,32,32,32,105,109,112,111,114,116,46,32,73,116,32,105, - 115,32,114,101,113,117,105,114,101,100,32,116,111,32,100,101, - 99,111,117,112,108,101,32,116,104,101,32,102,117,110,99,116, - 105,111,110,32,102,114,111,109,32,97,115,115,117,109,105,110, - 103,32,105,109,112,111,114,116,108,105,98,39,115,10,32,32, - 32,32,105,109,112,111,114,116,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,105,115,32,100,101,115,105,114, - 101,100,46,10,10,32,32,32,32,122,8,46,95,95,97,108, - 108,95,95,122,13,96,96,102,114,111,109,32,108,105,115,116, - 39,39,122,8,73,116,101,109,32,105,110,32,122,18,32,109, - 117,115,116,32,98,101,32,115,116,114,44,32,110,111,116,32, - 250,1,42,218,7,95,95,97,108,108,95,95,84,114,209,0, - 0,0,114,182,0,0,0,78,41,16,114,195,0,0,0,114, - 196,0,0,0,114,1,0,0,0,114,197,0,0,0,114,14, - 0,0,0,114,4,0,0,0,218,16,95,104,97,110,100,108, - 101,95,102,114,111,109,108,105,115,116,114,212,0,0,0,114, - 44,0,0,0,114,66,0,0,0,114,203,0,0,0,114,17, - 0,0,0,114,15,0,0,0,114,91,0,0,0,114,34,0, - 0,0,114,206,0,0,0,41,8,114,95,0,0,0,218,8, - 102,114,111,109,108,105,115,116,114,204,0,0,0,114,210,0, - 0,0,218,1,120,90,5,119,104,101,114,101,90,9,102,114, - 111,109,95,110,97,109,101,90,3,101,120,99,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,213,0,0,0, - 251,3,0,0,115,44,0,0,0,0,10,8,1,10,1,4, - 1,12,2,4,1,28,2,8,1,14,1,10,1,2,255,8, - 2,10,1,14,1,2,1,14,1,16,4,10,1,16,255,2, - 2,12,1,26,1,114,213,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,6,0,0,0,67, - 0,0,0,115,146,0,0,0,124,0,160,0,100,1,161,1, - 125,1,124,0,160,0,100,2,161,1,125,2,124,1,100,3, - 107,9,114,82,124,2,100,3,107,9,114,78,124,1,124,2, - 106,1,107,3,114,78,116,2,106,3,100,4,124,1,155,2, - 100,5,124,2,106,1,155,2,100,6,157,5,116,4,100,7, - 100,8,141,3,1,0,124,1,83,0,124,2,100,3,107,9, - 114,96,124,2,106,1,83,0,116,2,106,3,100,9,116,4, - 100,7,100,8,141,3,1,0,124,0,100,10,25,0,125,1, - 100,11,124,0,107,7,114,142,124,1,160,5,100,12,161,1, - 100,13,25,0,125,1,124,1,83,0,41,14,122,167,67,97, - 108,99,117,108,97,116,101,32,119,104,97,116,32,95,95,112, - 97,99,107,97,103,101,95,95,32,115,104,111,117,108,100,32, - 98,101,46,10,10,32,32,32,32,95,95,112,97,99,107,97, - 103,101,95,95,32,105,115,32,110,111,116,32,103,117,97,114, - 97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,102, - 105,110,101,100,32,111,114,32,99,111,117,108,100,32,98,101, - 32,115,101,116,32,116,111,32,78,111,110,101,10,32,32,32, - 32,116,111,32,114,101,112,114,101,115,101,110,116,32,116,104, - 97,116,32,105,116,115,32,112,114,111,112,101,114,32,118,97, - 108,117,101,32,105,115,32,117,110,107,110,111,119,110,46,10, - 10,32,32,32,32,114,144,0,0,0,114,104,0,0,0,78, - 122,32,95,95,112,97,99,107,97,103,101,95,95,32,33,61, - 32,95,95,115,112,101,99,95,95,46,112,97,114,101,110,116, - 32,40,122,4,32,33,61,32,250,1,41,233,3,0,0,0, - 41,1,90,10,115,116,97,99,107,108,101,118,101,108,122,89, - 99,97,110,39,116,32,114,101,115,111,108,118,101,32,112,97, - 99,107,97,103,101,32,102,114,111,109,32,95,95,115,112,101, - 99,95,95,32,111,114,32,95,95,112,97,99,107,97,103,101, - 95,95,44,32,102,97,108,108,105,110,103,32,98,97,99,107, - 32,111,110,32,95,95,110,97,109,101,95,95,32,97,110,100, - 32,95,95,112,97,116,104,95,95,114,1,0,0,0,114,140, - 0,0,0,114,127,0,0,0,114,22,0,0,0,41,6,114, - 34,0,0,0,114,129,0,0,0,114,191,0,0,0,114,192, - 0,0,0,114,193,0,0,0,114,128,0,0,0,41,3,218, - 7,103,108,111,98,97,108,115,114,185,0,0,0,114,94,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,52,82,101,116,117, + 114,110,32,70,97,108,115,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,97,114,101, + 32,110,101,118,101,114,32,112,97,99,107,97,103,101,115,46, + 70,114,10,0,0,0,114,168,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,114,0,0,0,5, + 3,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,105,115,95,112, + 97,99,107,97,103,101,41,2,78,78,41,1,78,41,18,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,137,0,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,98,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,166,0,0,0,114,167,0, + 0,0,114,148,0,0,0,114,149,0,0,0,114,85,0,0, + 0,114,169,0,0,0,114,170,0,0,0,114,114,0,0,0, + 114,96,0,0,0,114,154,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,159, + 0,0,0,195,2,0,0,115,44,0,0,0,8,2,4,7, + 4,2,2,1,10,8,2,1,12,8,2,1,12,11,2,1, + 10,7,2,1,10,4,2,1,2,1,12,4,2,1,2,1, + 12,4,2,1,2,1,12,4,114,159,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,144,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,90,4,101,5,100,3,100, + 4,132,0,131,1,90,6,101,7,100,22,100,6,100,7,132, + 1,131,1,90,8,101,7,100,23,100,8,100,9,132,1,131, + 1,90,9,101,7,100,10,100,11,132,0,131,1,90,10,101, + 5,100,12,100,13,132,0,131,1,90,11,101,7,100,14,100, + 15,132,0,131,1,90,12,101,7,101,13,100,16,100,17,132, + 0,131,1,131,1,90,14,101,7,101,13,100,18,100,19,132, + 0,131,1,131,1,90,15,101,7,101,13,100,20,100,21,132, + 0,131,1,131,1,90,16,100,5,83,0,41,24,218,14,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,122,142,77, + 101,116,97,32,112,97,116,104,32,105,109,112,111,114,116,32, + 102,111,114,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, + 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, + 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, + 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, + 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, + 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, + 32,99,108,97,115,115,46,10,10,32,32,32,32,90,6,102, + 114,111,122,101,110,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,16, + 0,0,0,100,1,160,0,124,0,106,1,116,2,106,3,161, + 2,83,0,41,2,114,160,0,0,0,114,152,0,0,0,41, + 4,114,44,0,0,0,114,1,0,0,0,114,173,0,0,0, + 114,137,0,0,0,41,1,218,1,109,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,98,0,0,0,25,3, + 0,0,115,2,0,0,0,0,7,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,109,111,100,117,108,101, + 95,114,101,112,114,78,99,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, + 34,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, + 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, + 83,0,100,0,83,0,114,161,0,0,0,41,4,114,56,0, + 0,0,114,87,0,0,0,114,90,0,0,0,114,137,0,0, + 0,114,162,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,166,0,0,0,34,3,0,0,115,6, + 0,0,0,0,2,10,1,16,2,122,24,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,115, + 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,18,0,0, + 0,116,0,160,1,124,1,161,1,114,14,124,0,83,0,100, + 1,83,0,41,2,122,93,70,105,110,100,32,97,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, + 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, + 32,32,32,32,78,41,2,114,56,0,0,0,114,87,0,0, + 0,41,3,114,163,0,0,0,114,80,0,0,0,114,164,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,17,95,99,97,108,99,95,95,95,112,97,99,107,97, - 103,101,95,95,32,4,0,0,115,38,0,0,0,0,7,10, - 1,10,1,8,1,18,1,22,2,2,0,2,254,6,3,4, - 1,8,1,6,2,6,2,2,0,2,254,6,3,8,1,8, - 1,14,1,114,219,0,0,0,114,10,0,0,0,99,5,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, - 0,0,67,0,0,0,115,180,0,0,0,124,4,100,1,107, - 2,114,18,116,0,124,0,131,1,125,5,110,36,124,1,100, - 2,107,9,114,30,124,1,110,2,105,0,125,6,116,1,124, - 6,131,1,125,7,116,0,124,0,124,7,124,4,131,3,125, - 5,124,3,115,150,124,4,100,1,107,2,114,84,116,0,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,83,0,124, - 0,115,92,124,5,83,0,116,3,124,0,131,1,116,3,124, - 0,160,2,100,3,161,1,100,1,25,0,131,1,24,0,125, - 8,116,4,106,5,124,5,106,6,100,2,116,3,124,5,106, - 6,131,1,124,8,24,0,133,2,25,0,25,0,83,0,110, - 26,116,7,124,5,100,4,131,2,114,172,116,8,124,5,124, - 3,116,0,131,3,83,0,124,5,83,0,100,2,83,0,41, - 5,97,215,1,0,0,73,109,112,111,114,116,32,97,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,84,104,101,32, - 39,103,108,111,98,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,117,115,101,100,32,116,111,32,105,110, - 102,101,114,32,119,104,101,114,101,32,116,104,101,32,105,109, - 112,111,114,116,32,105,115,32,111,99,99,117,114,114,105,110, - 103,32,102,114,111,109,10,32,32,32,32,116,111,32,104,97, - 110,100,108,101,32,114,101,108,97,116,105,118,101,32,105,109, - 112,111,114,116,115,46,32,84,104,101,32,39,108,111,99,97, - 108,115,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 105,103,110,111,114,101,100,46,32,84,104,101,10,32,32,32, - 32,39,102,114,111,109,108,105,115,116,39,32,97,114,103,117, - 109,101,110,116,32,115,112,101,99,105,102,105,101,115,32,119, - 104,97,116,32,115,104,111,117,108,100,32,101,120,105,115,116, - 32,97,115,32,97,116,116,114,105,98,117,116,101,115,32,111, - 110,32,116,104,101,32,109,111,100,117,108,101,10,32,32,32, - 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,32, - 40,101,46,103,46,32,96,96,102,114,111,109,32,109,111,100, - 117,108,101,32,105,109,112,111,114,116,32,60,102,114,111,109, - 108,105,115,116,62,96,96,41,46,32,32,84,104,101,32,39, - 108,101,118,101,108,39,10,32,32,32,32,97,114,103,117,109, - 101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116, - 104,101,32,112,97,99,107,97,103,101,32,108,111,99,97,116, - 105,111,110,32,116,111,32,105,109,112,111,114,116,32,102,114, - 111,109,32,105,110,32,97,32,114,101,108,97,116,105,118,101, - 10,32,32,32,32,105,109,112,111,114,116,32,40,101,46,103, - 46,32,96,96,102,114,111,109,32,46,46,112,107,103,32,105, - 109,112,111,114,116,32,109,111,100,96,96,32,119,111,117,108, - 100,32,104,97,118,101,32,97,32,39,108,101,118,101,108,39, - 32,111,102,32,50,41,46,10,10,32,32,32,32,114,22,0, - 0,0,78,114,127,0,0,0,114,140,0,0,0,41,9,114, - 208,0,0,0,114,219,0,0,0,218,9,112,97,114,116,105, - 116,105,111,110,114,184,0,0,0,114,15,0,0,0,114,91, - 0,0,0,114,1,0,0,0,114,4,0,0,0,114,213,0, - 0,0,41,9,114,17,0,0,0,114,218,0,0,0,218,6, - 108,111,99,97,108,115,114,214,0,0,0,114,186,0,0,0, - 114,95,0,0,0,90,8,103,108,111,98,97,108,115,95,114, - 185,0,0,0,90,7,99,117,116,95,111,102,102,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,10,95,95, - 105,109,112,111,114,116,95,95,59,4,0,0,115,30,0,0, - 0,0,11,8,1,10,2,16,1,8,1,12,1,4,3,8, - 1,18,1,4,1,4,4,26,3,32,1,10,1,12,2,114, - 222,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,116,0,160,1,124,0,161,1,125,1,124,1,100,0, - 107,8,114,30,116,2,100,1,124,0,23,0,131,1,130,1, - 116,3,124,1,131,1,83,0,41,2,78,122,25,110,111,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,32, - 110,97,109,101,100,32,41,4,114,159,0,0,0,114,166,0, - 0,0,114,78,0,0,0,114,158,0,0,0,41,2,114,17, - 0,0,0,114,94,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,18,95,98,117,105,108,116,105, - 110,95,102,114,111,109,95,110,97,109,101,96,4,0,0,115, - 8,0,0,0,0,1,10,1,8,1,12,1,114,223,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,10,0, - 0,0,5,0,0,0,67,0,0,0,115,166,0,0,0,124, - 1,97,0,124,0,97,1,116,2,116,1,131,1,125,2,116, - 1,106,3,160,4,161,0,68,0,93,72,92,2,125,3,125, - 4,116,5,124,4,124,2,131,2,114,26,124,3,116,1,106, - 6,107,6,114,60,116,7,125,5,110,18,116,0,160,8,124, - 3,161,1,114,26,116,9,125,5,110,2,113,26,116,10,124, - 4,124,5,131,2,125,6,116,11,124,6,124,4,131,2,1, - 0,113,26,116,1,106,3,116,12,25,0,125,7,100,1,68, - 0,93,46,125,8,124,8,116,1,106,3,107,7,114,138,116, - 13,124,8,131,1,125,9,110,10,116,1,106,3,124,8,25, - 0,125,9,116,14,124,7,124,8,124,9,131,3,1,0,113, - 114,100,2,83,0,41,3,122,250,83,101,116,117,112,32,105, - 109,112,111,114,116,108,105,98,32,98,121,32,105,109,112,111, - 114,116,105,110,103,32,110,101,101,100,101,100,32,98,117,105, - 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, - 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, - 10,32,32,32,32,105,110,116,111,32,116,104,101,32,103,108, - 111,98,97,108,32,110,97,109,101,115,112,97,99,101,46,10, - 10,32,32,32,32,65,115,32,115,121,115,32,105,115,32,110, - 101,101,100,101,100,32,102,111,114,32,115,121,115,46,109,111, - 100,117,108,101,115,32,97,99,99,101,115,115,32,97,110,100, - 32,95,105,109,112,32,105,115,32,110,101,101,100,101,100,32, - 116,111,32,108,111,97,100,32,98,117,105,108,116,45,105,110, - 10,32,32,32,32,109,111,100,117,108,101,115,44,32,116,104, - 111,115,101,32,116,119,111,32,109,111,100,117,108,101,115,32, - 109,117,115,116,32,98,101,32,101,120,112,108,105,99,105,116, - 108,121,32,112,97,115,115,101,100,32,105,110,46,10,10,32, - 32,32,32,41,3,114,23,0,0,0,114,191,0,0,0,114, - 63,0,0,0,78,41,15,114,56,0,0,0,114,15,0,0, - 0,114,14,0,0,0,114,91,0,0,0,218,5,105,116,101, - 109,115,114,195,0,0,0,114,77,0,0,0,114,159,0,0, - 0,114,87,0,0,0,114,173,0,0,0,114,141,0,0,0, - 114,147,0,0,0,114,1,0,0,0,114,223,0,0,0,114, - 5,0,0,0,41,10,218,10,115,121,115,95,109,111,100,117, - 108,101,218,11,95,105,109,112,95,109,111,100,117,108,101,90, - 11,109,111,100,117,108,101,95,116,121,112,101,114,17,0,0, - 0,114,95,0,0,0,114,108,0,0,0,114,94,0,0,0, - 90,11,115,101,108,102,95,109,111,100,117,108,101,90,12,98, - 117,105,108,116,105,110,95,110,97,109,101,90,14,98,117,105, - 108,116,105,110,95,109,111,100,117,108,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,6,95,115,101,116, - 117,112,103,4,0,0,115,36,0,0,0,0,9,4,1,4, - 3,8,1,18,1,10,1,10,1,6,1,10,1,6,2,2, - 1,10,1,12,3,10,1,8,1,10,1,10,2,10,1,114, - 227,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,116,0,124,0,124,1,131,2,1,0,116,1,106,2, - 160,3,116,4,161,1,1,0,116,1,106,2,160,3,116,5, - 161,1,1,0,100,1,83,0,41,2,122,48,73,110,115,116, - 97,108,108,32,105,109,112,111,114,116,101,114,115,32,102,111, - 114,32,98,117,105,108,116,105,110,32,97,110,100,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,115,78,41,6,114, - 227,0,0,0,114,15,0,0,0,114,190,0,0,0,114,118, - 0,0,0,114,159,0,0,0,114,173,0,0,0,41,2,114, - 225,0,0,0,114,226,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,8,95,105,110,115,116,97, - 108,108,138,4,0,0,115,6,0,0,0,0,2,10,2,12, - 1,114,228,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,4,0,0,0,67,0,0,0,115, - 32,0,0,0,100,1,100,2,108,0,125,0,124,0,97,1, - 124,0,160,2,116,3,106,4,116,5,25,0,161,1,1,0, - 100,2,83,0,41,3,122,57,73,110,115,116,97,108,108,32, - 105,109,112,111,114,116,101,114,115,32,116,104,97,116,32,114, - 101,113,117,105,114,101,32,101,120,116,101,114,110,97,108,32, - 102,105,108,101,115,121,115,116,101,109,32,97,99,99,101,115, - 115,114,22,0,0,0,78,41,6,218,26,95,102,114,111,122, - 101,110,95,105,109,112,111,114,116,108,105,98,95,101,120,116, - 101,114,110,97,108,114,125,0,0,0,114,228,0,0,0,114, - 15,0,0,0,114,91,0,0,0,114,1,0,0,0,41,1, - 114,229,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,27,95,105,110,115,116,97,108,108,95,101, - 120,116,101,114,110,97,108,95,105,109,112,111,114,116,101,114, - 115,146,4,0,0,115,6,0,0,0,0,3,8,1,4,1, - 114,230,0,0,0,41,2,78,78,41,1,78,41,2,78,114, - 22,0,0,0,41,4,78,78,114,10,0,0,0,114,22,0, - 0,0,41,50,114,3,0,0,0,114,125,0,0,0,114,12, - 0,0,0,114,18,0,0,0,114,58,0,0,0,114,33,0, - 0,0,114,42,0,0,0,114,19,0,0,0,114,20,0,0, - 0,114,48,0,0,0,114,49,0,0,0,114,52,0,0,0, - 114,64,0,0,0,114,66,0,0,0,114,75,0,0,0,114, - 85,0,0,0,114,89,0,0,0,114,96,0,0,0,114,110, - 0,0,0,114,111,0,0,0,114,90,0,0,0,114,141,0, - 0,0,114,147,0,0,0,114,151,0,0,0,114,106,0,0, - 0,114,92,0,0,0,114,157,0,0,0,114,158,0,0,0, - 114,93,0,0,0,114,159,0,0,0,114,173,0,0,0,114, - 178,0,0,0,114,187,0,0,0,114,189,0,0,0,114,194, - 0,0,0,114,200,0,0,0,90,15,95,69,82,82,95,77, - 83,71,95,80,82,69,70,73,88,114,202,0,0,0,114,205, - 0,0,0,218,6,111,98,106,101,99,116,114,206,0,0,0, - 114,207,0,0,0,114,208,0,0,0,114,213,0,0,0,114, - 219,0,0,0,114,222,0,0,0,114,223,0,0,0,114,227, - 0,0,0,114,228,0,0,0,114,230,0,0,0,114,10,0, + 0,114,167,0,0,0,41,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, + 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, + 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,10, + 0,0,0,41,2,114,163,0,0,0,114,94,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,148, + 0,0,0,50,3,0,0,115,2,0,0,0,0,2,122,28, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, + 0,67,0,0,0,115,64,0,0,0,124,0,106,0,106,1, + 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, + 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, + 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, + 106,9,131,2,1,0,100,0,83,0,114,86,0,0,0,41, + 10,114,104,0,0,0,114,17,0,0,0,114,56,0,0,0, + 114,87,0,0,0,114,78,0,0,0,114,44,0,0,0,114, + 66,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, + 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, + 0,0,41,3,114,95,0,0,0,114,17,0,0,0,218,4, + 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,149,0,0,0,54,3,0,0,115,14,0,0, + 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,122, + 26,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, + 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,124,0,124,1,131, + 2,83,0,41,1,122,95,76,111,97,100,32,97,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, + 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,41,1,114,96,0,0,0,114,168,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,8,60,109,111,100,117,108,101,62,1,0,0,0,115, - 94,0,0,0,4,24,4,2,8,8,8,8,4,2,4,3, - 16,4,14,68,14,21,14,16,8,37,8,17,8,11,14,8, - 8,11,8,12,8,16,8,36,14,101,16,26,10,45,14,72, - 8,17,8,17,8,30,8,37,8,42,8,15,14,75,14,79, - 14,13,8,9,8,9,10,47,8,16,4,1,8,2,8,27, - 6,3,8,16,10,15,14,37,8,27,10,37,8,7,8,35, - 8,8, + 0,114,154,0,0,0,63,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,1,122,45,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,41,2,114,56,0,0,0,114,175,0, + 0,0,114,168,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,169,0,0,0,72,3,0,0,115, + 2,0,0,0,0,4,122,23,70,114,111,122,101,110,73,109, + 112,111,114,116,101,114,46,103,101,116,95,99,111,100,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,122,54,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, + 0,114,168,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,170,0,0,0,78,3,0,0,115,2, + 0,0,0,0,4,122,25,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,46,103,101,116,95,115,111,117,114,99,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, + 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, + 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, + 97,32,112,97,99,107,97,103,101,46,41,2,114,56,0,0, + 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, + 107,97,103,101,114,168,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,114,0,0,0,84,3,0, + 0,115,2,0,0,0,0,4,122,25,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107, + 97,103,101,41,2,78,78,41,1,78,41,17,114,1,0,0, + 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, + 114,137,0,0,0,114,171,0,0,0,114,98,0,0,0,114, + 172,0,0,0,114,166,0,0,0,114,167,0,0,0,114,148, + 0,0,0,114,149,0,0,0,114,154,0,0,0,114,89,0, + 0,0,114,169,0,0,0,114,170,0,0,0,114,114,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,173,0,0,0,14,3,0,0,115,46, + 0,0,0,8,2,4,7,4,2,2,1,10,8,2,1,12, + 6,2,1,12,8,2,1,10,3,2,1,10,8,2,1,10, + 8,2,1,2,1,12,4,2,1,2,1,12,4,2,1,2, + 1,114,173,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, + 32,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,83,0,41,7,218,18,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, + 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, + 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, + 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,46,78,41,2,114,56,0,0,0,114,57, + 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,53,0,0,0,97,3,0,0, + 115,2,0,0,0,0,2,122,28,95,73,109,112,111,114,116, + 76,111,99,107,67,111,110,116,101,120,116,46,95,95,101,110, + 116,101,114,95,95,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, + 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, + 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, + 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, + 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, + 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, + 41,2,114,56,0,0,0,114,59,0,0,0,41,4,114,30, + 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, + 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, + 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,55,0,0,0,101,3,0,0,115, + 2,0,0,0,0,2,122,27,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,46,95,95,101,120,105, + 116,95,95,78,41,6,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,53,0,0,0,114, + 55,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,178,0,0,0,93,3,0, + 0,115,6,0,0,0,8,2,4,2,8,4,114,178,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, + 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, + 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, + 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, + 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, + 6,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, + 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, + 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, + 32,111,110,101,46,114,127,0,0,0,114,37,0,0,0,122, + 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, + 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, + 97,103,101,114,22,0,0,0,250,5,123,125,46,123,125,41, + 4,218,6,114,115,112,108,105,116,218,3,108,101,110,114,78, + 0,0,0,114,44,0,0,0,41,5,114,17,0,0,0,218, + 7,112,97,99,107,97,103,101,218,5,108,101,118,101,108,90, + 4,98,105,116,115,90,4,98,97,115,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,13,95,114,101,115, + 111,108,118,101,95,110,97,109,101,106,3,0,0,115,10,0, + 0,0,0,2,16,1,12,1,8,1,8,1,114,187,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,4,0,0,0,67,0,0,0,115,34,0,0,0,124, + 0,160,0,124,1,124,2,161,2,125,3,124,3,100,0,117, + 0,114,24,100,0,83,0,116,1,124,1,124,3,131,2,83, + 0,114,13,0,0,0,41,2,114,167,0,0,0,114,90,0, + 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, + 0,114,164,0,0,0,114,108,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,17,95,102,105,110, + 100,95,115,112,101,99,95,108,101,103,97,99,121,115,3,0, + 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,189, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,10,0,0,0,67,0,0,0,115,32,1,0, + 0,116,0,106,1,125,3,124,3,100,1,117,0,114,22,116, + 2,100,2,131,1,130,1,124,3,115,38,116,3,160,4,100, + 3,116,5,161,2,1,0,124,0,116,0,106,6,118,0,125, + 4,124,3,68,0,93,230,125,5,116,7,131,0,143,94,1, + 0,122,10,124,5,106,8,125,6,87,0,110,54,4,0,116, + 9,121,128,1,0,1,0,1,0,116,10,124,5,124,0,124, + 1,131,3,125,7,124,7,100,1,117,0,114,124,89,0,87, + 0,100,1,4,0,4,0,131,3,1,0,113,52,89,0,110, + 14,48,0,124,6,124,0,124,1,124,2,131,3,125,7,87, + 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, + 162,48,0,1,0,1,0,1,0,89,0,1,0,124,7,100, + 1,117,1,114,52,124,4,144,1,115,18,124,0,116,0,106, + 6,118,0,144,1,114,18,116,0,106,6,124,0,25,0,125, + 8,122,10,124,8,106,11,125,9,87,0,110,26,4,0,116, + 9,121,244,1,0,1,0,1,0,124,7,6,0,89,0,2, + 0,1,0,83,0,48,0,124,9,100,1,117,0,144,1,114, + 8,124,7,2,0,1,0,83,0,124,9,2,0,1,0,83, + 0,113,52,124,7,2,0,1,0,83,0,113,52,100,1,83, + 0,41,4,122,21,70,105,110,100,32,97,32,109,111,100,117, + 108,101,39,115,32,115,112,101,99,46,78,122,53,115,121,115, + 46,109,101,116,97,95,112,97,116,104,32,105,115,32,78,111, + 110,101,44,32,80,121,116,104,111,110,32,105,115,32,108,105, + 107,101,108,121,32,115,104,117,116,116,105,110,103,32,100,111, + 119,110,122,22,115,121,115,46,109,101,116,97,95,112,97,116, + 104,32,105,115,32,101,109,112,116,121,41,12,114,15,0,0, + 0,218,9,109,101,116,97,95,112,97,116,104,114,78,0,0, + 0,218,9,95,119,97,114,110,105,110,103,115,218,4,119,97, + 114,110,218,13,73,109,112,111,114,116,87,97,114,110,105,110, + 103,114,91,0,0,0,114,178,0,0,0,114,166,0,0,0, + 114,105,0,0,0,114,189,0,0,0,114,104,0,0,0,41, + 10,114,17,0,0,0,114,164,0,0,0,114,165,0,0,0, + 114,190,0,0,0,90,9,105,115,95,114,101,108,111,97,100, + 114,188,0,0,0,114,166,0,0,0,114,94,0,0,0,114, + 95,0,0,0,114,104,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,10,95,102,105,110,100,95, + 115,112,101,99,124,3,0,0,115,54,0,0,0,0,2,6, + 1,8,2,8,3,4,1,12,5,10,1,8,1,8,1,2, + 1,10,1,12,1,12,1,8,1,22,2,42,1,8,2,18, + 1,10,1,2,1,10,1,12,4,14,2,10,1,8,2,10, + 2,10,2,114,194,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,108,0,0,0,116,0,124,0,116,1,131,2,115,28, + 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, + 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, + 130,1,124,2,100,2,107,4,114,84,116,0,124,1,116,1, + 131,2,115,72,116,2,100,4,131,1,130,1,110,12,124,1, + 115,84,116,6,100,5,131,1,130,1,124,0,115,104,124,2, + 100,2,107,2,114,104,116,5,100,6,131,1,130,1,100,7, + 83,0,41,8,122,28,86,101,114,105,102,121,32,97,114,103, + 117,109,101,110,116,115,32,97,114,101,32,34,115,97,110,101, + 34,46,122,31,109,111,100,117,108,101,32,110,97,109,101,32, + 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, + 32,123,125,114,22,0,0,0,122,18,108,101,118,101,108,32, + 109,117,115,116,32,98,101,32,62,61,32,48,122,31,95,95, + 112,97,99,107,97,103,101,95,95,32,110,111,116,32,115,101, + 116,32,116,111,32,97,32,115,116,114,105,110,103,122,54,97, + 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, + 101,32,105,109,112,111,114,116,32,119,105,116,104,32,110,111, + 32,107,110,111,119,110,32,112,97,114,101,110,116,32,112,97, + 99,107,97,103,101,122,17,69,109,112,116,121,32,109,111,100, + 117,108,101,32,110,97,109,101,78,41,7,218,10,105,115,105, + 110,115,116,97,110,99,101,218,3,115,116,114,218,9,84,121, + 112,101,69,114,114,111,114,114,44,0,0,0,114,14,0,0, + 0,218,10,86,97,108,117,101,69,114,114,111,114,114,78,0, + 0,0,169,3,114,17,0,0,0,114,185,0,0,0,114,186, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, + 107,171,3,0,0,115,22,0,0,0,0,2,10,1,18,1, + 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, + 114,200,0,0,0,122,16,78,111,32,109,111,100,117,108,101, + 32,110,97,109,101,100,32,122,4,123,33,114,125,99,2,0, + 0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0, + 0,0,67,0,0,0,115,218,0,0,0,100,0,125,2,124, + 0,160,0,100,1,161,1,100,2,25,0,125,3,124,3,114, + 132,124,3,116,1,106,2,118,1,114,42,116,3,124,1,124, + 3,131,2,1,0,124,0,116,1,106,2,118,0,114,62,116, + 1,106,2,124,0,25,0,83,0,116,1,106,2,124,3,25, + 0,125,4,122,10,124,4,106,4,125,2,87,0,110,48,4, + 0,116,5,121,130,1,0,1,0,1,0,116,6,100,3,23, + 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, + 0,100,4,141,2,100,0,130,2,89,0,110,2,48,0,116, + 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, + 170,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, + 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,114, + 214,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, + 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, + 0,124,7,83,0,41,6,78,114,127,0,0,0,114,22,0, + 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, + 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, + 233,2,0,0,0,41,12,114,128,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,66,0,0,0,114,140,0,0,0, + 114,105,0,0,0,218,8,95,69,82,82,95,77,83,71,114, + 44,0,0,0,218,19,77,111,100,117,108,101,78,111,116,70, + 111,117,110,100,69,114,114,111,114,114,194,0,0,0,114,158, + 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, + 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, + 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, + 101,114,156,0,0,0,114,94,0,0,0,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 23,95,102,105,110,100,95,97,110,100,95,108,111,97,100,95, + 117,110,108,111,99,107,101,100,190,3,0,0,115,42,0,0, + 0,0,1,4,1,14,1,4,1,10,1,10,2,10,1,10, + 1,10,1,2,1,10,1,12,1,16,1,20,1,10,1,8, + 1,20,2,8,1,4,2,10,1,22,1,114,205,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0, + 124,0,131,1,143,62,1,0,116,1,106,2,160,3,124,0, + 116,4,161,2,125,2,124,2,116,4,117,0,114,56,116,5, + 124,0,124,1,131,2,87,0,2,0,100,1,4,0,4,0, + 131,3,1,0,83,0,87,0,100,1,4,0,4,0,131,3, + 1,0,110,16,49,0,115,76,48,0,1,0,1,0,1,0, + 89,0,1,0,124,2,100,1,117,0,114,116,100,2,160,6, + 124,0,161,1,125,3,116,7,124,3,124,0,100,3,141,2, + 130,1,116,8,124,0,131,1,1,0,124,2,83,0,41,4, + 122,25,70,105,110,100,32,97,110,100,32,108,111,97,100,32, + 116,104,101,32,109,111,100,117,108,101,46,78,122,40,105,109, + 112,111,114,116,32,111,102,32,123,125,32,104,97,108,116,101, + 100,59,32,78,111,110,101,32,105,110,32,115,121,115,46,109, + 111,100,117,108,101,115,114,16,0,0,0,41,9,114,49,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, + 0,218,14,95,78,69,69,68,83,95,76,79,65,68,73,78, + 71,114,205,0,0,0,114,44,0,0,0,114,203,0,0,0, + 114,64,0,0,0,41,4,114,17,0,0,0,114,204,0,0, + 0,114,95,0,0,0,114,74,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,14,95,102,105,110, + 100,95,97,110,100,95,108,111,97,100,220,3,0,0,115,22, + 0,0,0,0,2,10,1,14,1,8,1,54,2,8,1,4, + 1,2,255,4,2,12,2,8,1,114,207,0,0,0,114,22, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, + 0,116,0,124,0,124,1,124,2,131,3,1,0,124,2,100, + 1,107,4,114,32,116,1,124,0,124,1,124,2,131,3,125, + 0,116,2,124,0,116,3,131,2,83,0,41,2,97,50,1, + 0,0,73,109,112,111,114,116,32,97,110,100,32,114,101,116, + 117,114,110,32,116,104,101,32,109,111,100,117,108,101,32,98, + 97,115,101,100,32,111,110,32,105,116,115,32,110,97,109,101, + 44,32,116,104,101,32,112,97,99,107,97,103,101,32,116,104, + 101,32,99,97,108,108,32,105,115,10,32,32,32,32,98,101, + 105,110,103,32,109,97,100,101,32,102,114,111,109,44,32,97, + 110,100,32,116,104,101,32,108,101,118,101,108,32,97,100,106, + 117,115,116,109,101,110,116,46,10,10,32,32,32,32,84,104, + 105,115,32,102,117,110,99,116,105,111,110,32,114,101,112,114, + 101,115,101,110,116,115,32,116,104,101,32,103,114,101,97,116, + 101,115,116,32,99,111,109,109,111,110,32,100,101,110,111,109, + 105,110,97,116,111,114,32,111,102,32,102,117,110,99,116,105, + 111,110,97,108,105,116,121,10,32,32,32,32,98,101,116,119, + 101,101,110,32,105,109,112,111,114,116,95,109,111,100,117,108, + 101,32,97,110,100,32,95,95,105,109,112,111,114,116,95,95, + 46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32, + 115,101,116,116,105,110,103,32,95,95,112,97,99,107,97,103, + 101,95,95,32,105,102,10,32,32,32,32,116,104,101,32,108, + 111,97,100,101,114,32,100,105,100,32,110,111,116,46,10,10, + 32,32,32,32,114,22,0,0,0,41,4,114,200,0,0,0, + 114,187,0,0,0,114,207,0,0,0,218,11,95,103,99,100, + 95,105,109,112,111,114,116,114,199,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,208,0,0,0, + 236,3,0,0,115,8,0,0,0,0,9,12,1,8,1,12, + 1,114,208,0,0,0,169,1,218,9,114,101,99,117,114,115, + 105,118,101,99,3,0,0,0,0,0,0,0,1,0,0,0, + 8,0,0,0,11,0,0,0,67,0,0,0,115,232,0,0, + 0,124,1,68,0,93,222,125,4,116,0,124,4,116,1,131, + 2,115,66,124,3,114,34,124,0,106,2,100,1,23,0,125, + 5,110,4,100,2,125,5,116,3,100,3,124,5,155,0,100, + 4,116,4,124,4,131,1,106,2,155,0,157,4,131,1,130, + 1,113,4,124,4,100,5,107,2,114,108,124,3,115,226,116, + 5,124,0,100,6,131,2,114,226,116,6,124,0,124,0,106, + 7,124,2,100,7,100,8,141,4,1,0,113,4,116,5,124, + 0,124,4,131,2,115,4,100,9,160,8,124,0,106,2,124, + 4,161,2,125,6,122,14,116,9,124,2,124,6,131,2,1, + 0,87,0,113,4,4,0,116,10,121,224,1,0,125,7,1, + 0,122,54,124,7,106,11,124,6,107,2,114,202,116,12,106, + 13,160,14,124,6,116,15,161,2,100,10,117,1,114,202,87, + 0,89,0,100,10,125,7,126,7,113,4,130,0,87,0,89, + 0,100,10,125,7,126,7,113,4,100,10,125,7,126,7,48, + 0,48,0,113,4,124,0,83,0,41,11,122,238,70,105,103, + 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, + 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, + 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, + 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, + 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, + 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, + 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, + 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, + 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, + 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, + 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, + 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, + 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, + 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, + 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, + 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, + 209,0,0,0,114,182,0,0,0,78,41,16,114,195,0,0, + 0,114,196,0,0,0,114,1,0,0,0,114,197,0,0,0, + 114,14,0,0,0,114,4,0,0,0,218,16,95,104,97,110, + 100,108,101,95,102,114,111,109,108,105,115,116,114,212,0,0, + 0,114,44,0,0,0,114,66,0,0,0,114,203,0,0,0, + 114,17,0,0,0,114,15,0,0,0,114,91,0,0,0,114, + 34,0,0,0,114,206,0,0,0,41,8,114,95,0,0,0, + 218,8,102,114,111,109,108,105,115,116,114,204,0,0,0,114, + 210,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, + 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,213,0, + 0,0,251,3,0,0,115,44,0,0,0,0,10,8,1,10, + 1,4,1,12,2,4,1,28,2,8,1,14,1,10,1,2, + 255,8,2,10,1,14,1,2,1,14,1,14,4,10,1,16, + 255,2,2,12,1,26,1,114,213,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,67,0,0,0,115,146,0,0,0,124,0,160,0,100,1, + 161,1,125,1,124,0,160,0,100,2,161,1,125,2,124,1, + 100,3,117,1,114,82,124,2,100,3,117,1,114,78,124,1, + 124,2,106,1,107,3,114,78,116,2,106,3,100,4,124,1, + 155,2,100,5,124,2,106,1,155,2,100,6,157,5,116,4, + 100,7,100,8,141,3,1,0,124,1,83,0,124,2,100,3, + 117,1,114,96,124,2,106,1,83,0,116,2,106,3,100,9, + 116,4,100,7,100,8,141,3,1,0,124,0,100,10,25,0, + 125,1,100,11,124,0,118,1,114,142,124,1,160,5,100,12, + 161,1,100,13,25,0,125,1,124,1,83,0,41,14,122,167, + 67,97,108,99,117,108,97,116,101,32,119,104,97,116,32,95, + 95,112,97,99,107,97,103,101,95,95,32,115,104,111,117,108, + 100,32,98,101,46,10,10,32,32,32,32,95,95,112,97,99, + 107,97,103,101,95,95,32,105,115,32,110,111,116,32,103,117, + 97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100, + 101,102,105,110,101,100,32,111,114,32,99,111,117,108,100,32, + 98,101,32,115,101,116,32,116,111,32,78,111,110,101,10,32, + 32,32,32,116,111,32,114,101,112,114,101,115,101,110,116,32, + 116,104,97,116,32,105,116,115,32,112,114,111,112,101,114,32, + 118,97,108,117,101,32,105,115,32,117,110,107,110,111,119,110, + 46,10,10,32,32,32,32,114,144,0,0,0,114,104,0,0, + 0,78,122,32,95,95,112,97,99,107,97,103,101,95,95,32, + 33,61,32,95,95,115,112,101,99,95,95,46,112,97,114,101, + 110,116,32,40,122,4,32,33,61,32,250,1,41,233,3,0, + 0,0,41,1,90,10,115,116,97,99,107,108,101,118,101,108, + 122,89,99,97,110,39,116,32,114,101,115,111,108,118,101,32, + 112,97,99,107,97,103,101,32,102,114,111,109,32,95,95,115, + 112,101,99,95,95,32,111,114,32,95,95,112,97,99,107,97, + 103,101,95,95,44,32,102,97,108,108,105,110,103,32,98,97, + 99,107,32,111,110,32,95,95,110,97,109,101,95,95,32,97, + 110,100,32,95,95,112,97,116,104,95,95,114,1,0,0,0, + 114,140,0,0,0,114,127,0,0,0,114,22,0,0,0,41, + 6,114,34,0,0,0,114,129,0,0,0,114,191,0,0,0, + 114,192,0,0,0,114,193,0,0,0,114,128,0,0,0,41, + 3,218,7,103,108,111,98,97,108,115,114,185,0,0,0,114, + 94,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,17,95,99,97,108,99,95,95,95,112,97,99, + 107,97,103,101,95,95,32,4,0,0,115,38,0,0,0,0, + 7,10,1,10,1,8,1,18,1,22,2,2,0,2,254,6, + 3,4,1,8,1,6,2,6,2,2,0,2,254,6,3,8, + 1,8,1,14,1,114,219,0,0,0,114,10,0,0,0,99, + 5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 5,0,0,0,67,0,0,0,115,180,0,0,0,124,4,100, + 1,107,2,114,18,116,0,124,0,131,1,125,5,110,36,124, + 1,100,2,117,1,114,30,124,1,110,2,105,0,125,6,116, + 1,124,6,131,1,125,7,116,0,124,0,124,7,124,4,131, + 3,125,5,124,3,115,150,124,4,100,1,107,2,114,84,116, + 0,124,0,160,2,100,3,161,1,100,1,25,0,131,1,83, + 0,124,0,115,92,124,5,83,0,116,3,124,0,131,1,116, + 3,124,0,160,2,100,3,161,1,100,1,25,0,131,1,24, + 0,125,8,116,4,106,5,124,5,106,6,100,2,116,3,124, + 5,106,6,131,1,124,8,24,0,133,2,25,0,25,0,83, + 0,110,26,116,7,124,5,100,4,131,2,114,172,116,8,124, + 5,124,3,116,0,131,3,83,0,124,5,83,0,100,2,83, + 0,41,5,97,215,1,0,0,73,109,112,111,114,116,32,97, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,84,104, + 101,32,39,103,108,111,98,97,108,115,39,32,97,114,103,117, + 109,101,110,116,32,105,115,32,117,115,101,100,32,116,111,32, + 105,110,102,101,114,32,119,104,101,114,101,32,116,104,101,32, + 105,109,112,111,114,116,32,105,115,32,111,99,99,117,114,114, + 105,110,103,32,102,114,111,109,10,32,32,32,32,116,111,32, + 104,97,110,100,108,101,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,115,46,32,84,104,101,32,39,108,111, + 99,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105, + 115,32,105,103,110,111,114,101,100,46,32,84,104,101,10,32, + 32,32,32,39,102,114,111,109,108,105,115,116,39,32,97,114, + 103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,115, + 32,119,104,97,116,32,115,104,111,117,108,100,32,101,120,105, + 115,116,32,97,115,32,97,116,116,114,105,98,117,116,101,115, + 32,111,110,32,116,104,101,32,109,111,100,117,108,101,10,32, + 32,32,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,32,40,101,46,103,46,32,96,96,102,114,111,109,32,109, + 111,100,117,108,101,32,105,109,112,111,114,116,32,60,102,114, + 111,109,108,105,115,116,62,96,96,41,46,32,32,84,104,101, + 32,39,108,101,118,101,108,39,10,32,32,32,32,97,114,103, + 117,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115, + 32,116,104,101,32,112,97,99,107,97,103,101,32,108,111,99, + 97,116,105,111,110,32,116,111,32,105,109,112,111,114,116,32, + 102,114,111,109,32,105,110,32,97,32,114,101,108,97,116,105, + 118,101,10,32,32,32,32,105,109,112,111,114,116,32,40,101, + 46,103,46,32,96,96,102,114,111,109,32,46,46,112,107,103, + 32,105,109,112,111,114,116,32,109,111,100,96,96,32,119,111, + 117,108,100,32,104,97,118,101,32,97,32,39,108,101,118,101, + 108,39,32,111,102,32,50,41,46,10,10,32,32,32,32,114, + 22,0,0,0,78,114,127,0,0,0,114,140,0,0,0,41, + 9,114,208,0,0,0,114,219,0,0,0,218,9,112,97,114, + 116,105,116,105,111,110,114,184,0,0,0,114,15,0,0,0, + 114,91,0,0,0,114,1,0,0,0,114,4,0,0,0,114, + 213,0,0,0,41,9,114,17,0,0,0,114,218,0,0,0, + 218,6,108,111,99,97,108,115,114,214,0,0,0,114,186,0, + 0,0,114,95,0,0,0,90,8,103,108,111,98,97,108,115, + 95,114,185,0,0,0,90,7,99,117,116,95,111,102,102,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,10, + 95,95,105,109,112,111,114,116,95,95,59,4,0,0,115,30, + 0,0,0,0,11,8,1,10,2,16,1,8,1,12,1,4, + 3,8,1,18,1,4,1,4,4,26,3,32,1,10,1,12, + 2,114,222,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 38,0,0,0,116,0,160,1,124,0,161,1,125,1,124,1, + 100,0,117,0,114,30,116,2,100,1,124,0,23,0,131,1, + 130,1,116,3,124,1,131,1,83,0,41,2,78,122,25,110, + 111,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,41,4,114,159,0,0,0,114, + 166,0,0,0,114,78,0,0,0,114,158,0,0,0,41,2, + 114,17,0,0,0,114,94,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,18,95,98,117,105,108, + 116,105,110,95,102,114,111,109,95,110,97,109,101,96,4,0, + 0,115,8,0,0,0,0,1,10,1,8,1,12,1,114,223, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, + 0,124,1,97,0,124,0,97,1,116,2,116,1,131,1,125, + 2,116,1,106,3,160,4,161,0,68,0,93,72,92,2,125, + 3,125,4,116,5,124,4,124,2,131,2,114,26,124,3,116, + 1,106,6,118,0,114,60,116,7,125,5,110,18,116,0,160, + 8,124,3,161,1,114,26,116,9,125,5,110,2,113,26,116, + 10,124,4,124,5,131,2,125,6,116,11,124,6,124,4,131, + 2,1,0,113,26,116,1,106,3,116,12,25,0,125,7,100, + 1,68,0,93,46,125,8,124,8,116,1,106,3,118,1,114, + 138,116,13,124,8,131,1,125,9,110,10,116,1,106,3,124, + 8,25,0,125,9,116,14,124,7,124,8,124,9,131,3,1, + 0,113,114,100,2,83,0,41,3,122,250,83,101,116,117,112, + 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, + 112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,104, + 101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,32, + 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, + 46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,115, + 32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,46, + 109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,97, + 110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,101, + 100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,45, + 105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,32, + 116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,101, + 115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,99, + 105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,10, + 10,32,32,32,32,41,3,114,23,0,0,0,114,191,0,0, + 0,114,63,0,0,0,78,41,15,114,56,0,0,0,114,15, + 0,0,0,114,14,0,0,0,114,91,0,0,0,218,5,105, + 116,101,109,115,114,195,0,0,0,114,77,0,0,0,114,159, + 0,0,0,114,87,0,0,0,114,173,0,0,0,114,141,0, + 0,0,114,147,0,0,0,114,1,0,0,0,114,223,0,0, + 0,114,5,0,0,0,41,10,218,10,115,121,115,95,109,111, + 100,117,108,101,218,11,95,105,109,112,95,109,111,100,117,108, + 101,90,11,109,111,100,117,108,101,95,116,121,112,101,114,17, + 0,0,0,114,95,0,0,0,114,108,0,0,0,114,94,0, + 0,0,90,11,115,101,108,102,95,109,111,100,117,108,101,90, + 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, + 117,105,108,116,105,110,95,109,111,100,117,108,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,6,95,115, + 101,116,117,112,103,4,0,0,115,36,0,0,0,0,9,4, + 1,4,3,8,1,18,1,10,1,10,1,6,1,10,1,6, + 2,2,1,10,1,12,3,10,1,8,1,10,1,10,2,10, + 1,114,227,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, + 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, + 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, + 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, + 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, + 6,114,227,0,0,0,114,15,0,0,0,114,190,0,0,0, + 114,118,0,0,0,114,159,0,0,0,114,173,0,0,0,41, + 2,114,225,0,0,0,114,226,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,95,105,110,115, + 116,97,108,108,138,4,0,0,115,6,0,0,0,0,2,10, + 2,12,1,114,228,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, + 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, + 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, + 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, + 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, + 101,115,115,114,22,0,0,0,78,41,6,218,26,95,102,114, + 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, + 120,116,101,114,110,97,108,114,125,0,0,0,114,228,0,0, + 0,114,15,0,0,0,114,91,0,0,0,114,1,0,0,0, + 41,1,114,229,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,27,95,105,110,115,116,97,108,108, + 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, + 101,114,115,146,4,0,0,115,6,0,0,0,0,3,8,1, + 4,1,114,230,0,0,0,41,2,78,78,41,1,78,41,2, + 78,114,22,0,0,0,41,4,78,78,114,10,0,0,0,114, + 22,0,0,0,41,50,114,3,0,0,0,114,125,0,0,0, + 114,12,0,0,0,114,18,0,0,0,114,58,0,0,0,114, + 33,0,0,0,114,42,0,0,0,114,19,0,0,0,114,20, + 0,0,0,114,48,0,0,0,114,49,0,0,0,114,52,0, + 0,0,114,64,0,0,0,114,66,0,0,0,114,75,0,0, + 0,114,85,0,0,0,114,89,0,0,0,114,96,0,0,0, + 114,110,0,0,0,114,111,0,0,0,114,90,0,0,0,114, + 141,0,0,0,114,147,0,0,0,114,151,0,0,0,114,106, + 0,0,0,114,92,0,0,0,114,157,0,0,0,114,158,0, + 0,0,114,93,0,0,0,114,159,0,0,0,114,173,0,0, + 0,114,178,0,0,0,114,187,0,0,0,114,189,0,0,0, + 114,194,0,0,0,114,200,0,0,0,90,15,95,69,82,82, + 95,77,83,71,95,80,82,69,70,73,88,114,202,0,0,0, + 114,205,0,0,0,218,6,111,98,106,101,99,116,114,206,0, + 0,0,114,207,0,0,0,114,208,0,0,0,114,213,0,0, + 0,114,219,0,0,0,114,222,0,0,0,114,223,0,0,0, + 114,227,0,0,0,114,228,0,0,0,114,230,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,94,0,0,0,4,24,4,2,8,8,8,8,4,2, + 4,3,16,4,14,68,14,21,14,16,8,37,8,17,8,11, + 14,8,8,11,8,12,8,16,8,36,14,101,16,26,10,45, + 14,72,8,17,8,17,8,30,8,37,8,42,8,15,14,75, + 14,79,14,13,8,9,8,9,10,47,8,16,4,1,8,2, + 8,27,6,3,8,16,10,15,14,37,8,27,10,37,8,7, + 8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 8c1fa3cac8fa2..52783fc62138d 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -69,7 +69,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,67,65,83,69,79,75,115,12,0,0,0,80,89,84,72, 79,78,67,65,83,69,79,75,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, - 0,115,10,0,0,0,136,0,116,0,106,1,107,6,83,0, + 0,115,10,0,0,0,136,0,116,0,106,1,118,0,83,0, 41,1,250,53,84,114,117,101,32,105,102,32,102,105,108,101, 110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,104, 101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,110, @@ -158,7 +158,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 67,0,0,0,115,96,0,0,0,116,0,116,1,131,1,100, 1,107,2,114,36,124,0,160,2,116,3,161,1,92,3,125, 1,125,2,125,3,124,1,124,3,102,2,83,0,116,4,124, - 0,131,1,68,0,93,42,125,4,124,4,116,1,107,6,114, + 0,131,1,68,0,93,42,125,4,124,4,116,1,118,0,114, 44,124,0,106,5,124,4,100,1,100,2,141,2,92,2,125, 1,125,3,124,1,124,3,102,2,2,0,1,0,83,0,113, 44,100,3,124,0,102,2,83,0,41,4,122,32,82,101,112, @@ -189,1933 +189,1930 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,218,10,95,112,97,116,104,95,115,116,97,116,80, 0,0,0,115,2,0,0,0,0,7,114,48,0,0,0,99, 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,50,0,0,0,122,12,116, - 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, - 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,48, - 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, - 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, - 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, - 121,112,101,46,70,105,0,240,0,0,41,3,114,48,0,0, - 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, - 111,100,101,41,3,114,43,0,0,0,218,4,109,111,100,101, - 90,9,115,116,97,116,95,105,110,102,111,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,18,95,112,97,116, - 104,95,105,115,95,109,111,100,101,95,116,121,112,101,90,0, - 0,0,115,10,0,0,0,0,2,2,1,12,1,14,1,8, - 1,114,52,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 10,0,0,0,116,0,124,0,100,1,131,2,83,0,41,2, - 122,31,82,101,112,108,97,99,101,109,101,110,116,32,102,111, - 114,32,111,115,46,112,97,116,104,46,105,115,102,105,108,101, - 46,105,0,128,0,0,41,1,114,52,0,0,0,114,47,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,12,95,112,97,116,104,95,105,115,102,105,108,101,99, - 0,0,0,115,2,0,0,0,0,2,114,53,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,22,0,0,0,124,0,115, - 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, - 2,83,0,41,2,122,30,82,101,112,108,97,99,101,109,101, - 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, - 115,100,105,114,46,105,0,64,0,0,41,3,114,2,0,0, - 0,218,6,103,101,116,99,119,100,114,52,0,0,0,114,47, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,11,95,112,97,116,104,95,105,115,100,105,114,104, - 0,0,0,115,6,0,0,0,0,2,4,1,8,1,114,55, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,26,0,0, - 0,124,0,160,0,116,1,161,1,112,24,124,0,100,1,100, - 2,133,2,25,0,116,2,107,6,83,0,41,3,122,142,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,105,115,97,98,115,46,10,10,32, - 32,32,32,67,111,110,115,105,100,101,114,115,32,97,32,87, - 105,110,100,111,119,115,32,100,114,105,118,101,45,114,101,108, - 97,116,105,118,101,32,112,97,116,104,32,40,110,111,32,100, - 114,105,118,101,44,32,98,117,116,32,115,116,97,114,116,115, - 32,119,105,116,104,32,115,108,97,115,104,41,32,116,111,10, - 32,32,32,32,115,116,105,108,108,32,98,101,32,34,97,98, - 115,111,108,117,116,101,34,46,10,32,32,32,32,114,38,0, - 0,0,233,3,0,0,0,41,3,114,10,0,0,0,114,30, - 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, - 105,116,104,95,99,111,108,111,110,114,47,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, - 112,97,116,104,95,105,115,97,98,115,111,0,0,0,115,2, - 0,0,0,0,6,114,58,0,0,0,233,182,1,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 11,0,0,0,67,0,0,0,115,182,0,0,0,100,1,160, - 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, - 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, - 6,66,0,124,2,100,2,64,0,161,3,125,4,122,70,116, - 7,160,8,124,4,100,3,161,2,143,26,125,5,124,5,160, - 9,124,1,161,1,1,0,87,0,100,4,4,0,4,0,131, - 3,1,0,110,16,49,0,115,94,48,0,1,0,1,0,1, - 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, - 0,87,0,110,58,4,0,116,11,107,10,114,176,1,0,1, - 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, - 0,110,20,4,0,116,11,107,10,114,168,1,0,1,0,1, - 0,89,0,110,2,48,0,130,0,89,0,110,2,48,0,100, - 4,83,0,41,5,122,162,66,101,115,116,45,101,102,102,111, - 114,116,32,102,117,110,99,116,105,111,110,32,116,111,32,119, - 114,105,116,101,32,100,97,116,97,32,116,111,32,97,32,112, - 97,116,104,32,97,116,111,109,105,99,97,108,108,121,46,10, - 32,32,32,32,66,101,32,112,114,101,112,97,114,101,100,32, - 116,111,32,104,97,110,100,108,101,32,97,32,70,105,108,101, - 69,120,105,115,116,115,69,114,114,111,114,32,105,102,32,99, - 111,110,99,117,114,114,101,110,116,32,119,114,105,116,105,110, - 103,32,111,102,32,116,104,101,10,32,32,32,32,116,101,109, - 112,111,114,97,114,121,32,102,105,108,101,32,105,115,32,97, - 116,116,101,109,112,116,101,100,46,250,5,123,125,46,123,125, - 114,59,0,0,0,90,2,119,98,78,41,13,218,6,102,111, - 114,109,97,116,218,2,105,100,114,2,0,0,0,90,4,111, - 112,101,110,90,6,79,95,69,88,67,76,90,7,79,95,67, - 82,69,65,84,90,8,79,95,87,82,79,78,76,89,218,3, - 95,105,111,218,6,70,105,108,101,73,79,218,5,119,114,105, - 116,101,218,7,114,101,112,108,97,99,101,114,49,0,0,0, - 90,6,117,110,108,105,110,107,41,6,114,43,0,0,0,114, - 25,0,0,0,114,51,0,0,0,90,8,112,97,116,104,95, - 116,109,112,90,2,102,100,218,4,102,105,108,101,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,119, - 114,105,116,101,95,97,116,111,109,105,99,120,0,0,0,115, - 30,0,0,0,0,5,16,1,6,1,16,0,6,255,4,2, - 2,3,14,1,40,1,16,1,14,1,2,1,14,1,14,1, - 6,1,114,68,0,0,0,105,94,13,0,0,114,27,0,0, - 0,114,16,0,0,0,115,2,0,0,0,13,10,90,11,95, - 95,112,121,99,97,99,104,101,95,95,122,4,111,112,116,45, - 122,3,46,112,121,122,4,46,112,121,99,78,41,1,218,12, - 111,112,116,105,109,105,122,97,116,105,111,110,99,2,0,0, - 0,0,0,0,0,1,0,0,0,12,0,0,0,5,0,0, - 0,67,0,0,0,115,88,1,0,0,124,1,100,1,107,9, - 114,52,116,0,160,1,100,2,116,2,161,2,1,0,124,2, - 100,1,107,9,114,40,100,3,125,3,116,3,124,3,131,1, - 130,1,124,1,114,48,100,4,110,2,100,5,125,2,116,4, - 160,5,124,0,161,1,125,0,116,6,124,0,131,1,92,2, - 125,4,125,5,124,5,160,7,100,6,161,1,92,3,125,6, - 125,7,125,8,116,8,106,9,106,10,125,9,124,9,100,1, - 107,8,114,114,116,11,100,7,131,1,130,1,100,4,160,12, - 124,6,114,126,124,6,110,2,124,8,124,7,124,9,103,3, - 161,1,125,10,124,2,100,1,107,8,114,172,116,8,106,13, - 106,14,100,8,107,2,114,164,100,4,125,2,110,8,116,8, - 106,13,106,14,125,2,116,15,124,2,131,1,125,2,124,2, - 100,4,107,3,114,224,124,2,160,16,161,0,115,210,116,17, - 100,9,160,18,124,2,161,1,131,1,130,1,100,10,160,18, - 124,10,116,19,124,2,161,3,125,10,124,10,116,20,100,8, - 25,0,23,0,125,11,116,8,106,21,100,1,107,9,144,1, - 114,76,116,22,124,4,131,1,144,1,115,16,116,23,116,4, - 160,24,161,0,124,4,131,2,125,4,124,4,100,5,25,0, - 100,11,107,2,144,1,114,56,124,4,100,8,25,0,116,25, - 107,7,144,1,114,56,124,4,100,12,100,1,133,2,25,0, - 125,4,116,23,116,8,106,21,124,4,160,26,116,25,161,1, - 124,11,131,3,83,0,116,23,124,4,116,27,124,11,131,3, - 83,0,41,13,97,254,2,0,0,71,105,118,101,110,32,116, - 104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,121, - 32,102,105,108,101,44,32,114,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,105,116,115,32,46,112, - 121,99,32,102,105,108,101,46,10,10,32,32,32,32,84,104, - 101,32,46,112,121,32,102,105,108,101,32,100,111,101,115,32, - 110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115, - 116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114, - 101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32, - 116,111,32,116,104,101,10,32,32,32,32,46,112,121,99,32, - 102,105,108,101,32,99,97,108,99,117,108,97,116,101,100,32, - 97,115,32,105,102,32,116,104,101,32,46,112,121,32,102,105, - 108,101,32,119,101,114,101,32,105,109,112,111,114,116,101,100, - 46,10,10,32,32,32,32,84,104,101,32,39,111,112,116,105, - 109,105,122,97,116,105,111,110,39,32,112,97,114,97,109,101, - 116,101,114,32,99,111,110,116,114,111,108,115,32,116,104,101, - 32,112,114,101,115,117,109,101,100,32,111,112,116,105,109,105, - 122,97,116,105,111,110,32,108,101,118,101,108,32,111,102,10, - 32,32,32,32,116,104,101,32,98,121,116,101,99,111,100,101, - 32,102,105,108,101,46,32,73,102,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,105,115,32,110,111,116,32, - 78,111,110,101,44,32,116,104,101,32,115,116,114,105,110,103, - 32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10, - 32,32,32,32,111,102,32,116,104,101,32,97,114,103,117,109, - 101,110,116,32,105,115,32,116,97,107,101,110,32,97,110,100, - 32,118,101,114,105,102,105,101,100,32,116,111,32,98,101,32, - 97,108,112,104,97,110,117,109,101,114,105,99,32,40,101,108, - 115,101,32,86,97,108,117,101,69,114,114,111,114,10,32,32, - 32,32,105,115,32,114,97,105,115,101,100,41,46,10,10,32, - 32,32,32,84,104,101,32,100,101,98,117,103,95,111,118,101, - 114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,73, - 102,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 32,105,115,32,110,111,116,32,78,111,110,101,44,10,32,32, - 32,32,97,32,84,114,117,101,32,118,97,108,117,101,32,105, - 115,32,116,104,101,32,115,97,109,101,32,97,115,32,115,101, - 116,116,105,110,103,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,116,111,32,116,104,101,32,101,109,112,116, - 121,32,115,116,114,105,110,103,10,32,32,32,32,119,104,105, - 108,101,32,97,32,70,97,108,115,101,32,118,97,108,117,101, - 32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116, - 111,32,115,101,116,116,105,110,103,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,116,111,32,39,49,39,46, - 10,10,32,32,32,32,73,102,32,115,121,115,46,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,46,99,97,99,104, - 101,95,116,97,103,32,105,115,32,78,111,110,101,32,116,104, - 101,110,32,78,111,116,73,109,112,108,101,109,101,110,116,101, - 100,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 46,10,10,32,32,32,32,78,122,70,116,104,101,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,59,32,117,115,101,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,105,110,115,116,101,97,100, - 122,50,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 32,111,114,32,111,112,116,105,109,105,122,97,116,105,111,110, - 32,109,117,115,116,32,98,101,32,115,101,116,32,116,111,32, - 78,111,110,101,114,39,0,0,0,114,38,0,0,0,218,1, - 46,250,36,115,121,115,46,105,109,112,108,101,109,101,110,116, + 8,0,0,0,67,0,0,0,115,48,0,0,0,122,12,116, + 0,124,0,131,1,125,2,87,0,110,20,4,0,116,1,121, + 32,1,0,1,0,1,0,89,0,100,1,83,0,48,0,124, + 2,106,2,100,2,64,0,124,1,107,2,83,0,41,3,122, + 49,84,101,115,116,32,119,104,101,116,104,101,114,32,116,104, + 101,32,112,97,116,104,32,105,115,32,116,104,101,32,115,112, + 101,99,105,102,105,101,100,32,109,111,100,101,32,116,121,112, + 101,46,70,105,0,240,0,0,41,3,114,48,0,0,0,218, + 7,79,83,69,114,114,111,114,218,7,115,116,95,109,111,100, + 101,41,3,114,43,0,0,0,218,4,109,111,100,101,90,9, + 115,116,97,116,95,105,110,102,111,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,18,95,112,97,116,104,95, + 105,115,95,109,111,100,101,95,116,121,112,101,90,0,0,0, + 115,10,0,0,0,0,2,2,1,12,1,12,1,8,1,114, + 52,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,10,0, + 0,0,116,0,124,0,100,1,131,2,83,0,41,2,122,31, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,105,115,102,105,108,101,46,105, + 0,128,0,0,41,1,114,52,0,0,0,114,47,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 12,95,112,97,116,104,95,105,115,102,105,108,101,99,0,0, + 0,115,2,0,0,0,0,2,114,53,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,22,0,0,0,124,0,115,12,116, + 0,160,1,161,0,125,0,116,2,124,0,100,1,131,2,83, + 0,41,2,122,30,82,101,112,108,97,99,101,109,101,110,116, + 32,102,111,114,32,111,115,46,112,97,116,104,46,105,115,100, + 105,114,46,105,0,64,0,0,41,3,114,2,0,0,0,218, + 6,103,101,116,99,119,100,114,52,0,0,0,114,47,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,11,95,112,97,116,104,95,105,115,100,105,114,104,0,0, + 0,115,6,0,0,0,0,2,4,1,8,1,114,55,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,26,0,0,0,124, + 0,160,0,116,1,161,1,112,24,124,0,100,1,100,2,133, + 2,25,0,116,2,118,0,83,0,41,3,122,142,82,101,112, + 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, + 112,97,116,104,46,105,115,97,98,115,46,10,10,32,32,32, + 32,67,111,110,115,105,100,101,114,115,32,97,32,87,105,110, + 100,111,119,115,32,100,114,105,118,101,45,114,101,108,97,116, + 105,118,101,32,112,97,116,104,32,40,110,111,32,100,114,105, + 118,101,44,32,98,117,116,32,115,116,97,114,116,115,32,119, + 105,116,104,32,115,108,97,115,104,41,32,116,111,10,32,32, + 32,32,115,116,105,108,108,32,98,101,32,34,97,98,115,111, + 108,117,116,101,34,46,10,32,32,32,32,114,38,0,0,0, + 233,3,0,0,0,41,3,114,10,0,0,0,114,30,0,0, + 0,218,20,95,112,97,116,104,115,101,112,115,95,119,105,116, + 104,95,99,111,108,111,110,114,47,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, + 116,104,95,105,115,97,98,115,111,0,0,0,115,2,0,0, + 0,0,6,114,58,0,0,0,233,182,1,0,0,99,3,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,11,0, + 0,0,67,0,0,0,115,178,0,0,0,100,1,160,0,124, + 0,116,1,124,0,131,1,161,2,125,3,116,2,160,3,124, + 3,116,2,106,4,116,2,106,5,66,0,116,2,106,6,66, + 0,124,2,100,2,64,0,161,3,125,4,122,70,116,7,160, + 8,124,4,100,3,161,2,143,26,125,5,124,5,160,9,124, + 1,161,1,1,0,87,0,100,4,4,0,4,0,131,3,1, + 0,110,16,49,0,115,94,48,0,1,0,1,0,1,0,89, + 0,1,0,116,2,160,10,124,3,124,0,161,2,1,0,87, + 0,110,54,4,0,116,11,121,172,1,0,1,0,1,0,122, + 14,116,2,160,12,124,3,161,1,1,0,87,0,110,18,4, + 0,116,11,121,164,1,0,1,0,1,0,89,0,110,2,48, + 0,130,0,89,0,110,2,48,0,100,4,83,0,41,5,122, + 162,66,101,115,116,45,101,102,102,111,114,116,32,102,117,110, + 99,116,105,111,110,32,116,111,32,119,114,105,116,101,32,100, + 97,116,97,32,116,111,32,97,32,112,97,116,104,32,97,116, + 111,109,105,99,97,108,108,121,46,10,32,32,32,32,66,101, + 32,112,114,101,112,97,114,101,100,32,116,111,32,104,97,110, + 100,108,101,32,97,32,70,105,108,101,69,120,105,115,116,115, + 69,114,114,111,114,32,105,102,32,99,111,110,99,117,114,114, + 101,110,116,32,119,114,105,116,105,110,103,32,111,102,32,116, + 104,101,10,32,32,32,32,116,101,109,112,111,114,97,114,121, + 32,102,105,108,101,32,105,115,32,97,116,116,101,109,112,116, + 101,100,46,250,5,123,125,46,123,125,114,59,0,0,0,90, + 2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,2, + 105,100,114,2,0,0,0,90,4,111,112,101,110,90,6,79, + 95,69,88,67,76,90,7,79,95,67,82,69,65,84,90,8, + 79,95,87,82,79,78,76,89,218,3,95,105,111,218,6,70, + 105,108,101,73,79,218,5,119,114,105,116,101,218,7,114,101, + 112,108,97,99,101,114,49,0,0,0,90,6,117,110,108,105, + 110,107,41,6,114,43,0,0,0,114,25,0,0,0,114,51, + 0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,102, + 100,218,4,102,105,108,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,13,95,119,114,105,116,101,95,97, + 116,111,109,105,99,120,0,0,0,115,30,0,0,0,0,5, + 16,1,6,1,16,0,6,255,4,2,2,3,14,1,40,1, + 16,1,12,1,2,1,14,1,12,1,6,1,114,68,0,0, + 0,105,95,13,0,0,114,27,0,0,0,114,16,0,0,0, + 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, + 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, + 4,46,112,121,99,78,41,1,218,12,111,112,116,105,109,105, + 122,97,116,105,111,110,99,2,0,0,0,0,0,0,0,1, + 0,0,0,12,0,0,0,5,0,0,0,67,0,0,0,115, + 88,1,0,0,124,1,100,1,117,1,114,52,116,0,160,1, + 100,2,116,2,161,2,1,0,124,2,100,1,117,1,114,40, + 100,3,125,3,116,3,124,3,131,1,130,1,124,1,114,48, + 100,4,110,2,100,5,125,2,116,4,160,5,124,0,161,1, + 125,0,116,6,124,0,131,1,92,2,125,4,125,5,124,5, + 160,7,100,6,161,1,92,3,125,6,125,7,125,8,116,8, + 106,9,106,10,125,9,124,9,100,1,117,0,114,114,116,11, + 100,7,131,1,130,1,100,4,160,12,124,6,114,126,124,6, + 110,2,124,8,124,7,124,9,103,3,161,1,125,10,124,2, + 100,1,117,0,114,172,116,8,106,13,106,14,100,8,107,2, + 114,164,100,4,125,2,110,8,116,8,106,13,106,14,125,2, + 116,15,124,2,131,1,125,2,124,2,100,4,107,3,114,224, + 124,2,160,16,161,0,115,210,116,17,100,9,160,18,124,2, + 161,1,131,1,130,1,100,10,160,18,124,10,116,19,124,2, + 161,3,125,10,124,10,116,20,100,8,25,0,23,0,125,11, + 116,8,106,21,100,1,117,1,144,1,114,76,116,22,124,4, + 131,1,144,1,115,16,116,23,116,4,160,24,161,0,124,4, + 131,2,125,4,124,4,100,5,25,0,100,11,107,2,144,1, + 114,56,124,4,100,8,25,0,116,25,118,1,144,1,114,56, + 124,4,100,12,100,1,133,2,25,0,125,4,116,23,116,8, + 106,21,124,4,160,26,116,25,161,1,124,11,131,3,83,0, + 116,23,124,4,116,27,124,11,131,3,83,0,41,13,97,254, + 2,0,0,71,105,118,101,110,32,116,104,101,32,112,97,116, + 104,32,116,111,32,97,32,46,112,121,32,102,105,108,101,44, + 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, + 32,116,111,32,105,116,115,32,46,112,121,99,32,102,105,108, + 101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,32, + 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, + 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, + 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, + 32,116,104,101,32,112,97,116,104,32,116,111,32,116,104,101, + 10,32,32,32,32,46,112,121,99,32,102,105,108,101,32,99, + 97,108,99,117,108,97,116,101,100,32,97,115,32,105,102,32, + 116,104,101,32,46,112,121,32,102,105,108,101,32,119,101,114, + 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32, + 32,84,104,101,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,112,97,114,97,109,101,116,101,114,32,99,111, + 110,116,114,111,108,115,32,116,104,101,32,112,114,101,115,117, + 109,101,100,32,111,112,116,105,109,105,122,97,116,105,111,110, + 32,108,101,118,101,108,32,111,102,10,32,32,32,32,116,104, + 101,32,98,121,116,101,99,111,100,101,32,102,105,108,101,46, + 32,73,102,32,39,111,112,116,105,109,105,122,97,116,105,111, + 110,39,32,105,115,32,110,111,116,32,78,111,110,101,44,32, + 116,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101, + 115,101,110,116,97,116,105,111,110,10,32,32,32,32,111,102, + 32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115, + 32,116,97,107,101,110,32,97,110,100,32,118,101,114,105,102, + 105,101,100,32,116,111,32,98,101,32,97,108,112,104,97,110, + 117,109,101,114,105,99,32,40,101,108,115,101,32,86,97,108, + 117,101,69,114,114,111,114,10,32,32,32,32,105,115,32,114, + 97,105,115,101,100,41,46,10,10,32,32,32,32,84,104,101, + 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, + 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,73,102,32,100,101,98,117, + 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111, + 116,32,78,111,110,101,44,10,32,32,32,32,97,32,84,114, + 117,101,32,118,97,108,117,101,32,105,115,32,116,104,101,32, + 115,97,109,101,32,97,115,32,115,101,116,116,105,110,103,32, + 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,116, + 111,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105, + 110,103,10,32,32,32,32,119,104,105,108,101,32,97,32,70, + 97,108,115,101,32,118,97,108,117,101,32,105,115,32,101,113, + 117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116, + 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111, + 110,39,32,116,111,32,39,49,39,46,10,10,32,32,32,32, + 73,102,32,115,121,115,46,105,109,112,108,101,109,101,110,116, 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32, - 105,115,32,78,111,110,101,233,0,0,0,0,122,24,123,33, - 114,125,32,105,115,32,110,111,116,32,97,108,112,104,97,110, - 117,109,101,114,105,99,122,7,123,125,46,123,125,123,125,250, - 1,58,114,27,0,0,0,41,28,218,9,95,119,97,114,110, - 105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,114, - 101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,9, - 84,121,112,101,69,114,114,111,114,114,2,0,0,0,218,6, - 102,115,112,97,116,104,114,46,0,0,0,114,40,0,0,0, - 114,8,0,0,0,218,14,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,218,9,99,97,99,104,101,95,116,97,103, - 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, - 69,114,114,111,114,114,35,0,0,0,218,5,102,108,97,103, - 115,218,8,111,112,116,105,109,105,122,101,218,3,115,116,114, - 218,7,105,115,97,108,110,117,109,218,10,86,97,108,117,101, - 69,114,114,111,114,114,61,0,0,0,218,4,95,79,80,84, - 218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,73, - 88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,101, - 102,105,120,114,58,0,0,0,114,37,0,0,0,114,54,0, - 0,0,114,30,0,0,0,218,6,108,115,116,114,105,112,218, - 8,95,80,89,67,65,67,72,69,41,12,114,43,0,0,0, - 90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 114,69,0,0,0,218,7,109,101,115,115,97,103,101,218,4, - 104,101,97,100,114,45,0,0,0,90,4,98,97,115,101,218, - 3,115,101,112,218,4,114,101,115,116,90,3,116,97,103,90, - 15,97,108,109,111,115,116,95,102,105,108,101,110,97,109,101, - 218,8,102,105,108,101,110,97,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,17,99,97,99,104,101, - 95,102,114,111,109,95,115,111,117,114,99,101,41,1,0,0, - 115,72,0,0,0,0,18,8,1,6,1,2,255,4,2,8, - 1,4,1,8,1,12,1,10,1,12,1,16,1,8,1,8, - 1,8,1,24,1,8,1,12,1,6,2,8,1,8,1,8, - 1,8,1,14,1,14,1,12,1,12,9,10,1,14,5,28, - 1,12,4,2,1,4,1,8,1,2,253,4,5,114,97,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,10, - 0,0,0,5,0,0,0,67,0,0,0,115,46,1,0,0, - 116,0,106,1,106,2,100,1,107,8,114,20,116,3,100,2, - 131,1,130,1,116,4,160,5,124,0,161,1,125,0,116,6, - 124,0,131,1,92,2,125,1,125,2,100,3,125,3,116,0, - 106,7,100,1,107,9,114,102,116,0,106,7,160,8,116,9, - 161,1,125,4,124,1,160,10,124,4,116,11,23,0,161,1, - 114,102,124,1,116,12,124,4,131,1,100,1,133,2,25,0, - 125,1,100,4,125,3,124,3,115,144,116,6,124,1,131,1, - 92,2,125,1,125,5,124,5,116,13,107,3,114,144,116,14, - 116,13,155,0,100,5,124,0,155,2,157,3,131,1,130,1, - 124,2,160,15,100,6,161,1,125,6,124,6,100,7,107,7, - 114,178,116,14,100,8,124,2,155,2,157,2,131,1,130,1, - 110,92,124,6,100,9,107,2,144,1,114,14,124,2,160,16, - 100,6,100,10,161,2,100,11,25,0,125,7,124,7,160,10, - 116,17,161,1,115,228,116,14,100,12,116,17,155,2,157,2, - 131,1,130,1,124,7,116,12,116,17,131,1,100,1,133,2, - 25,0,125,8,124,8,160,18,161,0,144,1,115,14,116,14, - 100,13,124,7,155,2,100,14,157,3,131,1,130,1,124,2, - 160,19,100,6,161,1,100,15,25,0,125,9,116,20,124,1, - 124,9,116,21,100,15,25,0,23,0,131,2,83,0,41,16, - 97,110,1,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,99,46,32,102, - 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32, - 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,32, - 102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,46, - 112,121,99,32,102,105,108,101,32,100,111,101,115,32,110,111, - 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59, - 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116, - 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111, - 10,32,32,32,32,116,104,101,32,46,112,121,32,102,105,108, - 101,32,99,97,108,99,117,108,97,116,101,100,32,116,111,32, - 99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104, - 101,32,46,112,121,99,32,102,105,108,101,46,32,32,73,102, - 32,112,97,116,104,32,100,111,101,115,10,32,32,32,32,110, - 111,116,32,99,111,110,102,111,114,109,32,116,111,32,80,69, - 80,32,51,49,52,55,47,52,56,56,32,102,111,114,109,97, - 116,44,32,86,97,108,117,101,69,114,114,111,114,32,119,105, - 108,108,32,98,101,32,114,97,105,115,101,100,46,32,73,102, - 10,32,32,32,32,115,121,115,46,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,46,99,97,99,104,101,95,116,97, - 103,32,105,115,32,78,111,110,101,32,116,104,101,110,32,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, - 111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,32, - 32,32,32,78,114,71,0,0,0,70,84,122,31,32,110,111, - 116,32,98,111,116,116,111,109,45,108,101,118,101,108,32,100, - 105,114,101,99,116,111,114,121,32,105,110,32,114,70,0,0, - 0,62,2,0,0,0,114,27,0,0,0,114,56,0,0,0, - 122,29,101,120,112,101,99,116,101,100,32,111,110,108,121,32, - 50,32,111,114,32,51,32,100,111,116,115,32,105,110,32,114, - 56,0,0,0,114,27,0,0,0,233,254,255,255,255,122,53, - 111,112,116,105,109,105,122,97,116,105,111,110,32,112,111,114, - 116,105,111,110,32,111,102,32,102,105,108,101,110,97,109,101, - 32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,32, - 119,105,116,104,32,122,19,111,112,116,105,109,105,122,97,116, - 105,111,110,32,108,101,118,101,108,32,122,29,32,105,115,32, - 110,111,116,32,97,110,32,97,108,112,104,97,110,117,109,101, - 114,105,99,32,118,97,108,117,101,114,72,0,0,0,41,22, - 114,8,0,0,0,114,79,0,0,0,114,80,0,0,0,114, - 81,0,0,0,114,2,0,0,0,114,78,0,0,0,114,46, - 0,0,0,114,89,0,0,0,114,29,0,0,0,114,30,0, - 0,0,114,10,0,0,0,114,34,0,0,0,114,22,0,0, - 0,114,91,0,0,0,114,86,0,0,0,218,5,99,111,117, - 110,116,114,42,0,0,0,114,87,0,0,0,114,85,0,0, - 0,218,9,112,97,114,116,105,116,105,111,110,114,37,0,0, - 0,218,15,83,79,85,82,67,69,95,83,85,70,70,73,88, - 69,83,41,10,114,43,0,0,0,114,93,0,0,0,90,16, - 112,121,99,97,99,104,101,95,102,105,108,101,110,97,109,101, - 90,23,102,111,117,110,100,95,105,110,95,112,121,99,97,99, - 104,101,95,112,114,101,102,105,120,90,13,115,116,114,105,112, - 112,101,100,95,112,97,116,104,90,7,112,121,99,97,99,104, - 101,90,9,100,111,116,95,99,111,117,110,116,114,69,0,0, - 0,90,9,111,112,116,95,108,101,118,101,108,90,13,98,97, - 115,101,95,102,105,108,101,110,97,109,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,115,111,117,114, - 99,101,95,102,114,111,109,95,99,97,99,104,101,112,1,0, - 0,115,52,0,0,0,0,9,12,1,8,1,10,1,12,1, - 4,1,10,1,12,1,14,1,16,1,4,1,4,1,12,1, - 8,1,18,2,10,1,8,1,16,1,10,1,16,1,10,1, - 14,2,16,1,10,1,16,2,14,1,114,102,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 9,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, - 0,131,1,100,1,107,2,114,16,100,2,83,0,124,0,160, - 1,100,3,161,1,92,3,125,1,125,2,125,3,124,1,114, - 56,124,3,160,2,161,0,100,4,100,5,133,2,25,0,100, - 6,107,3,114,60,124,0,83,0,122,12,116,3,124,0,131, - 1,125,4,87,0,110,36,4,0,116,4,116,5,102,2,107, - 10,114,108,1,0,1,0,1,0,124,0,100,2,100,5,133, - 2,25,0,125,4,89,0,110,2,48,0,116,6,124,4,131, - 1,114,122,124,4,83,0,124,0,83,0,41,7,122,188,67, - 111,110,118,101,114,116,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,32,112,97,116,104,32,116,111,32,97, - 32,115,111,117,114,99,101,32,112,97,116,104,32,40,105,102, - 32,112,111,115,115,105,98,108,101,41,46,10,10,32,32,32, - 32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,101, - 120,105,115,116,115,32,112,117,114,101,108,121,32,102,111,114, - 32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97, - 116,105,98,105,108,105,116,121,32,102,111,114,10,32,32,32, - 32,80,121,73,109,112,111,114,116,95,69,120,101,99,67,111, - 100,101,77,111,100,117,108,101,87,105,116,104,70,105,108,101, - 110,97,109,101,115,40,41,32,105,110,32,116,104,101,32,67, - 32,65,80,73,46,10,10,32,32,32,32,114,72,0,0,0, - 78,114,70,0,0,0,233,253,255,255,255,233,255,255,255,255, - 90,2,112,121,41,7,114,22,0,0,0,114,40,0,0,0, - 218,5,108,111,119,101,114,114,102,0,0,0,114,81,0,0, - 0,114,86,0,0,0,114,53,0,0,0,41,5,218,13,98, - 121,116,101,99,111,100,101,95,112,97,116,104,114,95,0,0, - 0,114,44,0,0,0,90,9,101,120,116,101,110,115,105,111, - 110,218,11,115,111,117,114,99,101,95,112,97,116,104,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, - 103,101,116,95,115,111,117,114,99,101,102,105,108,101,152,1, - 0,0,115,20,0,0,0,0,7,12,1,4,1,16,1,24, - 1,4,1,2,1,12,1,18,1,18,1,114,108,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,8,0,0,0,67,0,0,0,115,74,0,0,0,124,0, - 160,0,116,1,116,2,131,1,161,1,114,48,122,10,116,3, - 124,0,131,1,87,0,83,0,4,0,116,4,107,10,114,44, - 1,0,1,0,1,0,89,0,113,70,48,0,110,22,124,0, - 160,0,116,1,116,5,131,1,161,1,114,66,124,0,83,0, - 100,0,83,0,100,0,83,0,169,1,78,41,6,218,8,101, - 110,100,115,119,105,116,104,218,5,116,117,112,108,101,114,101, - 0,0,0,114,97,0,0,0,114,81,0,0,0,114,88,0, - 0,0,41,1,114,96,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,11,95,103,101,116,95,99, - 97,99,104,101,100,171,1,0,0,115,16,0,0,0,0,1, - 14,1,2,1,10,1,14,1,8,1,14,1,4,2,114,112, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,52,0,0, - 0,122,14,116,0,124,0,131,1,106,1,125,1,87,0,110, - 24,4,0,116,2,107,10,114,38,1,0,1,0,1,0,100, - 1,125,1,89,0,110,2,48,0,124,1,100,2,79,0,125, - 1,124,1,83,0,41,3,122,51,67,97,108,99,117,108,97, - 116,101,32,116,104,101,32,109,111,100,101,32,112,101,114,109, - 105,115,115,105,111,110,115,32,102,111,114,32,97,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,46,114,59,0,0, - 0,233,128,0,0,0,41,3,114,48,0,0,0,114,50,0, - 0,0,114,49,0,0,0,41,2,114,43,0,0,0,114,51, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,10,95,99,97,108,99,95,109,111,100,101,183,1, - 0,0,115,12,0,0,0,0,2,2,1,14,1,14,1,10, - 3,8,1,114,114,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,3,0,0, - 0,115,68,0,0,0,100,6,135,0,102,1,100,2,100,3, - 132,9,125,1,122,10,116,0,106,1,125,2,87,0,110,28, - 4,0,116,2,107,10,114,52,1,0,1,0,1,0,100,4, - 100,5,132,0,125,2,89,0,110,2,48,0,124,2,124,1, - 136,0,131,2,1,0,124,1,83,0,41,7,122,252,68,101, - 99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,102, - 121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108, - 101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,101, - 100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,110, - 101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,114, - 32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,32, - 32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,117, - 109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,116, - 32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,104, - 105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,97, - 114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,99, - 111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,46, - 32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,115, - 111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,109, + 105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,116, + 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32, + 32,78,122,70,116,104,101,32,100,101,98,117,103,95,111,118, + 101,114,114,105,100,101,32,112,97,114,97,109,101,116,101,114, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32, + 117,115,101,32,39,111,112,116,105,109,105,122,97,116,105,111, + 110,39,32,105,110,115,116,101,97,100,122,50,100,101,98,117, + 103,95,111,118,101,114,114,105,100,101,32,111,114,32,111,112, + 116,105,109,105,122,97,116,105,111,110,32,109,117,115,116,32, + 98,101,32,115,101,116,32,116,111,32,78,111,110,101,114,39, + 0,0,0,114,38,0,0,0,218,1,46,250,36,115,121,115, + 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46, + 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110, + 101,233,0,0,0,0,122,24,123,33,114,125,32,105,115,32, + 110,111,116,32,97,108,112,104,97,110,117,109,101,114,105,99, + 122,7,123,125,46,123,125,123,125,250,1,58,114,27,0,0, + 0,41,28,218,9,95,119,97,114,110,105,110,103,115,218,4, + 119,97,114,110,218,18,68,101,112,114,101,99,97,116,105,111, + 110,87,97,114,110,105,110,103,218,9,84,121,112,101,69,114, + 114,111,114,114,2,0,0,0,218,6,102,115,112,97,116,104, + 114,46,0,0,0,114,40,0,0,0,114,8,0,0,0,218, + 14,105,109,112,108,101,109,101,110,116,97,116,105,111,110,218, + 9,99,97,99,104,101,95,116,97,103,218,19,78,111,116,73, + 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,114, + 35,0,0,0,218,5,102,108,97,103,115,218,8,111,112,116, + 105,109,105,122,101,218,3,115,116,114,218,7,105,115,97,108, + 110,117,109,218,10,86,97,108,117,101,69,114,114,111,114,114, + 61,0,0,0,218,4,95,79,80,84,218,17,66,89,84,69, + 67,79,68,69,95,83,85,70,70,73,88,69,83,218,14,112, + 121,99,97,99,104,101,95,112,114,101,102,105,120,114,58,0, + 0,0,114,37,0,0,0,114,54,0,0,0,114,30,0,0, + 0,218,6,108,115,116,114,105,112,218,8,95,80,89,67,65, + 67,72,69,41,12,114,43,0,0,0,90,14,100,101,98,117, + 103,95,111,118,101,114,114,105,100,101,114,69,0,0,0,218, + 7,109,101,115,115,97,103,101,218,4,104,101,97,100,114,45, + 0,0,0,90,4,98,97,115,101,218,3,115,101,112,218,4, + 114,101,115,116,90,3,116,97,103,90,15,97,108,109,111,115, + 116,95,102,105,108,101,110,97,109,101,218,8,102,105,108,101, + 110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,17,99,97,99,104,101,95,102,114,111,109,95, + 115,111,117,114,99,101,42,1,0,0,115,72,0,0,0,0, + 18,8,1,6,1,2,255,4,2,8,1,4,1,8,1,12, + 1,10,1,12,1,16,1,8,1,8,1,8,1,24,1,8, + 1,12,1,6,2,8,1,8,1,8,1,8,1,14,1,14, + 1,12,1,12,9,10,1,14,5,28,1,12,4,2,1,4, + 1,8,1,2,253,4,5,114,97,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,10,0,0,0,5,0,0, + 0,67,0,0,0,115,46,1,0,0,116,0,106,1,106,2, + 100,1,117,0,114,20,116,3,100,2,131,1,130,1,116,4, + 160,5,124,0,161,1,125,0,116,6,124,0,131,1,92,2, + 125,1,125,2,100,3,125,3,116,0,106,7,100,1,117,1, + 114,102,116,0,106,7,160,8,116,9,161,1,125,4,124,1, + 160,10,124,4,116,11,23,0,161,1,114,102,124,1,116,12, + 124,4,131,1,100,1,133,2,25,0,125,1,100,4,125,3, + 124,3,115,144,116,6,124,1,131,1,92,2,125,1,125,5, + 124,5,116,13,107,3,114,144,116,14,116,13,155,0,100,5, + 124,0,155,2,157,3,131,1,130,1,124,2,160,15,100,6, + 161,1,125,6,124,6,100,7,118,1,114,178,116,14,100,8, + 124,2,155,2,157,2,131,1,130,1,110,92,124,6,100,9, + 107,2,144,1,114,14,124,2,160,16,100,6,100,10,161,2, + 100,11,25,0,125,7,124,7,160,10,116,17,161,1,115,228, + 116,14,100,12,116,17,155,2,157,2,131,1,130,1,124,7, + 116,12,116,17,131,1,100,1,133,2,25,0,125,8,124,8, + 160,18,161,0,144,1,115,14,116,14,100,13,124,7,155,2, + 100,14,157,3,131,1,130,1,124,2,160,19,100,6,161,1, + 100,15,25,0,125,9,116,20,124,1,124,9,116,21,100,15, + 25,0,23,0,131,2,83,0,41,16,97,110,1,0,0,71, + 105,118,101,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,97,32,46,112,121,99,46,32,102,105,108,101,44,32,114, + 101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,116, + 111,32,105,116,115,32,46,112,121,32,102,105,108,101,46,10, + 10,32,32,32,32,84,104,101,32,46,112,121,99,32,102,105, + 108,101,32,100,111,101,115,32,110,111,116,32,110,101,101,100, + 32,116,111,32,101,120,105,115,116,59,32,116,104,105,115,32, + 115,105,109,112,108,121,32,114,101,116,117,114,110,115,32,116, + 104,101,32,112,97,116,104,32,116,111,10,32,32,32,32,116, + 104,101,32,46,112,121,32,102,105,108,101,32,99,97,108,99, + 117,108,97,116,101,100,32,116,111,32,99,111,114,114,101,115, + 112,111,110,100,32,116,111,32,116,104,101,32,46,112,121,99, + 32,102,105,108,101,46,32,32,73,102,32,112,97,116,104,32, + 100,111,101,115,10,32,32,32,32,110,111,116,32,99,111,110, + 102,111,114,109,32,116,111,32,80,69,80,32,51,49,52,55, + 47,52,56,56,32,102,111,114,109,97,116,44,32,86,97,108, + 117,101,69,114,114,111,114,32,119,105,108,108,32,98,101,32, + 114,97,105,115,101,100,46,32,73,102,10,32,32,32,32,115, + 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78, + 111,110,101,32,116,104,101,110,32,78,111,116,73,109,112,108, + 101,109,101,110,116,101,100,69,114,114,111,114,32,105,115,32, + 114,97,105,115,101,100,46,10,10,32,32,32,32,78,114,71, + 0,0,0,70,84,122,31,32,110,111,116,32,98,111,116,116, + 111,109,45,108,101,118,101,108,32,100,105,114,101,99,116,111, + 114,121,32,105,110,32,114,70,0,0,0,62,2,0,0,0, + 114,27,0,0,0,114,56,0,0,0,122,29,101,120,112,101, + 99,116,101,100,32,111,110,108,121,32,50,32,111,114,32,51, + 32,100,111,116,115,32,105,110,32,114,56,0,0,0,114,27, + 0,0,0,233,254,255,255,255,122,53,111,112,116,105,109,105, + 122,97,116,105,111,110,32,112,111,114,116,105,111,110,32,111, + 102,32,102,105,108,101,110,97,109,101,32,100,111,101,115,32, + 110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,122, + 19,111,112,116,105,109,105,122,97,116,105,111,110,32,108,101, + 118,101,108,32,122,29,32,105,115,32,110,111,116,32,97,110, + 32,97,108,112,104,97,110,117,109,101,114,105,99,32,118,97, + 108,117,101,114,72,0,0,0,41,22,114,8,0,0,0,114, + 79,0,0,0,114,80,0,0,0,114,81,0,0,0,114,2, + 0,0,0,114,78,0,0,0,114,46,0,0,0,114,89,0, + 0,0,114,29,0,0,0,114,30,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,22,0,0,0,114,91,0,0,0, + 114,86,0,0,0,218,5,99,111,117,110,116,114,42,0,0, + 0,114,87,0,0,0,114,85,0,0,0,218,9,112,97,114, + 116,105,116,105,111,110,114,37,0,0,0,218,15,83,79,85, + 82,67,69,95,83,85,70,70,73,88,69,83,41,10,114,43, + 0,0,0,114,93,0,0,0,90,16,112,121,99,97,99,104, + 101,95,102,105,108,101,110,97,109,101,90,23,102,111,117,110, + 100,95,105,110,95,112,121,99,97,99,104,101,95,112,114,101, + 102,105,120,90,13,115,116,114,105,112,112,101,100,95,112,97, + 116,104,90,7,112,121,99,97,99,104,101,90,9,100,111,116, + 95,99,111,117,110,116,114,69,0,0,0,90,9,111,112,116, + 95,108,101,118,101,108,90,13,98,97,115,101,95,102,105,108, + 101,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,17,115,111,117,114,99,101,95,102,114,111, + 109,95,99,97,99,104,101,113,1,0,0,115,52,0,0,0, + 0,9,12,1,8,1,10,1,12,1,4,1,10,1,12,1, + 14,1,16,1,4,1,4,1,12,1,8,1,18,2,10,1, + 8,1,16,1,10,1,16,1,10,1,14,2,16,1,10,1, + 16,2,14,1,114,102,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,9,0,0,0,67,0, + 0,0,115,124,0,0,0,116,0,124,0,131,1,100,1,107, + 2,114,16,100,2,83,0,124,0,160,1,100,3,161,1,92, + 3,125,1,125,2,125,3,124,1,114,56,124,3,160,2,161, + 0,100,4,100,5,133,2,25,0,100,6,107,3,114,60,124, + 0,83,0,122,12,116,3,124,0,131,1,125,4,87,0,110, + 34,4,0,116,4,116,5,102,2,121,106,1,0,1,0,1, + 0,124,0,100,2,100,5,133,2,25,0,125,4,89,0,110, + 2,48,0,116,6,124,4,131,1,114,120,124,4,83,0,124, + 0,83,0,41,7,122,188,67,111,110,118,101,114,116,32,97, + 32,98,121,116,101,99,111,100,101,32,102,105,108,101,32,112, + 97,116,104,32,116,111,32,97,32,115,111,117,114,99,101,32, + 112,97,116,104,32,40,105,102,32,112,111,115,115,105,98,108, + 101,41,46,10,10,32,32,32,32,84,104,105,115,32,102,117, + 110,99,116,105,111,110,32,101,120,105,115,116,115,32,112,117, + 114,101,108,121,32,102,111,114,32,98,97,99,107,119,97,114, + 100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121, + 32,102,111,114,10,32,32,32,32,80,121,73,109,112,111,114, + 116,95,69,120,101,99,67,111,100,101,77,111,100,117,108,101, + 87,105,116,104,70,105,108,101,110,97,109,101,115,40,41,32, + 105,110,32,116,104,101,32,67,32,65,80,73,46,10,10,32, + 32,32,32,114,72,0,0,0,78,114,70,0,0,0,233,253, + 255,255,255,233,255,255,255,255,90,2,112,121,41,7,114,22, + 0,0,0,114,40,0,0,0,218,5,108,111,119,101,114,114, + 102,0,0,0,114,81,0,0,0,114,86,0,0,0,114,53, + 0,0,0,41,5,218,13,98,121,116,101,99,111,100,101,95, + 112,97,116,104,114,95,0,0,0,114,44,0,0,0,90,9, + 101,120,116,101,110,115,105,111,110,218,11,115,111,117,114,99, + 101,95,112,97,116,104,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,15,95,103,101,116,95,115,111,117,114, + 99,101,102,105,108,101,153,1,0,0,115,20,0,0,0,0, + 7,12,1,4,1,16,1,24,1,4,1,2,1,12,1,16, + 1,18,1,114,108,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, + 0,115,72,0,0,0,124,0,160,0,116,1,116,2,131,1, + 161,1,114,46,122,10,116,3,124,0,131,1,87,0,83,0, + 4,0,116,4,121,42,1,0,1,0,1,0,89,0,113,68, + 48,0,110,22,124,0,160,0,116,1,116,5,131,1,161,1, + 114,64,124,0,83,0,100,0,83,0,100,0,83,0,169,1, + 78,41,6,218,8,101,110,100,115,119,105,116,104,218,5,116, + 117,112,108,101,114,101,0,0,0,114,97,0,0,0,114,81, + 0,0,0,114,88,0,0,0,41,1,114,96,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, + 95,103,101,116,95,99,97,99,104,101,100,172,1,0,0,115, + 16,0,0,0,0,1,14,1,2,1,10,1,12,1,8,1, + 14,1,4,2,114,112,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, + 0,0,115,50,0,0,0,122,14,116,0,124,0,131,1,106, + 1,125,1,87,0,110,22,4,0,116,2,121,36,1,0,1, + 0,1,0,100,1,125,1,89,0,110,2,48,0,124,1,100, + 2,79,0,125,1,124,1,83,0,41,3,122,51,67,97,108, + 99,117,108,97,116,101,32,116,104,101,32,109,111,100,101,32, + 112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32, + 97,32,98,121,116,101,99,111,100,101,32,102,105,108,101,46, + 114,59,0,0,0,233,128,0,0,0,41,3,114,48,0,0, + 0,114,50,0,0,0,114,49,0,0,0,41,2,114,43,0, + 0,0,114,51,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,10,95,99,97,108,99,95,109,111, + 100,101,184,1,0,0,115,12,0,0,0,0,2,2,1,14, + 1,12,1,10,3,8,1,114,114,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, + 0,3,0,0,0,115,66,0,0,0,100,6,135,0,102,1, + 100,2,100,3,132,9,125,1,122,10,116,0,106,1,125,2, + 87,0,110,26,4,0,116,2,121,50,1,0,1,0,1,0, + 100,4,100,5,132,0,125,2,89,0,110,2,48,0,124,2, + 124,1,136,0,131,2,1,0,124,1,83,0,41,7,122,252, + 68,101,99,111,114,97,116,111,114,32,116,111,32,118,101,114, + 105,102,121,32,116,104,97,116,32,116,104,101,32,109,111,100, + 117,108,101,32,98,101,105,110,103,32,114,101,113,117,101,115, + 116,101,100,32,109,97,116,99,104,101,115,32,116,104,101,32, + 111,110,101,32,116,104,101,10,32,32,32,32,108,111,97,100, + 101,114,32,99,97,110,32,104,97,110,100,108,101,46,10,10, + 32,32,32,32,84,104,101,32,102,105,114,115,116,32,97,114, + 103,117,109,101,110,116,32,40,115,101,108,102,41,32,109,117, + 115,116,32,100,101,102,105,110,101,32,95,110,97,109,101,32, + 119,104,105,99,104,32,116,104,101,32,115,101,99,111,110,100, + 32,97,114,103,117,109,101,110,116,32,105,115,10,32,32,32, + 32,99,111,109,112,97,114,101,100,32,97,103,97,105,110,115, + 116,46,32,73,102,32,116,104,101,32,99,111,109,112,97,114, + 105,115,111,110,32,102,97,105,108,115,32,116,104,101,110,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,46,10,10,32,32,32,32,78,99,2,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,31,0,0,0,115,66,0,0,0,124,1,100,0,117, + 0,114,16,124,0,106,0,125,1,110,32,124,0,106,0,124, + 1,107,3,114,48,116,1,100,1,124,0,106,0,124,1,102, + 2,22,0,124,1,100,2,141,2,130,1,136,0,124,0,124, + 1,102,2,124,2,158,2,124,3,142,1,83,0,41,3,78, + 122,30,108,111,97,100,101,114,32,102,111,114,32,37,115,32, + 99,97,110,110,111,116,32,104,97,110,100,108,101,32,37,115, + 169,1,218,4,110,97,109,101,41,2,114,116,0,0,0,218, + 11,73,109,112,111,114,116,69,114,114,111,114,41,4,218,4, + 115,101,108,102,114,116,0,0,0,218,4,97,114,103,115,218, + 6,107,119,97,114,103,115,169,1,218,6,109,101,116,104,111, + 100,114,3,0,0,0,114,6,0,0,0,218,19,95,99,104, + 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, + 204,1,0,0,115,18,0,0,0,0,1,8,1,8,1,10, + 1,4,1,8,255,2,1,2,255,6,2,122,40,95,99,104, + 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115, + 62,46,95,99,104,101,99,107,95,110,97,109,101,95,119,114, + 97,112,112,101,114,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,7,0,0,0,83,0,0,0,115,56, + 0,0,0,100,1,68,0,93,32,125,2,116,0,124,1,124, + 2,131,2,114,4,116,1,124,0,124,2,116,2,124,1,124, + 2,131,2,131,3,1,0,113,4,124,0,106,3,160,4,124, + 1,106,3,161,1,1,0,100,0,83,0,41,2,78,41,4, + 218,10,95,95,109,111,100,117,108,101,95,95,218,8,95,95, + 110,97,109,101,95,95,218,12,95,95,113,117,97,108,110,97, + 109,101,95,95,218,7,95,95,100,111,99,95,95,41,5,218, + 7,104,97,115,97,116,116,114,218,7,115,101,116,97,116,116, + 114,218,7,103,101,116,97,116,116,114,218,8,95,95,100,105, + 99,116,95,95,218,6,117,112,100,97,116,101,41,3,90,3, + 110,101,119,90,3,111,108,100,114,66,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,5,95,119, + 114,97,112,215,1,0,0,115,8,0,0,0,0,1,8,1, + 10,1,20,1,122,26,95,99,104,101,99,107,95,110,97,109, + 101,46,60,108,111,99,97,108,115,62,46,95,119,114,97,112, + 41,1,78,41,3,218,10,95,98,111,111,116,115,116,114,97, + 112,114,133,0,0,0,218,9,78,97,109,101,69,114,114,111, + 114,41,3,114,122,0,0,0,114,123,0,0,0,114,133,0, + 0,0,114,3,0,0,0,114,121,0,0,0,114,6,0,0, + 0,218,11,95,99,104,101,99,107,95,110,97,109,101,196,1, + 0,0,115,14,0,0,0,0,8,14,7,2,1,10,1,12, + 2,14,5,10,1,114,136,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, + 0,0,0,115,60,0,0,0,124,0,160,0,124,1,161,1, + 92,2,125,2,125,3,124,2,100,1,117,0,114,56,116,1, + 124,3,131,1,114,56,100,2,125,4,116,2,160,3,124,4, + 160,4,124,3,100,3,25,0,161,1,116,5,161,2,1,0, + 124,2,83,0,41,4,122,155,84,114,121,32,116,111,32,102, + 105,110,100,32,97,32,108,111,97,100,101,114,32,102,111,114, + 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, + 111,100,117,108,101,32,98,121,32,100,101,108,101,103,97,116, + 105,110,103,32,116,111,10,32,32,32,32,115,101,108,102,46, + 102,105,110,100,95,108,111,97,100,101,114,40,41,46,10,10, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,32,105,110, + 32,102,97,118,111,114,32,111,102,32,102,105,110,100,101,114, + 46,102,105,110,100,95,115,112,101,99,40,41,46,10,10,32, + 32,32,32,78,122,44,78,111,116,32,105,109,112,111,114,116, + 105,110,103,32,100,105,114,101,99,116,111,114,121,32,123,125, + 58,32,109,105,115,115,105,110,103,32,95,95,105,110,105,116, + 95,95,114,72,0,0,0,41,6,218,11,102,105,110,100,95, + 108,111,97,100,101,114,114,22,0,0,0,114,74,0,0,0, + 114,75,0,0,0,114,61,0,0,0,218,13,73,109,112,111, + 114,116,87,97,114,110,105,110,103,41,5,114,118,0,0,0, + 218,8,102,117,108,108,110,97,109,101,218,6,108,111,97,100, + 101,114,218,8,112,111,114,116,105,111,110,115,218,3,109,115, + 103,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,17,95,102,105,110,100,95,109,111,100,117,108,101,95,115, + 104,105,109,224,1,0,0,115,10,0,0,0,0,10,14,1, + 16,1,4,1,22,1,114,143,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, + 67,0,0,0,115,158,0,0,0,124,0,100,1,100,2,133, + 2,25,0,125,3,124,3,116,0,107,3,114,60,100,3,124, + 1,155,2,100,4,124,3,155,2,157,4,125,4,116,1,160, + 2,100,5,124,4,161,2,1,0,116,3,124,4,102,1,124, + 2,142,1,130,1,116,4,124,0,131,1,100,6,107,0,114, + 102,100,7,124,1,155,2,157,2,125,4,116,1,160,2,100, + 5,124,4,161,2,1,0,116,5,124,4,131,1,130,1,116, + 6,124,0,100,2,100,8,133,2,25,0,131,1,125,5,124, + 5,100,9,64,0,114,154,100,10,124,5,155,2,100,11,124, + 1,155,2,157,4,125,4,116,3,124,4,102,1,124,2,142, + 1,130,1,124,5,83,0,41,12,97,84,2,0,0,80,101, + 114,102,111,114,109,32,98,97,115,105,99,32,118,97,108,105, + 100,105,116,121,32,99,104,101,99,107,105,110,103,32,111,102, + 32,97,32,112,121,99,32,104,101,97,100,101,114,32,97,110, + 100,32,114,101,116,117,114,110,32,116,104,101,32,102,108,97, + 103,115,32,102,105,101,108,100,44,10,32,32,32,32,119,104, + 105,99,104,32,100,101,116,101,114,109,105,110,101,115,32,104, + 111,119,32,116,104,101,32,112,121,99,32,115,104,111,117,108, + 100,32,98,101,32,102,117,114,116,104,101,114,32,118,97,108, + 105,100,97,116,101,100,32,97,103,97,105,110,115,116,32,116, + 104,101,32,115,111,117,114,99,101,46,10,10,32,32,32,32, + 42,100,97,116,97,42,32,105,115,32,116,104,101,32,99,111, + 110,116,101,110,116,115,32,111,102,32,116,104,101,32,112,121, + 99,32,102,105,108,101,46,32,40,79,110,108,121,32,116,104, + 101,32,102,105,114,115,116,32,49,54,32,98,121,116,101,115, + 32,97,114,101,10,32,32,32,32,114,101,113,117,105,114,101, + 100,44,32,116,104,111,117,103,104,46,41,10,10,32,32,32, + 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, + 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100, + 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114, + 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42, + 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32, + 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115, + 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32, + 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100, + 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32, + 114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32, + 109,97,103,105,99,32,110,117,109,98,101,114,32,105,115,32, + 105,110,99,111,114,114,101,99,116,32,111,114,32,119,104,101, + 110,32,116,104,101,32,102,108,97,103,115,10,32,32,32,32, + 102,105,101,108,100,32,105,115,32,105,110,118,97,108,105,100, + 46,32,69,79,70,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,32,119,104,101,110,32,116,104,101,32,100,97, + 116,97,32,105,115,32,102,111,117,110,100,32,116,111,32,98, + 101,32,116,114,117,110,99,97,116,101,100,46,10,10,32,32, + 32,32,78,114,15,0,0,0,122,20,98,97,100,32,109,97, + 103,105,99,32,110,117,109,98,101,114,32,105,110,32,122,2, + 58,32,250,2,123,125,233,16,0,0,0,122,40,114,101,97, + 99,104,101,100,32,69,79,70,32,119,104,105,108,101,32,114, + 101,97,100,105,110,103,32,112,121,99,32,104,101,97,100,101, + 114,32,111,102,32,233,8,0,0,0,233,252,255,255,255,122, + 14,105,110,118,97,108,105,100,32,102,108,97,103,115,32,122, + 4,32,105,110,32,41,7,218,12,77,65,71,73,67,95,78, + 85,77,66,69,82,114,134,0,0,0,218,16,95,118,101,114, + 98,111,115,101,95,109,101,115,115,97,103,101,114,117,0,0, + 0,114,22,0,0,0,218,8,69,79,70,69,114,114,111,114, + 114,26,0,0,0,41,6,114,25,0,0,0,114,116,0,0, + 0,218,11,101,120,99,95,100,101,116,97,105,108,115,90,5, + 109,97,103,105,99,114,92,0,0,0,114,82,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, + 95,99,108,97,115,115,105,102,121,95,112,121,99,241,1,0, + 0,115,28,0,0,0,0,16,12,1,8,1,16,1,12,1, + 12,1,12,1,10,1,12,1,8,1,16,2,8,1,16,1, + 12,1,114,152,0,0,0,99,5,0,0,0,0,0,0,0, + 0,0,0,0,6,0,0,0,4,0,0,0,67,0,0,0, + 115,112,0,0,0,116,0,124,0,100,1,100,2,133,2,25, + 0,131,1,124,1,100,3,64,0,107,3,114,58,100,4,124, + 3,155,2,157,2,125,5,116,1,160,2,100,5,124,5,161, + 2,1,0,116,3,124,5,102,1,124,4,142,1,130,1,124, + 2,100,6,117,1,114,108,116,0,124,0,100,2,100,7,133, + 2,25,0,131,1,124,2,100,3,64,0,107,3,114,108,116, + 3,100,4,124,3,155,2,157,2,102,1,124,4,142,1,130, + 1,100,6,83,0,41,8,97,7,2,0,0,86,97,108,105, + 100,97,116,101,32,97,32,112,121,99,32,97,103,97,105,110, + 115,116,32,116,104,101,32,115,111,117,114,99,101,32,108,97, + 115,116,45,109,111,100,105,102,105,101,100,32,116,105,109,101, + 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, + 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, + 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, + 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, + 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, + 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, + 42,115,111,117,114,99,101,95,109,116,105,109,101,42,32,105, + 115,32,116,104,101,32,108,97,115,116,32,109,111,100,105,102, + 105,101,100,32,116,105,109,101,115,116,97,109,112,32,111,102, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 46,10,10,32,32,32,32,42,115,111,117,114,99,101,95,115, + 105,122,101,42,32,105,115,32,78,111,110,101,32,111,114,32, + 116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,32,105,110,32,98, + 121,116,101,115,46,10,10,32,32,32,32,42,110,97,109,101, + 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, + 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, + 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, + 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, + 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, + 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, + 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, + 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, - 115,101,100,46,10,10,32,32,32,32,78,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, - 31,0,0,0,115,66,0,0,0,124,1,100,0,107,8,114, - 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, - 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, - 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,102, - 2,124,2,158,2,124,3,142,1,83,0,41,3,78,122,30, - 108,111,97,100,101,114,32,102,111,114,32,37,115,32,99,97, - 110,110,111,116,32,104,97,110,100,108,101,32,37,115,169,1, - 218,4,110,97,109,101,41,2,114,116,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,41,4,218,4,115,101, - 108,102,114,116,0,0,0,218,4,97,114,103,115,218,6,107, - 119,97,114,103,115,169,1,218,6,109,101,116,104,111,100,114, - 3,0,0,0,114,6,0,0,0,218,19,95,99,104,101,99, - 107,95,110,97,109,101,95,119,114,97,112,112,101,114,203,1, - 0,0,115,18,0,0,0,0,1,8,1,8,1,10,1,4, - 1,8,255,2,1,2,255,6,2,122,40,95,99,104,101,99, - 107,95,110,97,109,101,46,60,108,111,99,97,108,115,62,46, - 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, - 112,101,114,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,7,0,0,0,83,0,0,0,115,56,0,0, - 0,100,1,68,0,93,32,125,2,116,0,124,1,124,2,131, - 2,114,4,116,1,124,0,124,2,116,2,124,1,124,2,131, - 2,131,3,1,0,113,4,124,0,106,3,160,4,124,1,106, - 3,161,1,1,0,100,0,83,0,41,2,78,41,4,218,10, - 95,95,109,111,100,117,108,101,95,95,218,8,95,95,110,97, - 109,101,95,95,218,12,95,95,113,117,97,108,110,97,109,101, - 95,95,218,7,95,95,100,111,99,95,95,41,5,218,7,104, - 97,115,97,116,116,114,218,7,115,101,116,97,116,116,114,218, - 7,103,101,116,97,116,116,114,218,8,95,95,100,105,99,116, - 95,95,218,6,117,112,100,97,116,101,41,3,90,3,110,101, - 119,90,3,111,108,100,114,66,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,5,95,119,114,97, - 112,214,1,0,0,115,8,0,0,0,0,1,8,1,10,1, - 20,1,122,26,95,99,104,101,99,107,95,110,97,109,101,46, - 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, - 78,41,3,218,10,95,98,111,111,116,115,116,114,97,112,114, - 133,0,0,0,218,9,78,97,109,101,69,114,114,111,114,41, - 3,114,122,0,0,0,114,123,0,0,0,114,133,0,0,0, - 114,3,0,0,0,114,121,0,0,0,114,6,0,0,0,218, - 11,95,99,104,101,99,107,95,110,97,109,101,195,1,0,0, - 115,14,0,0,0,0,8,14,7,2,1,10,1,14,2,14, - 5,10,1,114,136,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,6,0,0,0,67,0,0, - 0,115,60,0,0,0,124,0,160,0,124,1,161,1,92,2, - 125,2,125,3,124,2,100,1,107,8,114,56,116,1,124,3, - 131,1,114,56,100,2,125,4,116,2,160,3,124,4,160,4, - 124,3,100,3,25,0,161,1,116,5,161,2,1,0,124,2, - 83,0,41,4,122,155,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,32,98,121,32,100,101,108,101,103,97,116,105,110, - 103,32,116,111,10,32,32,32,32,115,101,108,102,46,102,105, - 110,100,95,108,111,97,100,101,114,40,41,46,10,10,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,32,105,110,32,102, - 97,118,111,114,32,111,102,32,102,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,40,41,46,10,10,32,32,32, - 32,78,122,44,78,111,116,32,105,109,112,111,114,116,105,110, - 103,32,100,105,114,101,99,116,111,114,121,32,123,125,58,32, - 109,105,115,115,105,110,103,32,95,95,105,110,105,116,95,95, - 114,72,0,0,0,41,6,218,11,102,105,110,100,95,108,111, - 97,100,101,114,114,22,0,0,0,114,74,0,0,0,114,75, - 0,0,0,114,61,0,0,0,218,13,73,109,112,111,114,116, - 87,97,114,110,105,110,103,41,5,114,118,0,0,0,218,8, - 102,117,108,108,110,97,109,101,218,6,108,111,97,100,101,114, - 218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105, - 109,223,1,0,0,115,10,0,0,0,0,10,14,1,16,1, - 4,1,22,1,114,143,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, - 0,0,115,158,0,0,0,124,0,100,1,100,2,133,2,25, - 0,125,3,124,3,116,0,107,3,114,60,100,3,124,1,155, - 2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,100, - 5,124,4,161,2,1,0,116,3,124,4,102,1,124,2,142, - 1,130,1,116,4,124,0,131,1,100,6,107,0,114,102,100, - 7,124,1,155,2,157,2,125,4,116,1,160,2,100,5,124, - 4,161,2,1,0,116,5,124,4,131,1,130,1,116,6,124, - 0,100,2,100,8,133,2,25,0,131,1,125,5,124,5,100, - 9,64,0,114,154,100,10,124,5,155,2,100,11,124,1,155, - 2,157,4,125,4,116,3,124,4,102,1,124,2,142,1,130, - 1,124,5,83,0,41,12,97,84,2,0,0,80,101,114,102, - 111,114,109,32,98,97,115,105,99,32,118,97,108,105,100,105, - 116,121,32,99,104,101,99,107,105,110,103,32,111,102,32,97, - 32,112,121,99,32,104,101,97,100,101,114,32,97,110,100,32, - 114,101,116,117,114,110,32,116,104,101,32,102,108,97,103,115, - 32,102,105,101,108,100,44,10,32,32,32,32,119,104,105,99, - 104,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119, - 32,116,104,101,32,112,121,99,32,115,104,111,117,108,100,32, - 98,101,32,102,117,114,116,104,101,114,32,118,97,108,105,100, - 97,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101, - 32,115,111,117,114,99,101,46,10,10,32,32,32,32,42,100, - 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, - 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, - 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, - 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,44, - 32,116,104,111,117,103,104,46,41,10,10,32,32,32,32,42, - 110,97,109,101,42,32,105,115,32,116,104,101,32,110,97,109, - 101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32, - 98,101,105,110,103,32,105,109,112,111,114,116,101,100,46,32, - 73,116,32,105,115,32,117,115,101,100,32,102,111,114,32,108, - 111,103,103,105,110,103,46,10,10,32,32,32,32,42,101,120, - 99,95,100,101,116,97,105,108,115,42,32,105,115,32,97,32, - 100,105,99,116,105,111,110,97,114,121,32,112,97,115,115,101, - 100,32,116,111,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,102,32,105,116,32,114,97,105,115,101,100,32,102,111, - 114,10,32,32,32,32,105,109,112,114,111,118,101,100,32,100, - 101,98,117,103,103,105,110,103,46,10,10,32,32,32,32,73, - 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, - 105,115,101,100,32,119,104,101,110,32,116,104,101,32,109,97, - 103,105,99,32,110,117,109,98,101,114,32,105,115,32,105,110, - 99,111,114,114,101,99,116,32,111,114,32,119,104,101,110,32, - 116,104,101,32,102,108,97,103,115,10,32,32,32,32,102,105, - 101,108,100,32,105,115,32,105,110,118,97,108,105,100,46,32, - 69,79,70,69,114,114,111,114,32,105,115,32,114,97,105,115, - 101,100,32,119,104,101,110,32,116,104,101,32,100,97,116,97, - 32,105,115,32,102,111,117,110,100,32,116,111,32,98,101,32, - 116,114,117,110,99,97,116,101,100,46,10,10,32,32,32,32, - 78,114,15,0,0,0,122,20,98,97,100,32,109,97,103,105, - 99,32,110,117,109,98,101,114,32,105,110,32,122,2,58,32, - 250,2,123,125,233,16,0,0,0,122,40,114,101,97,99,104, - 101,100,32,69,79,70,32,119,104,105,108,101,32,114,101,97, - 100,105,110,103,32,112,121,99,32,104,101,97,100,101,114,32, - 111,102,32,233,8,0,0,0,233,252,255,255,255,122,14,105, - 110,118,97,108,105,100,32,102,108,97,103,115,32,122,4,32, - 105,110,32,41,7,218,12,77,65,71,73,67,95,78,85,77, - 66,69,82,114,134,0,0,0,218,16,95,118,101,114,98,111, - 115,101,95,109,101,115,115,97,103,101,114,117,0,0,0,114, - 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,26, - 0,0,0,41,6,114,25,0,0,0,114,116,0,0,0,218, - 11,101,120,99,95,100,101,116,97,105,108,115,90,5,109,97, - 103,105,99,114,92,0,0,0,114,82,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,99, - 108,97,115,115,105,102,121,95,112,121,99,240,1,0,0,115, - 28,0,0,0,0,16,12,1,8,1,16,1,12,1,12,1, - 12,1,10,1,12,1,8,1,16,2,8,1,16,1,12,1, - 114,152,0,0,0,99,5,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,112, - 0,0,0,116,0,124,0,100,1,100,2,133,2,25,0,131, - 1,124,1,100,3,64,0,107,3,114,58,100,4,124,3,155, - 2,157,2,125,5,116,1,160,2,100,5,124,5,161,2,1, - 0,116,3,124,5,102,1,124,4,142,1,130,1,124,2,100, - 6,107,9,114,108,116,0,124,0,100,2,100,7,133,2,25, - 0,131,1,124,2,100,3,64,0,107,3,114,108,116,3,100, - 4,124,3,155,2,157,2,102,1,124,4,142,1,130,1,100, - 6,83,0,41,8,97,7,2,0,0,86,97,108,105,100,97, - 116,101,32,97,32,112,121,99,32,97,103,97,105,110,115,116, - 32,116,104,101,32,115,111,117,114,99,101,32,108,97,115,116, - 45,109,111,100,105,102,105,101,100,32,116,105,109,101,46,10, - 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, - 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, - 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, - 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, - 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, - 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115, - 111,117,114,99,101,95,109,116,105,109,101,42,32,105,115,32, - 116,104,101,32,108,97,115,116,32,109,111,100,105,102,105,101, - 100,32,116,105,109,101,115,116,97,109,112,32,111,102,32,116, - 104,101,32,115,111,117,114,99,101,32,102,105,108,101,46,10, - 10,32,32,32,32,42,115,111,117,114,99,101,95,115,105,122, - 101,42,32,105,115,32,78,111,110,101,32,111,114,32,116,104, - 101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,32,105,110,32,98,121,116, - 101,115,46,10,10,32,32,32,32,42,110,97,109,101,42,32, - 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, - 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32, - 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32, - 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103, - 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97, - 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111, - 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73, - 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, - 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32, - 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105, - 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, - 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100, - 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32, - 32,114,146,0,0,0,233,12,0,0,0,114,14,0,0,0, - 122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,32,102,111,114,32,114,144,0,0,0,78,114,145, - 0,0,0,41,4,114,26,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,117,0,0,0,41,6,114,25,0,0,0, - 218,12,115,111,117,114,99,101,95,109,116,105,109,101,218,11, - 115,111,117,114,99,101,95,115,105,122,101,114,116,0,0,0, - 114,151,0,0,0,114,92,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,23,95,118,97,108,105, - 100,97,116,101,95,116,105,109,101,115,116,97,109,112,95,112, - 121,99,17,2,0,0,115,16,0,0,0,0,19,24,1,10, - 1,12,1,12,1,8,1,22,255,2,2,114,156,0,0,0, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 100,1,100,2,133,2,25,0,124,1,107,3,114,34,116,0, - 100,3,124,2,155,2,157,2,102,1,124,3,142,1,130,1, - 100,4,83,0,41,5,97,243,1,0,0,86,97,108,105,100, - 97,116,101,32,97,32,104,97,115,104,45,98,97,115,101,100, - 32,112,121,99,32,98,121,32,99,104,101,99,107,105,110,103, - 32,116,104,101,32,114,101,97,108,32,115,111,117,114,99,101, - 32,104,97,115,104,32,97,103,97,105,110,115,116,32,116,104, - 101,32,111,110,101,32,105,110,10,32,32,32,32,116,104,101, - 32,112,121,99,32,104,101,97,100,101,114,46,10,10,32,32, - 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, - 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, - 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, - 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, - 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, - 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, - 99,101,95,104,97,115,104,42,32,105,115,32,116,104,101,32, - 105,109,112,111,114,116,108,105,98,46,117,116,105,108,46,115, - 111,117,114,99,101,95,104,97,115,104,40,41,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46, - 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, - 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, - 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, - 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, - 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, - 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, - 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, - 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, - 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,146, - 0,0,0,114,145,0,0,0,122,46,104,97,115,104,32,105, - 110,32,98,121,116,101,99,111,100,101,32,100,111,101,115,110, - 39,116,32,109,97,116,99,104,32,104,97,115,104,32,111,102, - 32,115,111,117,114,99,101,32,78,41,1,114,117,0,0,0, - 41,4,114,25,0,0,0,218,11,115,111,117,114,99,101,95, - 104,97,115,104,114,116,0,0,0,114,151,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,95, - 118,97,108,105,100,97,116,101,95,104,97,115,104,95,112,121, - 99,45,2,0,0,115,12,0,0,0,0,17,16,1,2,1, - 8,255,2,2,2,254,114,158,0,0,0,99,4,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,80,0,0,0,116,0,160,1,124,0,161, - 1,125,4,116,2,124,4,116,3,131,2,114,56,116,4,160, - 5,100,1,124,2,161,2,1,0,124,3,100,2,107,9,114, - 52,116,6,160,7,124,4,124,3,161,2,1,0,124,4,83, - 0,116,8,100,3,160,9,124,2,161,1,124,1,124,2,100, - 4,141,3,130,1,100,2,83,0,41,5,122,35,67,111,109, - 112,105,108,101,32,98,121,116,101,99,111,100,101,32,97,115, - 32,102,111,117,110,100,32,105,110,32,97,32,112,121,99,46, - 122,21,99,111,100,101,32,111,98,106,101,99,116,32,102,114, - 111,109,32,123,33,114,125,78,122,23,78,111,110,45,99,111, - 100,101,32,111,98,106,101,99,116,32,105,110,32,123,33,114, - 125,169,2,114,116,0,0,0,114,43,0,0,0,41,10,218, - 7,109,97,114,115,104,97,108,90,5,108,111,97,100,115,218, - 10,105,115,105,110,115,116,97,110,99,101,218,10,95,99,111, - 100,101,95,116,121,112,101,114,134,0,0,0,114,149,0,0, - 0,218,4,95,105,109,112,90,16,95,102,105,120,95,99,111, - 95,102,105,108,101,110,97,109,101,114,117,0,0,0,114,61, - 0,0,0,41,5,114,25,0,0,0,114,116,0,0,0,114, - 106,0,0,0,114,107,0,0,0,218,4,99,111,100,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,99,111,109,112,105,108,101,95,98,121,116,101,99,111,100, - 101,69,2,0,0,115,20,0,0,0,0,2,10,1,10,1, - 12,1,8,1,12,1,4,2,10,1,2,0,2,255,114,165, - 0,0,0,114,72,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, - 0,115,70,0,0,0,116,0,116,1,131,1,125,3,124,3, - 160,2,116,3,100,1,131,1,161,1,1,0,124,3,160,2, - 116,3,124,1,131,1,161,1,1,0,124,3,160,2,116,3, - 124,2,131,1,161,1,1,0,124,3,160,2,116,4,160,5, - 124,0,161,1,161,1,1,0,124,3,83,0,41,2,122,43, - 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, - 32,102,111,114,32,97,32,116,105,109,101,115,116,97,109,112, - 45,98,97,115,101,100,32,112,121,99,46,114,72,0,0,0, - 41,6,218,9,98,121,116,101,97,114,114,97,121,114,148,0, - 0,0,218,6,101,120,116,101,110,100,114,20,0,0,0,114, - 160,0,0,0,218,5,100,117,109,112,115,41,4,114,164,0, - 0,0,218,5,109,116,105,109,101,114,155,0,0,0,114,25, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,22,95,99,111,100,101,95,116,111,95,116,105,109, - 101,115,116,97,109,112,95,112,121,99,82,2,0,0,115,12, - 0,0,0,0,2,8,1,14,1,14,1,14,1,16,1,114, - 170,0,0,0,84,99,3,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,80, - 0,0,0,116,0,116,1,131,1,125,3,100,1,124,2,100, - 1,62,0,66,0,125,4,124,3,160,2,116,3,124,4,131, - 1,161,1,1,0,116,4,124,1,131,1,100,2,107,2,115, - 50,74,0,130,1,124,3,160,2,124,1,161,1,1,0,124, - 3,160,2,116,5,160,6,124,0,161,1,161,1,1,0,124, - 3,83,0,41,3,122,38,80,114,111,100,117,99,101,32,116, - 104,101,32,100,97,116,97,32,102,111,114,32,97,32,104,97, - 115,104,45,98,97,115,101,100,32,112,121,99,46,114,38,0, - 0,0,114,146,0,0,0,41,7,114,166,0,0,0,114,148, - 0,0,0,114,167,0,0,0,114,20,0,0,0,114,22,0, - 0,0,114,160,0,0,0,114,168,0,0,0,41,5,114,164, - 0,0,0,114,157,0,0,0,90,7,99,104,101,99,107,101, - 100,114,25,0,0,0,114,82,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,100, - 101,95,116,111,95,104,97,115,104,95,112,121,99,92,2,0, - 0,115,14,0,0,0,0,2,8,1,12,1,14,1,16,1, - 10,1,16,1,114,171,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, - 0,0,115,62,0,0,0,100,1,100,2,108,0,125,1,116, - 1,160,2,124,0,161,1,106,3,125,2,124,1,160,4,124, - 2,161,1,125,3,116,1,160,5,100,2,100,3,161,2,125, - 4,124,4,160,6,124,0,160,6,124,3,100,1,25,0,161, - 1,161,1,83,0,41,4,122,121,68,101,99,111,100,101,32, - 98,121,116,101,115,32,114,101,112,114,101,115,101,110,116,105, - 110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,97, - 110,100,32,114,101,116,117,114,110,32,116,104,101,32,115,116, - 114,105,110,103,46,10,10,32,32,32,32,85,110,105,118,101, - 114,115,97,108,32,110,101,119,108,105,110,101,32,115,117,112, - 112,111,114,116,32,105,115,32,117,115,101,100,32,105,110,32, - 116,104,101,32,100,101,99,111,100,105,110,103,46,10,32,32, - 32,32,114,72,0,0,0,78,84,41,7,218,8,116,111,107, - 101,110,105,122,101,114,63,0,0,0,90,7,66,121,116,101, - 115,73,79,90,8,114,101,97,100,108,105,110,101,90,15,100, - 101,116,101,99,116,95,101,110,99,111,100,105,110,103,90,25, - 73,110,99,114,101,109,101,110,116,97,108,78,101,119,108,105, - 110,101,68,101,99,111,100,101,114,218,6,100,101,99,111,100, - 101,41,5,218,12,115,111,117,114,99,101,95,98,121,116,101, - 115,114,172,0,0,0,90,21,115,111,117,114,99,101,95,98, - 121,116,101,115,95,114,101,97,100,108,105,110,101,218,8,101, - 110,99,111,100,105,110,103,90,15,110,101,119,108,105,110,101, - 95,100,101,99,111,100,101,114,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,13,100,101,99,111,100,101,95, - 115,111,117,114,99,101,103,2,0,0,115,10,0,0,0,0, - 5,8,1,12,1,10,1,12,1,114,176,0,0,0,169,2, - 114,140,0,0,0,218,26,115,117,98,109,111,100,117,108,101, - 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, - 115,99,2,0,0,0,0,0,0,0,2,0,0,0,9,0, - 0,0,8,0,0,0,67,0,0,0,115,16,1,0,0,124, - 1,100,1,107,8,114,60,100,2,125,1,116,0,124,2,100, - 3,131,2,114,70,122,14,124,2,160,1,124,0,161,1,125, - 1,87,0,113,70,4,0,116,2,107,10,114,56,1,0,1, - 0,1,0,89,0,113,70,48,0,110,10,116,3,160,4,124, + 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, + 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, + 32,32,32,114,146,0,0,0,233,12,0,0,0,114,14,0, + 0,0,122,22,98,121,116,101,99,111,100,101,32,105,115,32, + 115,116,97,108,101,32,102,111,114,32,114,144,0,0,0,78, + 114,145,0,0,0,41,4,114,26,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,117,0,0,0,41,6,114,25,0, + 0,0,218,12,115,111,117,114,99,101,95,109,116,105,109,101, + 218,11,115,111,117,114,99,101,95,115,105,122,101,114,116,0, + 0,0,114,151,0,0,0,114,92,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,23,95,118,97, + 108,105,100,97,116,101,95,116,105,109,101,115,116,97,109,112, + 95,112,121,99,18,2,0,0,115,16,0,0,0,0,19,24, + 1,10,1,12,1,12,1,8,1,22,255,2,2,114,156,0, + 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,100,1,100,2,133,2,25,0,124,1,107,3,114,34, + 116,0,100,3,124,2,155,2,157,2,102,1,124,3,142,1, + 130,1,100,4,83,0,41,5,97,243,1,0,0,86,97,108, + 105,100,97,116,101,32,97,32,104,97,115,104,45,98,97,115, + 101,100,32,112,121,99,32,98,121,32,99,104,101,99,107,105, + 110,103,32,116,104,101,32,114,101,97,108,32,115,111,117,114, + 99,101,32,104,97,115,104,32,97,103,97,105,110,115,116,32, + 116,104,101,32,111,110,101,32,105,110,10,32,32,32,32,116, + 104,101,32,112,121,99,32,104,101,97,100,101,114,46,10,10, + 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, + 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, + 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, + 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, + 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, + 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, + 117,114,99,101,95,104,97,115,104,42,32,105,115,32,116,104, + 101,32,105,109,112,111,114,116,108,105,98,46,117,116,105,108, + 46,115,111,117,114,99,101,95,104,97,115,104,40,41,32,111, + 102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, + 101,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, + 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, + 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, + 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, + 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, + 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, + 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, + 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, + 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, + 114,146,0,0,0,114,145,0,0,0,122,46,104,97,115,104, + 32,105,110,32,98,121,116,101,99,111,100,101,32,100,111,101, + 115,110,39,116,32,109,97,116,99,104,32,104,97,115,104,32, + 111,102,32,115,111,117,114,99,101,32,78,41,1,114,117,0, + 0,0,41,4,114,25,0,0,0,218,11,115,111,117,114,99, + 101,95,104,97,115,104,114,116,0,0,0,114,151,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 18,95,118,97,108,105,100,97,116,101,95,104,97,115,104,95, + 112,121,99,46,2,0,0,115,12,0,0,0,0,17,16,1, + 2,1,8,255,2,2,2,254,114,158,0,0,0,99,4,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,80,0,0,0,116,0,160,1,124, + 0,161,1,125,4,116,2,124,4,116,3,131,2,114,56,116, + 4,160,5,100,1,124,2,161,2,1,0,124,3,100,2,117, + 1,114,52,116,6,160,7,124,4,124,3,161,2,1,0,124, + 4,83,0,116,8,100,3,160,9,124,2,161,1,124,1,124, + 2,100,4,141,3,130,1,100,2,83,0,41,5,122,35,67, + 111,109,112,105,108,101,32,98,121,116,101,99,111,100,101,32, + 97,115,32,102,111,117,110,100,32,105,110,32,97,32,112,121, + 99,46,122,21,99,111,100,101,32,111,98,106,101,99,116,32, + 102,114,111,109,32,123,33,114,125,78,122,23,78,111,110,45, + 99,111,100,101,32,111,98,106,101,99,116,32,105,110,32,123, + 33,114,125,169,2,114,116,0,0,0,114,43,0,0,0,41, + 10,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, + 115,218,10,105,115,105,110,115,116,97,110,99,101,218,10,95, + 99,111,100,101,95,116,121,112,101,114,134,0,0,0,114,149, + 0,0,0,218,4,95,105,109,112,90,16,95,102,105,120,95, + 99,111,95,102,105,108,101,110,97,109,101,114,117,0,0,0, + 114,61,0,0,0,41,5,114,25,0,0,0,114,116,0,0, + 0,114,106,0,0,0,114,107,0,0,0,218,4,99,111,100, + 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,99, + 111,100,101,70,2,0,0,115,20,0,0,0,0,2,10,1, + 10,1,12,1,8,1,12,1,4,2,10,1,2,0,2,255, + 114,165,0,0,0,114,72,0,0,0,99,3,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, + 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3, + 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3, + 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2, + 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4, + 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,2, + 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97, + 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97, + 109,112,45,98,97,115,101,100,32,112,121,99,46,114,72,0, + 0,0,41,6,218,9,98,121,116,101,97,114,114,97,121,114, + 148,0,0,0,218,6,101,120,116,101,110,100,114,20,0,0, + 0,114,160,0,0,0,218,5,100,117,109,112,115,41,4,114, + 164,0,0,0,218,5,109,116,105,109,101,114,155,0,0,0, + 114,25,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,22,95,99,111,100,101,95,116,111,95,116, + 105,109,101,115,116,97,109,112,95,112,121,99,83,2,0,0, + 115,12,0,0,0,0,2,8,1,14,1,14,1,14,1,16, + 1,114,170,0,0,0,84,99,3,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,80,0,0,0,116,0,116,1,131,1,125,3,100,1,124, + 2,100,1,62,0,66,0,125,4,124,3,160,2,116,3,124, + 4,131,1,161,1,1,0,116,4,124,1,131,1,100,2,107, + 2,115,50,74,0,130,1,124,3,160,2,124,1,161,1,1, + 0,124,3,160,2,116,5,160,6,124,0,161,1,161,1,1, + 0,124,3,83,0,41,3,122,38,80,114,111,100,117,99,101, + 32,116,104,101,32,100,97,116,97,32,102,111,114,32,97,32, + 104,97,115,104,45,98,97,115,101,100,32,112,121,99,46,114, + 38,0,0,0,114,146,0,0,0,41,7,114,166,0,0,0, + 114,148,0,0,0,114,167,0,0,0,114,20,0,0,0,114, + 22,0,0,0,114,160,0,0,0,114,168,0,0,0,41,5, + 114,164,0,0,0,114,157,0,0,0,90,7,99,104,101,99, + 107,101,100,114,25,0,0,0,114,82,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,17,95,99, + 111,100,101,95,116,111,95,104,97,115,104,95,112,121,99,93, + 2,0,0,115,14,0,0,0,0,2,8,1,12,1,14,1, + 16,1,10,1,16,1,114,171,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, + 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125, + 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160, + 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161, + 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25, + 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100, + 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, + 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, + 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, + 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, + 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, + 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, + 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, + 32,32,32,32,114,72,0,0,0,78,84,41,7,218,8,116, + 111,107,101,110,105,122,101,114,63,0,0,0,90,7,66,121, + 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, + 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, + 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119, + 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99, + 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121, + 116,101,115,114,172,0,0,0,90,21,115,111,117,114,99,101, + 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218, + 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105, + 110,101,95,100,101,99,111,100,101,114,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,13,100,101,99,111,100, + 101,95,115,111,117,114,99,101,104,2,0,0,115,10,0,0, + 0,0,5,8,1,12,1,10,1,12,1,114,176,0,0,0, + 169,2,114,140,0,0,0,218,26,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,99,2,0,0,0,0,0,0,0,2,0,0,0, + 9,0,0,0,8,0,0,0,67,0,0,0,115,12,1,0, + 0,124,1,100,1,117,0,114,58,100,2,125,1,116,0,124, + 2,100,3,131,2,114,68,122,14,124,2,160,1,124,0,161, + 1,125,1,87,0,113,68,4,0,116,2,121,54,1,0,1, + 0,1,0,89,0,113,68,48,0,110,10,116,3,160,4,124, 1,161,1,125,1,116,5,106,6,124,0,124,2,124,1,100, - 4,141,3,125,4,100,5,124,4,95,7,124,2,100,1,107, - 8,114,154,116,8,131,0,68,0,93,42,92,2,125,5,125, - 6,124,1,160,9,116,10,124,6,131,1,161,1,114,106,124, + 4,141,3,125,4,100,5,124,4,95,7,124,2,100,1,117, + 0,114,152,116,8,131,0,68,0,93,42,92,2,125,5,125, + 6,124,1,160,9,116,10,124,6,131,1,161,1,114,104,124, 5,124,0,124,1,131,2,125,2,124,2,124,4,95,11,1, - 0,113,154,113,106,100,1,83,0,124,3,116,12,107,8,114, - 220,116,0,124,2,100,6,131,2,114,226,122,14,124,2,160, - 13,124,0,161,1,125,7,87,0,110,20,4,0,116,2,107, - 10,114,206,1,0,1,0,1,0,89,0,113,226,48,0,124, - 7,114,226,103,0,124,4,95,14,110,6,124,3,124,4,95, - 14,124,4,106,14,103,0,107,2,144,1,114,12,124,1,144, - 1,114,12,116,15,124,1,131,1,100,7,25,0,125,8,124, - 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,41, - 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, - 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, - 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, - 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, - 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, - 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, - 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, - 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, - 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, - 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, - 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, - 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, - 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, - 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, - 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, - 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, - 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, - 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, - 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, - 107,97,103,101,114,72,0,0,0,41,17,114,128,0,0,0, - 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, - 78,0,0,0,114,134,0,0,0,218,10,77,111,100,117,108, - 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, - 97,116,116,114,218,27,95,103,101,116,95,115,117,112,112,111, - 114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114, - 115,114,110,0,0,0,114,111,0,0,0,114,140,0,0,0, - 218,9,95,80,79,80,85,76,65,84,69,114,182,0,0,0, - 114,178,0,0,0,114,46,0,0,0,218,6,97,112,112,101, - 110,100,41,9,114,116,0,0,0,90,8,108,111,99,97,116, - 105,111,110,114,140,0,0,0,114,178,0,0,0,218,4,115, - 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, - 115,218,8,115,117,102,102,105,120,101,115,114,182,0,0,0, - 90,7,100,105,114,110,97,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,23,115,112,101,99,95,102, - 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, - 110,120,2,0,0,115,62,0,0,0,0,12,8,4,4,1, - 10,2,2,1,14,1,14,1,8,2,10,8,16,1,6,3, - 8,1,14,1,14,1,10,1,6,1,6,2,4,3,8,2, - 10,1,2,1,14,1,14,1,6,2,4,1,8,2,6,1, - 12,1,6,1,12,1,12,2,114,190,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,80,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,90,4,100,3,90,5,100, - 4,90,6,101,7,100,5,100,6,132,0,131,1,90,8,101, - 7,100,7,100,8,132,0,131,1,90,9,101,7,100,14,100, - 10,100,11,132,1,131,1,90,10,101,7,100,15,100,12,100, - 13,132,1,131,1,90,11,100,9,83,0,41,16,218,21,87, + 0,113,152,113,104,100,1,83,0,124,3,116,12,117,0,114, + 216,116,0,124,2,100,6,131,2,114,222,122,14,124,2,160, + 13,124,0,161,1,125,7,87,0,110,18,4,0,116,2,121, + 202,1,0,1,0,1,0,89,0,113,222,48,0,124,7,114, + 222,103,0,124,4,95,14,110,6,124,3,124,4,95,14,124, + 4,106,14,103,0,107,2,144,1,114,8,124,1,144,1,114, + 8,116,15,124,1,131,1,100,7,25,0,125,8,124,4,106, + 14,160,16,124,8,161,1,1,0,124,4,83,0,41,8,97, + 61,1,0,0,82,101,116,117,114,110,32,97,32,109,111,100, + 117,108,101,32,115,112,101,99,32,98,97,115,101,100,32,111, + 110,32,97,32,102,105,108,101,32,108,111,99,97,116,105,111, + 110,46,10,10,32,32,32,32,84,111,32,105,110,100,105,99, + 97,116,101,32,116,104,97,116,32,116,104,101,32,109,111,100, + 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 44,32,115,101,116,10,32,32,32,32,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,32,116,111,32,97,32,108,105,115,116,32,111, + 102,32,100,105,114,101,99,116,111,114,121,32,112,97,116,104, + 115,46,32,32,65,110,10,32,32,32,32,101,109,112,116,121, + 32,108,105,115,116,32,105,115,32,115,117,102,102,105,99,105, + 101,110,116,44,32,116,104,111,117,103,104,32,105,116,115,32, + 110,111,116,32,111,116,104,101,114,119,105,115,101,32,117,115, + 101,102,117,108,32,116,111,32,116,104,101,10,32,32,32,32, + 105,109,112,111,114,116,32,115,121,115,116,101,109,46,10,10, + 32,32,32,32,84,104,101,32,108,111,97,100,101,114,32,109, + 117,115,116,32,116,97,107,101,32,97,32,115,112,101,99,32, + 97,115,32,105,116,115,32,111,110,108,121,32,95,95,105,110, + 105,116,95,95,40,41,32,97,114,103,46,10,10,32,32,32, + 32,78,122,9,60,117,110,107,110,111,119,110,62,218,12,103, + 101,116,95,102,105,108,101,110,97,109,101,169,1,218,6,111, + 114,105,103,105,110,84,218,10,105,115,95,112,97,99,107,97, + 103,101,114,72,0,0,0,41,17,114,128,0,0,0,114,179, + 0,0,0,114,117,0,0,0,114,2,0,0,0,114,78,0, + 0,0,114,134,0,0,0,218,10,77,111,100,117,108,101,83, + 112,101,99,90,13,95,115,101,116,95,102,105,108,101,97,116, + 116,114,218,27,95,103,101,116,95,115,117,112,112,111,114,116, + 101,100,95,102,105,108,101,95,108,111,97,100,101,114,115,114, + 110,0,0,0,114,111,0,0,0,114,140,0,0,0,218,9, + 95,80,79,80,85,76,65,84,69,114,182,0,0,0,114,178, + 0,0,0,114,46,0,0,0,218,6,97,112,112,101,110,100, + 41,9,114,116,0,0,0,90,8,108,111,99,97,116,105,111, + 110,114,140,0,0,0,114,178,0,0,0,218,4,115,112,101, + 99,218,12,108,111,97,100,101,114,95,99,108,97,115,115,218, + 8,115,117,102,102,105,120,101,115,114,182,0,0,0,90,7, + 100,105,114,110,97,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,23,115,112,101,99,95,102,114,111, + 109,95,102,105,108,101,95,108,111,99,97,116,105,111,110,121, + 2,0,0,115,62,0,0,0,0,12,8,4,4,1,10,2, + 2,1,14,1,12,1,8,2,10,8,16,1,6,3,8,1, + 14,1,14,1,10,1,6,1,6,2,4,3,8,2,10,1, + 2,1,14,1,12,1,6,2,4,1,8,2,6,1,12,1, + 6,1,12,1,12,2,114,190,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 64,0,0,0,115,80,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,90,4,100,3,90,5,100,4,90, + 6,101,7,100,5,100,6,132,0,131,1,90,8,101,7,100, + 7,100,8,132,0,131,1,90,9,101,7,100,14,100,10,100, + 11,132,1,131,1,90,10,101,7,100,15,100,12,100,13,132, + 1,131,1,90,11,100,9,83,0,41,16,218,21,87,105,110, + 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, + 101,114,122,62,77,101,116,97,32,112,97,116,104,32,102,105, + 110,100,101,114,32,102,111,114,32,109,111,100,117,108,101,115, + 32,100,101,99,108,97,114,101,100,32,105,110,32,116,104,101, + 32,87,105,110,100,111,119,115,32,114,101,103,105,115,116,114, + 121,46,122,59,83,111,102,116,119,97,114,101,92,80,121,116, + 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, + 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, + 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,122, + 65,83,111,102,116,119,97,114,101,92,80,121,116,104,111,110, + 92,80,121,116,104,111,110,67,111,114,101,92,123,115,121,115, + 95,118,101,114,115,105,111,110,125,92,77,111,100,117,108,101, + 115,92,123,102,117,108,108,110,97,109,101,125,92,68,101,98, + 117,103,70,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,54,0,0, + 0,122,16,116,0,160,1,116,0,106,2,124,1,161,2,87, + 0,83,0,4,0,116,3,121,48,1,0,1,0,1,0,116, + 0,160,1,116,0,106,4,124,1,161,2,6,0,89,0,83, + 0,48,0,100,0,83,0,114,109,0,0,0,41,5,218,7, + 95,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, + 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, + 83,69,82,114,49,0,0,0,90,18,72,75,69,89,95,76, + 79,67,65,76,95,77,65,67,72,73,78,69,41,2,218,3, + 99,108,115,114,5,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,14,95,111,112,101,110,95,114, + 101,103,105,115,116,114,121,201,2,0,0,115,8,0,0,0, + 0,2,2,1,16,1,12,1,122,36,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 95,111,112,101,110,95,114,101,103,105,115,116,114,121,99,2, + 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, + 0,0,0,67,0,0,0,115,132,0,0,0,124,0,106,0, + 114,14,124,0,106,1,125,2,110,6,124,0,106,2,125,2, + 124,2,106,3,124,1,100,1,116,4,106,5,100,0,100,2, + 133,2,25,0,22,0,100,3,141,2,125,3,122,58,124,0, + 160,6,124,3,161,1,143,28,125,4,116,7,160,8,124,4, + 100,4,161,2,125,5,87,0,100,0,4,0,4,0,131,3, + 1,0,110,16,49,0,115,94,48,0,1,0,1,0,1,0, + 89,0,1,0,87,0,110,20,4,0,116,9,121,126,1,0, + 1,0,1,0,89,0,100,0,83,0,48,0,124,5,83,0, + 41,5,78,122,5,37,100,46,37,100,114,27,0,0,0,41, + 2,114,139,0,0,0,90,11,115,121,115,95,118,101,114,115, + 105,111,110,114,39,0,0,0,41,10,218,11,68,69,66,85, + 71,95,66,85,73,76,68,218,18,82,69,71,73,83,84,82, + 89,95,75,69,89,95,68,69,66,85,71,218,12,82,69,71, + 73,83,84,82,89,95,75,69,89,114,61,0,0,0,114,8, + 0,0,0,218,12,118,101,114,115,105,111,110,95,105,110,102, + 111,114,194,0,0,0,114,192,0,0,0,90,10,81,117,101, + 114,121,86,97,108,117,101,114,49,0,0,0,41,6,114,193, + 0,0,0,114,139,0,0,0,90,12,114,101,103,105,115,116, + 114,121,95,107,101,121,114,5,0,0,0,90,4,104,107,101, + 121,218,8,102,105,108,101,112,97,116,104,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,16,95,115,101,97, + 114,99,104,95,114,101,103,105,115,116,114,121,208,2,0,0, + 115,24,0,0,0,0,2,6,1,8,2,6,1,6,1,16, + 255,6,2,2,1,12,1,46,1,12,1,8,1,122,38,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, - 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, - 101,115,32,100,101,99,108,97,114,101,100,32,105,110,32,116, - 104,101,32,87,105,110,100,111,119,115,32,114,101,103,105,115, - 116,114,121,46,122,59,83,111,102,116,119,97,114,101,92,80, - 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, - 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, - 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, - 125,122,65,83,111,102,116,119,97,114,101,92,80,121,116,104, - 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, - 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, - 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, - 101,98,117,103,70,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,56, - 0,0,0,122,16,116,0,160,1,116,0,106,2,124,1,161, - 2,87,0,83,0,4,0,116,3,107,10,114,50,1,0,1, - 0,1,0,116,0,160,1,116,0,106,4,124,1,161,2,6, - 0,89,0,83,0,48,0,100,0,83,0,114,109,0,0,0, - 41,5,218,7,95,119,105,110,114,101,103,90,7,79,112,101, - 110,75,101,121,90,17,72,75,69,89,95,67,85,82,82,69, - 78,84,95,85,83,69,82,114,49,0,0,0,90,18,72,75, - 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, - 41,2,218,3,99,108,115,114,5,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,95,111,112, - 101,110,95,114,101,103,105,115,116,114,121,200,2,0,0,115, - 8,0,0,0,0,2,2,1,16,1,14,1,122,36,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, - 100,101,114,46,95,111,112,101,110,95,114,101,103,105,115,116, - 114,121,99,2,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,8,0,0,0,67,0,0,0,115,134,0,0,0, - 124,0,106,0,114,14,124,0,106,1,125,2,110,6,124,0, - 106,2,125,2,124,2,106,3,124,1,100,1,116,4,106,5, - 100,0,100,2,133,2,25,0,22,0,100,3,141,2,125,3, - 122,58,124,0,160,6,124,3,161,1,143,28,125,4,116,7, - 160,8,124,4,100,4,161,2,125,5,87,0,100,0,4,0, - 4,0,131,3,1,0,110,16,49,0,115,94,48,0,1,0, - 1,0,1,0,89,0,1,0,87,0,110,22,4,0,116,9, - 107,10,114,128,1,0,1,0,1,0,89,0,100,0,83,0, - 48,0,124,5,83,0,41,5,78,122,5,37,100,46,37,100, - 114,27,0,0,0,41,2,114,139,0,0,0,90,11,115,121, - 115,95,118,101,114,115,105,111,110,114,39,0,0,0,41,10, - 218,11,68,69,66,85,71,95,66,85,73,76,68,218,18,82, - 69,71,73,83,84,82,89,95,75,69,89,95,68,69,66,85, - 71,218,12,82,69,71,73,83,84,82,89,95,75,69,89,114, - 61,0,0,0,114,8,0,0,0,218,12,118,101,114,115,105, - 111,110,95,105,110,102,111,114,194,0,0,0,114,192,0,0, - 0,90,10,81,117,101,114,121,86,97,108,117,101,114,49,0, - 0,0,41,6,114,193,0,0,0,114,139,0,0,0,90,12, - 114,101,103,105,115,116,114,121,95,107,101,121,114,5,0,0, - 0,90,4,104,107,101,121,218,8,102,105,108,101,112,97,116, - 104,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,16,95,115,101,97,114,99,104,95,114,101,103,105,115,116, - 114,121,207,2,0,0,115,24,0,0,0,0,2,6,1,8, - 2,6,1,6,1,16,255,6,2,2,1,12,1,46,1,14, - 1,8,1,122,38,87,105,110,100,111,119,115,82,101,103,105, - 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114, - 99,104,95,114,101,103,105,115,116,114,121,78,99,4,0,0, - 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, - 0,67,0,0,0,115,122,0,0,0,124,0,160,0,124,1, - 161,1,125,4,124,4,100,0,107,8,114,22,100,0,83,0, - 122,12,116,1,124,4,131,1,1,0,87,0,110,22,4,0, - 116,2,107,10,114,56,1,0,1,0,1,0,89,0,100,0, - 83,0,48,0,116,3,131,0,68,0,93,52,92,2,125,5, - 125,6,124,4,160,4,116,5,124,6,131,1,161,1,114,64, - 116,6,106,7,124,1,124,5,124,1,124,4,131,2,124,4, - 100,1,141,3,125,7,124,7,2,0,1,0,83,0,113,64, - 100,0,83,0,41,2,78,114,180,0,0,0,41,8,114,200, - 0,0,0,114,48,0,0,0,114,49,0,0,0,114,184,0, - 0,0,114,110,0,0,0,114,111,0,0,0,114,134,0,0, - 0,218,16,115,112,101,99,95,102,114,111,109,95,108,111,97, - 100,101,114,41,8,114,193,0,0,0,114,139,0,0,0,114, - 43,0,0,0,218,6,116,97,114,103,101,116,114,199,0,0, - 0,114,140,0,0,0,114,189,0,0,0,114,187,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 9,102,105,110,100,95,115,112,101,99,222,2,0,0,115,28, - 0,0,0,0,2,10,1,8,1,4,1,2,1,12,1,14, - 1,8,1,14,1,14,1,6,1,8,1,2,254,6,3,122, - 31,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, - 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,107,9, - 114,26,124,3,106,1,83,0,100,1,83,0,100,1,83,0, - 41,2,122,108,70,105,110,100,32,109,111,100,117,108,101,32, - 110,97,109,101,100,32,105,110,32,116,104,101,32,114,101,103, - 105,115,116,114,121,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, - 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,169,2,114,203,0,0,0,114,140,0,0,0,169,4,114, - 193,0,0,0,114,139,0,0,0,114,43,0,0,0,114,187, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,238, - 2,0,0,115,8,0,0,0,0,7,12,1,8,1,6,2, - 122,33,87,105,110,100,111,119,115,82,101,103,105,115,116,114, - 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, - 117,108,101,41,2,78,78,41,1,78,41,12,114,125,0,0, - 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, - 114,197,0,0,0,114,196,0,0,0,114,195,0,0,0,218, - 11,99,108,97,115,115,109,101,116,104,111,100,114,194,0,0, - 0,114,200,0,0,0,114,203,0,0,0,114,206,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,191,0,0,0,188,2,0,0,115,28,0, - 0,0,8,2,4,3,2,255,2,4,2,255,2,3,4,2, - 2,1,10,6,2,1,10,14,2,1,12,15,2,1,114,191, - 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,64,0,0,0,115,48,0,0, - 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, - 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, - 7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,83, - 0,41,11,218,13,95,76,111,97,100,101,114,66,97,115,105, - 99,115,122,83,66,97,115,101,32,99,108,97,115,115,32,111, - 102,32,99,111,109,109,111,110,32,99,111,100,101,32,110,101, - 101,100,101,100,32,98,121,32,98,111,116,104,32,83,111,117, - 114,99,101,76,111,97,100,101,114,32,97,110,100,10,32,32, - 32,32,83,111,117,114,99,101,108,101,115,115,70,105,108,101, - 76,111,97,100,101,114,46,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0, - 115,64,0,0,0,116,0,124,0,160,1,124,1,161,1,131, - 1,100,1,25,0,125,2,124,2,160,2,100,2,100,1,161, - 2,100,3,25,0,125,3,124,1,160,3,100,2,161,1,100, - 4,25,0,125,4,124,3,100,5,107,2,111,62,124,4,100, - 5,107,3,83,0,41,6,122,141,67,111,110,99,114,101,116, - 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 32,111,102,32,73,110,115,112,101,99,116,76,111,97,100,101, - 114,46,105,115,95,112,97,99,107,97,103,101,32,98,121,32, - 99,104,101,99,107,105,110,103,32,105,102,10,32,32,32,32, - 32,32,32,32,116,104,101,32,112,97,116,104,32,114,101,116, - 117,114,110,101,100,32,98,121,32,103,101,116,95,102,105,108, - 101,110,97,109,101,32,104,97,115,32,97,32,102,105,108,101, - 110,97,109,101,32,111,102,32,39,95,95,105,110,105,116,95, - 95,46,112,121,39,46,114,38,0,0,0,114,70,0,0,0, - 114,72,0,0,0,114,27,0,0,0,218,8,95,95,105,110, - 105,116,95,95,41,4,114,46,0,0,0,114,179,0,0,0, - 114,42,0,0,0,114,40,0,0,0,41,5,114,118,0,0, - 0,114,139,0,0,0,114,96,0,0,0,90,13,102,105,108, - 101,110,97,109,101,95,98,97,115,101,90,9,116,97,105,108, - 95,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,182,0,0,0,1,3,0,0,115,8,0, - 0,0,0,3,18,1,16,1,14,1,122,24,95,76,111,97, - 100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,99, - 107,97,103,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,169,2,122,42,85,115,101,32,100,101, - 102,97,117,108,116,32,115,101,109,97,110,116,105,99,115,32, - 102,111,114,32,109,111,100,117,108,101,32,99,114,101,97,116, - 105,111,110,46,78,114,3,0,0,0,169,2,114,118,0,0, - 0,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,13,99,114,101,97,116,101,95,109,111, - 100,117,108,101,9,3,0,0,115,2,0,0,0,0,1,122, - 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, - 0,67,0,0,0,115,56,0,0,0,124,0,160,0,124,1, - 106,1,161,1,125,2,124,2,100,1,107,8,114,36,116,2, - 100,2,160,3,124,1,106,1,161,1,131,1,130,1,116,4, - 160,5,116,6,124,2,124,1,106,7,161,3,1,0,100,1, - 83,0,41,3,122,19,69,120,101,99,117,116,101,32,116,104, - 101,32,109,111,100,117,108,101,46,78,122,52,99,97,110,110, - 111,116,32,108,111,97,100,32,109,111,100,117,108,101,32,123, - 33,114,125,32,119,104,101,110,32,103,101,116,95,99,111,100, - 101,40,41,32,114,101,116,117,114,110,115,32,78,111,110,101, - 41,8,218,8,103,101,116,95,99,111,100,101,114,125,0,0, - 0,114,117,0,0,0,114,61,0,0,0,114,134,0,0,0, - 218,25,95,99,97,108,108,95,119,105,116,104,95,102,114,97, - 109,101,115,95,114,101,109,111,118,101,100,218,4,101,120,101, - 99,114,131,0,0,0,41,3,114,118,0,0,0,218,6,109, - 111,100,117,108,101,114,164,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,101,120,101,99,95, - 109,111,100,117,108,101,12,3,0,0,115,12,0,0,0,0, - 2,12,1,8,1,6,1,4,255,6,2,122,25,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, - 41,1,122,26,84,104,105,115,32,109,111,100,117,108,101,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,41,2, - 114,134,0,0,0,218,17,95,108,111,97,100,95,109,111,100, - 117,108,101,95,115,104,105,109,169,2,114,118,0,0,0,114, - 139,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, - 20,3,0,0,115,2,0,0,0,0,2,122,25,95,76,111, - 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, - 109,111,100,117,108,101,78,41,8,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,127,0,0,0,114,182,0, - 0,0,114,212,0,0,0,114,217,0,0,0,114,220,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,208,0,0,0,252,2,0,0,115,10, - 0,0,0,8,2,4,3,8,8,8,3,8,8,114,208,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,74,0,0,0, - 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, - 100,3,100,4,132,0,90,4,100,5,100,6,132,0,90,5, - 100,7,100,8,132,0,90,6,100,9,100,10,132,0,90,7, - 100,11,100,12,156,1,100,13,100,14,132,2,90,8,100,15, - 100,16,132,0,90,9,100,17,83,0,41,18,218,12,83,111, - 117,114,99,101,76,111,97,100,101,114,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,8,0,0,0,116,0,130,1,100,1,83,0, - 41,2,122,165,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,116,104,97,116,32,114,101,116,117,114,110,115, - 32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111, - 110,32,116,105,109,101,32,40,97,110,32,105,110,116,41,32, - 102,111,114,32,116,104,101,10,32,32,32,32,32,32,32,32, - 115,112,101,99,105,102,105,101,100,32,112,97,116,104,32,40, - 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, - 32,82,97,105,115,101,115,32,79,83,69,114,114,111,114,32, - 119,104,101,110,32,116,104,101,32,112,97,116,104,32,99,97, - 110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,46, - 10,32,32,32,32,32,32,32,32,78,41,1,114,49,0,0, - 0,169,2,114,118,0,0,0,114,43,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,10,112,97, - 116,104,95,109,116,105,109,101,27,3,0,0,115,2,0,0, - 0,0,6,122,23,83,111,117,114,99,101,76,111,97,100,101, - 114,46,112,97,116,104,95,109,116,105,109,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,14,0,0,0,100,1,124,0,160,0, - 124,1,161,1,105,1,83,0,41,2,97,158,1,0,0,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,114, - 101,116,117,114,110,105,110,103,32,97,32,109,101,116,97,100, - 97,116,97,32,100,105,99,116,32,102,111,114,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,10,32,32,32,32,32, - 32,32,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,80,111,115,115,105,98, - 108,101,32,107,101,121,115,58,10,32,32,32,32,32,32,32, - 32,45,32,39,109,116,105,109,101,39,32,40,109,97,110,100, - 97,116,111,114,121,41,32,105,115,32,116,104,101,32,110,117, - 109,101,114,105,99,32,116,105,109,101,115,116,97,109,112,32, - 111,102,32,108,97,115,116,32,115,111,117,114,99,101,10,32, - 32,32,32,32,32,32,32,32,32,99,111,100,101,32,109,111, - 100,105,102,105,99,97,116,105,111,110,59,10,32,32,32,32, - 32,32,32,32,45,32,39,115,105,122,101,39,32,40,111,112, - 116,105,111,110,97,108,41,32,105,115,32,116,104,101,32,115, - 105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,116,104,101,32,108,111, - 97,100,101,114,32,116,111,32,114,101,97,100,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, - 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, - 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, - 108,101,100,46,10,32,32,32,32,32,32,32,32,114,169,0, - 0,0,41,1,114,223,0,0,0,114,222,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,10,112, - 97,116,104,95,115,116,97,116,115,35,3,0,0,115,2,0, - 0,0,0,12,122,23,83,111,117,114,99,101,76,111,97,100, - 101,114,46,112,97,116,104,95,115,116,97,116,115,99,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,124, - 2,124,3,161,2,83,0,41,1,122,228,79,112,116,105,111, - 110,97,108,32,109,101,116,104,111,100,32,119,104,105,99,104, - 32,119,114,105,116,101,115,32,100,97,116,97,32,40,98,121, - 116,101,115,41,32,116,111,32,97,32,102,105,108,101,32,112, - 97,116,104,32,40,97,32,115,116,114,41,46,10,10,32,32, - 32,32,32,32,32,32,73,109,112,108,101,109,101,110,116,105, - 110,103,32,116,104,105,115,32,109,101,116,104,111,100,32,97, - 108,108,111,119,115,32,102,111,114,32,116,104,101,32,119,114, - 105,116,105,110,103,32,111,102,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,115,46,10,10,32,32,32,32,32,32, - 32,32,84,104,101,32,115,111,117,114,99,101,32,112,97,116, - 104,32,105,115,32,110,101,101,100,101,100,32,105,110,32,111, - 114,100,101,114,32,116,111,32,99,111,114,114,101,99,116,108, - 121,32,116,114,97,110,115,102,101,114,32,112,101,114,109,105, - 115,115,105,111,110,115,10,32,32,32,32,32,32,32,32,41, - 1,218,8,115,101,116,95,100,97,116,97,41,4,114,118,0, - 0,0,114,107,0,0,0,90,10,99,97,99,104,101,95,112, - 97,116,104,114,25,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,15,95,99,97,99,104,101,95, - 98,121,116,101,99,111,100,101,49,3,0,0,115,2,0,0, - 0,0,8,122,28,83,111,117,114,99,101,76,111,97,100,101, - 114,46,95,99,97,99,104,101,95,98,121,116,101,99,111,100, - 101,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,150,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, - 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, - 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, + 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103, + 105,115,116,114,121,78,99,4,0,0,0,0,0,0,0,0, + 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, + 120,0,0,0,124,0,160,0,124,1,161,1,125,4,124,4, + 100,0,117,0,114,22,100,0,83,0,122,12,116,1,124,4, + 131,1,1,0,87,0,110,20,4,0,116,2,121,54,1,0, + 1,0,1,0,89,0,100,0,83,0,48,0,116,3,131,0, + 68,0,93,52,92,2,125,5,125,6,124,4,160,4,116,5, + 124,6,131,1,161,1,114,62,116,6,106,7,124,1,124,5, + 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7, + 2,0,1,0,83,0,113,62,100,0,83,0,41,2,78,114, + 180,0,0,0,41,8,114,200,0,0,0,114,48,0,0,0, + 114,49,0,0,0,114,184,0,0,0,114,110,0,0,0,114, + 111,0,0,0,114,134,0,0,0,218,16,115,112,101,99,95, + 102,114,111,109,95,108,111,97,100,101,114,41,8,114,193,0, + 0,0,114,139,0,0,0,114,43,0,0,0,218,6,116,97, + 114,103,101,116,114,199,0,0,0,114,140,0,0,0,114,189, + 0,0,0,114,187,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,9,102,105,110,100,95,115,112, + 101,99,223,2,0,0,115,28,0,0,0,0,2,10,1,8, + 1,4,1,2,1,12,1,12,1,8,1,14,1,14,1,6, + 1,8,1,2,254,6,3,122,31,87,105,110,100,111,119,115, + 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, + 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,34,0,0,0,124,0,160,0,124,1,124,2,161,2, + 125,3,124,3,100,1,117,1,114,26,124,3,106,1,83,0, + 100,1,83,0,100,1,83,0,41,2,122,108,70,105,110,100, + 32,109,111,100,117,108,101,32,110,97,109,101,100,32,105,110, + 32,116,104,101,32,114,101,103,105,115,116,114,121,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,169,2,114,203,0,0,0, + 114,140,0,0,0,169,4,114,193,0,0,0,114,139,0,0, + 0,114,43,0,0,0,114,187,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,11,102,105,110,100, + 95,109,111,100,117,108,101,239,2,0,0,115,8,0,0,0, + 0,7,12,1,8,1,6,2,122,33,87,105,110,100,111,119, + 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, + 102,105,110,100,95,109,111,100,117,108,101,41,2,78,78,41, + 1,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,197,0,0,0,114,196,0, + 0,0,114,195,0,0,0,218,11,99,108,97,115,115,109,101, + 116,104,111,100,114,194,0,0,0,114,200,0,0,0,114,203, + 0,0,0,114,206,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,191,0,0, + 0,189,2,0,0,115,28,0,0,0,8,2,4,3,2,255, + 2,4,2,255,2,3,4,2,2,1,10,6,2,1,10,14, + 2,1,12,15,2,1,114,191,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 64,0,0,0,115,48,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, + 9,132,0,90,7,100,10,83,0,41,11,218,13,95,76,111, + 97,100,101,114,66,97,115,105,99,115,122,83,66,97,115,101, + 32,99,108,97,115,115,32,111,102,32,99,111,109,109,111,110, + 32,99,111,100,101,32,110,101,101,100,101,100,32,98,121,32, + 98,111,116,104,32,83,111,117,114,99,101,76,111,97,100,101, + 114,32,97,110,100,10,32,32,32,32,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,124, + 0,160,1,124,1,161,1,131,1,100,1,25,0,125,2,124, + 2,160,2,100,2,100,1,161,2,100,3,25,0,125,3,124, + 1,160,3,100,2,161,1,100,4,25,0,125,4,124,3,100, + 5,107,2,111,62,124,4,100,5,107,3,83,0,41,6,122, + 141,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,112, + 101,99,116,76,111,97,100,101,114,46,105,115,95,112,97,99, + 107,97,103,101,32,98,121,32,99,104,101,99,107,105,110,103, + 32,105,102,10,32,32,32,32,32,32,32,32,116,104,101,32, + 112,97,116,104,32,114,101,116,117,114,110,101,100,32,98,121, + 32,103,101,116,95,102,105,108,101,110,97,109,101,32,104,97, + 115,32,97,32,102,105,108,101,110,97,109,101,32,111,102,32, + 39,95,95,105,110,105,116,95,95,46,112,121,39,46,114,38, + 0,0,0,114,70,0,0,0,114,72,0,0,0,114,27,0, + 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,46, + 0,0,0,114,179,0,0,0,114,42,0,0,0,114,40,0, + 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,96, + 0,0,0,90,13,102,105,108,101,110,97,109,101,95,98,97, + 115,101,90,9,116,97,105,108,95,110,97,109,101,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, + 0,2,3,0,0,115,8,0,0,0,0,3,18,1,16,1, + 14,1,122,24,95,76,111,97,100,101,114,66,97,115,105,99, + 115,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,169,2, + 122,42,85,115,101,32,100,101,102,97,117,108,116,32,115,101, + 109,97,110,116,105,99,115,32,102,111,114,32,109,111,100,117, + 108,101,32,99,114,101,97,116,105,111,110,46,78,114,3,0, + 0,0,169,2,114,118,0,0,0,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,99, + 114,101,97,116,101,95,109,111,100,117,108,101,10,3,0,0, + 115,2,0,0,0,0,1,122,27,95,76,111,97,100,101,114, + 66,97,115,105,99,115,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,56,0, + 0,0,124,0,160,0,124,1,106,1,161,1,125,2,124,2, + 100,1,117,0,114,36,116,2,100,2,160,3,124,1,106,1, + 161,1,131,1,130,1,116,4,160,5,116,6,124,2,124,1, + 106,7,161,3,1,0,100,1,83,0,41,3,122,19,69,120, + 101,99,117,116,101,32,116,104,101,32,109,111,100,117,108,101, + 46,78,122,52,99,97,110,110,111,116,32,108,111,97,100,32, + 109,111,100,117,108,101,32,123,33,114,125,32,119,104,101,110, + 32,103,101,116,95,99,111,100,101,40,41,32,114,101,116,117, + 114,110,115,32,78,111,110,101,41,8,218,8,103,101,116,95, + 99,111,100,101,114,125,0,0,0,114,117,0,0,0,114,61, + 0,0,0,114,134,0,0,0,218,25,95,99,97,108,108,95, + 119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111, + 118,101,100,218,4,101,120,101,99,114,131,0,0,0,41,3, + 114,118,0,0,0,218,6,109,111,100,117,108,101,114,164,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,11,101,120,101,99,95,109,111,100,117,108,101,13,3, + 0,0,115,12,0,0,0,0,2,12,1,8,1,6,1,4, + 255,6,2,122,25,95,76,111,97,100,101,114,66,97,115,105, + 99,115,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,12,0,0,0,116,0,160,1, + 124,0,124,1,161,2,83,0,41,1,122,26,84,104,105,115, + 32,109,111,100,117,108,101,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,41,2,114,134,0,0,0,218,17,95, + 108,111,97,100,95,109,111,100,117,108,101,95,115,104,105,109, + 169,2,114,118,0,0,0,114,139,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,108,111,97, + 100,95,109,111,100,117,108,101,21,3,0,0,115,2,0,0, + 0,0,2,122,25,95,76,111,97,100,101,114,66,97,115,105, + 99,115,46,108,111,97,100,95,109,111,100,117,108,101,78,41, + 8,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,182,0,0,0,114,212,0,0,0,114, + 217,0,0,0,114,220,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,208,0, + 0,0,253,2,0,0,115,10,0,0,0,8,2,4,3,8, + 8,8,3,8,8,114,208,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, + 0,0,0,115,74,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, + 100,5,100,6,132,0,90,5,100,7,100,8,132,0,90,6, + 100,9,100,10,132,0,90,7,100,11,100,12,156,1,100,13, + 100,14,132,2,90,8,100,15,100,16,132,0,90,9,100,17, + 83,0,41,18,218,12,83,111,117,114,99,101,76,111,97,100, + 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,8,0,0,0, + 116,0,130,1,100,1,83,0,41,2,122,165,79,112,116,105, + 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, + 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, + 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, + 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, + 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, + 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, + 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, + 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, + 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, + 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, + 32,78,41,1,114,49,0,0,0,169,2,114,118,0,0,0, + 114,43,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, + 28,3,0,0,115,2,0,0,0,0,6,122,23,83,111,117, + 114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,109, + 116,105,109,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,14,0, + 0,0,100,1,124,0,160,0,124,1,161,1,105,1,83,0, + 41,2,97,158,1,0,0,79,112,116,105,111,110,97,108,32, + 109,101,116,104,111,100,32,114,101,116,117,114,110,105,110,103, + 32,97,32,109,101,116,97,100,97,116,97,32,100,105,99,116, + 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, + 101,100,10,32,32,32,32,32,32,32,32,112,97,116,104,32, 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, + 32,32,80,111,115,115,105,98,108,101,32,107,101,121,115,58, + 10,32,32,32,32,32,32,32,32,45,32,39,109,116,105,109, + 101,39,32,40,109,97,110,100,97,116,111,114,121,41,32,105, + 115,32,116,104,101,32,110,117,109,101,114,105,99,32,116,105, + 109,101,115,116,97,109,112,32,111,102,32,108,97,115,116,32, + 115,111,117,114,99,101,10,32,32,32,32,32,32,32,32,32, + 32,99,111,100,101,32,109,111,100,105,102,105,99,97,116,105, + 111,110,59,10,32,32,32,32,32,32,32,32,45,32,39,115, + 105,122,101,39,32,40,111,112,116,105,111,110,97,108,41,32, + 105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98, + 121,116,101,115,32,111,102,32,116,104,101,32,115,111,117,114, + 99,101,32,99,111,100,101,46,10,10,32,32,32,32,32,32, 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, - 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,3, - 0,0,0,41,3,114,118,0,0,0,114,43,0,0,0,114, - 25,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,225,0,0,0,59,3,0,0,115,2,0,0, - 0,0,1,122,21,83,111,117,114,99,101,76,111,97,100,101, - 114,46,115,101,116,95,100,97,116,97,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,10,0,0,0,67, - 0,0,0,115,86,0,0,0,124,0,160,0,124,1,161,1, - 125,2,122,14,124,0,160,1,124,2,161,1,125,3,87,0, - 110,52,4,0,116,2,107,10,114,76,1,0,125,4,1,0, - 122,26,116,3,100,1,124,1,100,2,141,2,124,4,130,2, - 87,0,89,0,100,3,125,4,126,4,110,10,100,3,125,4, - 126,4,48,0,48,0,116,4,124,3,131,1,83,0,41,4, - 122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, - 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, - 111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,110, - 111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,114, - 111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,114, - 115,0,0,0,78,41,5,114,179,0,0,0,218,8,103,101, - 116,95,100,97,116,97,114,49,0,0,0,114,117,0,0,0, - 114,176,0,0,0,41,5,114,118,0,0,0,114,139,0,0, - 0,114,43,0,0,0,114,174,0,0,0,218,3,101,120,99, + 115,32,116,104,101,32,108,111,97,100,101,114,32,116,111,32, + 114,101,97,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,115,46,10,32,32,32,32,32,32,32,32,82,97,105, + 115,101,115,32,79,83,69,114,114,111,114,32,119,104,101,110, + 32,116,104,101,32,112,97,116,104,32,99,97,110,110,111,116, + 32,98,101,32,104,97,110,100,108,101,100,46,10,32,32,32, + 32,32,32,32,32,114,169,0,0,0,41,1,114,223,0,0, + 0,114,222,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,10,112,97,116,104,95,115,116,97,116, + 115,36,3,0,0,115,2,0,0,0,0,12,122,23,83,111, + 117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,95, + 115,116,97,116,115,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,12, + 0,0,0,124,0,160,0,124,2,124,3,161,2,83,0,41, + 1,122,228,79,112,116,105,111,110,97,108,32,109,101,116,104, + 111,100,32,119,104,105,99,104,32,119,114,105,116,101,115,32, + 100,97,116,97,32,40,98,121,116,101,115,41,32,116,111,32, + 97,32,102,105,108,101,32,112,97,116,104,32,40,97,32,115, + 116,114,41,46,10,10,32,32,32,32,32,32,32,32,73,109, + 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32, + 109,101,116,104,111,100,32,97,108,108,111,119,115,32,102,111, + 114,32,116,104,101,32,119,114,105,116,105,110,103,32,111,102, + 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,111, + 117,114,99,101,32,112,97,116,104,32,105,115,32,110,101,101, + 100,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32, + 99,111,114,114,101,99,116,108,121,32,116,114,97,110,115,102, + 101,114,32,112,101,114,109,105,115,115,105,111,110,115,10,32, + 32,32,32,32,32,32,32,41,1,218,8,115,101,116,95,100, + 97,116,97,41,4,114,118,0,0,0,114,107,0,0,0,90, + 10,99,97,99,104,101,95,112,97,116,104,114,25,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,66,3,0,0,115, - 20,0,0,0,0,2,10,1,2,1,14,1,16,1,4,1, - 2,255,4,1,2,255,24,2,122,23,83,111,117,114,99,101, - 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, - 101,114,104,0,0,0,41,1,218,9,95,111,112,116,105,109, - 105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,0, - 0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,124, - 3,100,3,141,6,83,0,41,4,122,130,82,101,116,117,114, - 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, - 116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,32, - 115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,117, - 109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,32, - 111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,116, - 32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,111, - 114,116,115,46,10,32,32,32,32,32,32,32,32,114,215,0, - 0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,101, - 114,105,116,114,83,0,0,0,41,3,114,134,0,0,0,114, - 214,0,0,0,218,7,99,111,109,112,105,108,101,41,4,114, - 118,0,0,0,114,25,0,0,0,114,43,0,0,0,114,230, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,111, - 100,101,76,3,0,0,115,8,0,0,0,0,5,12,1,2, - 0,2,255,122,27,83,111,117,114,99,101,76,111,97,100,101, - 114,46,115,111,117,114,99,101,95,116,111,95,99,111,100,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,15,0,0, - 0,9,0,0,0,67,0,0,0,115,34,2,0,0,124,0, - 160,0,124,1,161,1,125,2,100,1,125,3,100,1,125,4, - 100,1,125,5,100,2,125,6,100,3,125,7,122,12,116,1, - 124,2,131,1,125,8,87,0,110,26,4,0,116,2,107,10, - 114,68,1,0,1,0,1,0,100,1,125,8,89,0,144,1, - 110,48,48,0,122,14,124,0,160,3,124,2,161,1,125,9, - 87,0,110,22,4,0,116,4,107,10,114,106,1,0,1,0, - 1,0,89,0,144,1,110,10,48,0,116,5,124,9,100,4, - 25,0,131,1,125,3,122,14,124,0,160,6,124,8,161,1, - 125,10,87,0,110,20,4,0,116,4,107,10,114,154,1,0, - 1,0,1,0,89,0,110,218,48,0,124,1,124,8,100,5, + 15,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, + 50,3,0,0,115,2,0,0,0,0,8,122,28,83,111,117, + 114,99,101,76,111,97,100,101,114,46,95,99,97,99,104,101, + 95,98,121,116,101,99,111,100,101,99,3,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, + 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, + 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, + 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, + 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, + 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, + 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, + 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, + 32,32,32,32,32,78,114,3,0,0,0,41,3,114,118,0, + 0,0,114,43,0,0,0,114,25,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,0, + 60,3,0,0,115,2,0,0,0,0,1,122,21,83,111,117, + 114,99,101,76,111,97,100,101,114,46,115,101,116,95,100,97, + 116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,10,0,0,0,67,0,0,0,115,84,0,0,0, + 124,0,160,0,124,1,161,1,125,2,122,14,124,0,160,1, + 124,2,161,1,125,3,87,0,110,50,4,0,116,2,121,74, + 1,0,125,4,1,0,122,26,116,3,100,1,124,1,100,2, + 141,2,124,4,130,2,87,0,89,0,100,3,125,4,126,4, + 110,10,100,3,125,4,126,4,48,0,48,0,116,4,124,3, + 131,1,83,0,41,4,122,52,67,111,110,99,114,101,116,101, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 111,102,32,73,110,115,112,101,99,116,76,111,97,100,101,114, + 46,103,101,116,95,115,111,117,114,99,101,46,122,39,115,111, + 117,114,99,101,32,110,111,116,32,97,118,97,105,108,97,98, + 108,101,32,116,104,114,111,117,103,104,32,103,101,116,95,100, + 97,116,97,40,41,114,115,0,0,0,78,41,5,114,179,0, + 0,0,218,8,103,101,116,95,100,97,116,97,114,49,0,0, + 0,114,117,0,0,0,114,176,0,0,0,41,5,114,118,0, + 0,0,114,139,0,0,0,114,43,0,0,0,114,174,0,0, + 0,218,3,101,120,99,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, + 101,67,3,0,0,115,20,0,0,0,0,2,10,1,2,1, + 14,1,14,1,4,1,2,255,4,1,2,255,24,2,122,23, + 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, + 95,115,111,117,114,99,101,114,104,0,0,0,41,1,218,9, + 95,111,112,116,105,109,105,122,101,99,3,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,8,0,0,0,67,0, + 0,0,115,22,0,0,0,116,0,106,1,116,2,124,1,124, + 2,100,1,100,2,124,3,100,3,141,6,83,0,41,4,122, + 130,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, + 32,111,98,106,101,99,116,32,99,111,109,112,105,108,101,100, + 32,102,114,111,109,32,115,111,117,114,99,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,39,100,97,116,97, + 39,32,97,114,103,117,109,101,110,116,32,99,97,110,32,98, + 101,32,97,110,121,32,111,98,106,101,99,116,32,116,121,112, + 101,32,116,104,97,116,32,99,111,109,112,105,108,101,40,41, + 32,115,117,112,112,111,114,116,115,46,10,32,32,32,32,32, + 32,32,32,114,215,0,0,0,84,41,2,218,12,100,111,110, + 116,95,105,110,104,101,114,105,116,114,83,0,0,0,41,3, + 114,134,0,0,0,114,214,0,0,0,218,7,99,111,109,112, + 105,108,101,41,4,114,118,0,0,0,114,25,0,0,0,114, + 43,0,0,0,114,230,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,14,115,111,117,114,99,101, + 95,116,111,95,99,111,100,101,77,3,0,0,115,8,0,0, + 0,0,5,12,1,2,0,2,255,122,27,83,111,117,114,99, + 101,76,111,97,100,101,114,46,115,111,117,114,99,101,95,116, + 111,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,15,0,0,0,9,0,0,0,67,0,0,0,115, + 24,2,0,0,124,0,160,0,124,1,161,1,125,2,100,1, + 125,3,100,1,125,4,100,1,125,5,100,2,125,6,100,3, + 125,7,122,12,116,1,124,2,131,1,125,8,87,0,110,24, + 4,0,116,2,121,66,1,0,1,0,1,0,100,1,125,8, + 89,0,144,1,110,42,48,0,122,14,124,0,160,3,124,2, + 161,1,125,9,87,0,110,20,4,0,116,4,121,102,1,0, + 1,0,1,0,89,0,144,1,110,6,48,0,116,5,124,9, + 100,4,25,0,131,1,125,3,122,14,124,0,160,6,124,8, + 161,1,125,10,87,0,110,18,4,0,116,4,121,148,1,0, + 1,0,1,0,89,0,110,216,48,0,124,1,124,8,100,5, 156,2,125,11,122,148,116,7,124,10,124,1,124,11,131,3, 125,12,116,8,124,10,131,1,100,6,100,1,133,2,25,0, 125,13,124,12,100,7,64,0,100,8,107,3,125,6,124,6, - 144,1,114,36,124,12,100,9,64,0,100,8,107,3,125,7, - 116,9,106,10,100,10,107,3,144,1,114,56,124,7,115,254, - 116,9,106,10,100,11,107,2,144,1,114,56,124,0,160,6, + 144,1,114,30,124,12,100,9,64,0,100,8,107,3,125,7, + 116,9,106,10,100,10,107,3,144,1,114,50,124,7,115,248, + 116,9,106,10,100,11,107,2,144,1,114,50,124,0,160,6, 124,2,161,1,125,4,116,9,160,11,116,12,124,4,161,2, 125,5,116,13,124,10,124,5,124,1,124,11,131,4,1,0, 110,20,116,14,124,10,124,3,124,9,100,12,25,0,124,1, - 124,11,131,5,1,0,87,0,110,26,4,0,116,15,116,16, - 102,2,107,10,144,1,114,84,1,0,1,0,1,0,89,0, - 110,32,48,0,116,17,160,18,100,13,124,8,124,2,161,3, - 1,0,116,19,124,13,124,1,124,8,124,2,100,14,141,4, - 83,0,124,4,100,1,107,8,144,1,114,136,124,0,160,6, - 124,2,161,1,125,4,124,0,160,20,124,4,124,2,161,2, - 125,14,116,17,160,18,100,15,124,2,161,2,1,0,116,21, - 106,22,144,2,115,30,124,8,100,1,107,9,144,2,114,30, - 124,3,100,1,107,9,144,2,114,30,124,6,144,1,114,228, - 124,5,100,1,107,8,144,1,114,214,116,9,160,11,124,4, - 161,1,125,5,116,23,124,14,124,5,124,7,131,3,125,10, - 110,16,116,24,124,14,124,3,116,25,124,4,131,1,131,3, - 125,10,122,18,124,0,160,26,124,2,124,8,124,10,161,3, - 1,0,87,0,110,22,4,0,116,2,107,10,144,2,114,28, - 1,0,1,0,1,0,89,0,110,2,48,0,124,14,83,0, - 41,16,122,190,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, - 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, - 95,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, - 82,101,97,100,105,110,103,32,111,102,32,98,121,116,101,99, - 111,100,101,32,114,101,113,117,105,114,101,115,32,112,97,116, - 104,95,115,116,97,116,115,32,116,111,32,98,101,32,105,109, - 112,108,101,109,101,110,116,101,100,46,32,84,111,32,119,114, - 105,116,101,10,32,32,32,32,32,32,32,32,98,121,116,101, - 99,111,100,101,44,32,115,101,116,95,100,97,116,97,32,109, - 117,115,116,32,97,108,115,111,32,98,101,32,105,109,112,108, - 101,109,101,110,116,101,100,46,10,10,32,32,32,32,32,32, - 32,32,78,70,84,114,169,0,0,0,114,159,0,0,0,114, - 145,0,0,0,114,38,0,0,0,114,72,0,0,0,114,27, - 0,0,0,90,5,110,101,118,101,114,90,6,97,108,119,97, - 121,115,218,4,115,105,122,101,122,13,123,125,32,109,97,116, - 99,104,101,115,32,123,125,41,3,114,116,0,0,0,114,106, - 0,0,0,114,107,0,0,0,122,19,99,111,100,101,32,111, - 98,106,101,99,116,32,102,114,111,109,32,123,125,41,27,114, - 179,0,0,0,114,97,0,0,0,114,81,0,0,0,114,224, - 0,0,0,114,49,0,0,0,114,17,0,0,0,114,227,0, - 0,0,114,152,0,0,0,218,10,109,101,109,111,114,121,118, - 105,101,119,114,163,0,0,0,90,21,99,104,101,99,107,95, - 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,114, - 157,0,0,0,218,17,95,82,65,87,95,77,65,71,73,67, - 95,78,85,77,66,69,82,114,158,0,0,0,114,156,0,0, - 0,114,117,0,0,0,114,150,0,0,0,114,134,0,0,0, - 114,149,0,0,0,114,165,0,0,0,114,233,0,0,0,114, - 8,0,0,0,218,19,100,111,110,116,95,119,114,105,116,101, - 95,98,121,116,101,99,111,100,101,114,171,0,0,0,114,170, - 0,0,0,114,22,0,0,0,114,226,0,0,0,41,15,114, - 118,0,0,0,114,139,0,0,0,114,107,0,0,0,114,154, - 0,0,0,114,174,0,0,0,114,157,0,0,0,90,10,104, - 97,115,104,95,98,97,115,101,100,90,12,99,104,101,99,107, - 95,115,111,117,114,99,101,114,106,0,0,0,218,2,115,116, - 114,25,0,0,0,114,151,0,0,0,114,82,0,0,0,90, - 10,98,121,116,101,115,95,100,97,116,97,90,11,99,111,100, - 101,95,111,98,106,101,99,116,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,84,3,0,0, - 115,152,0,0,0,0,7,10,1,4,1,4,1,4,1,4, - 1,4,1,2,1,12,1,14,1,12,2,2,1,14,1,14, - 1,8,2,12,1,2,1,14,1,14,1,6,3,2,1,2, - 254,6,4,2,1,12,1,16,1,12,1,6,1,12,1,12, - 1,2,255,2,2,8,254,4,3,10,1,4,1,2,1,2, - 254,4,4,8,1,2,255,6,3,2,1,2,1,2,1,6, - 1,2,1,2,251,8,7,20,1,6,2,8,1,2,255,4, - 2,6,1,2,1,2,254,6,3,10,1,10,1,12,1,12, - 1,18,1,6,255,4,2,6,1,10,1,10,1,14,2,6, - 1,6,255,4,2,2,1,18,1,16,1,6,1,122,21,83, - 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,78,41,10,114,125,0,0,0,114,124,0,0, - 0,114,126,0,0,0,114,223,0,0,0,114,224,0,0,0, - 114,226,0,0,0,114,225,0,0,0,114,229,0,0,0,114, - 233,0,0,0,114,213,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,221,0, - 0,0,25,3,0,0,115,14,0,0,0,8,2,8,8,8, - 14,8,10,8,7,8,10,14,8,114,221,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,0,0,0,0,115,124,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, - 101,7,135,0,102,1,100,8,100,9,132,8,131,1,90,8, - 101,7,100,10,100,11,132,0,131,1,90,9,100,12,100,13, - 132,0,90,10,101,7,100,14,100,15,132,0,131,1,90,11, - 100,16,100,17,132,0,90,12,100,18,100,19,132,0,90,13, - 100,20,100,21,132,0,90,14,100,22,100,23,132,0,90,15, - 135,0,4,0,90,16,83,0,41,24,218,10,70,105,108,101, - 76,111,97,100,101,114,122,103,66,97,115,101,32,102,105,108, - 101,32,108,111,97,100,101,114,32,99,108,97,115,115,32,119, - 104,105,99,104,32,105,109,112,108,101,109,101,110,116,115,32, - 116,104,101,32,108,111,97,100,101,114,32,112,114,111,116,111, - 99,111,108,32,109,101,116,104,111,100,115,32,116,104,97,116, - 10,32,32,32,32,114,101,113,117,105,114,101,32,102,105,108, - 101,32,115,121,115,116,101,109,32,117,115,97,103,101,46,99, - 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 2,0,0,0,67,0,0,0,115,16,0,0,0,124,1,124, - 0,95,0,124,2,124,0,95,1,100,1,83,0,41,2,122, - 75,67,97,99,104,101,32,116,104,101,32,109,111,100,117,108, - 101,32,110,97,109,101,32,97,110,100,32,116,104,101,32,112, - 97,116,104,32,116,111,32,116,104,101,32,102,105,108,101,32, - 102,111,117,110,100,32,98,121,32,116,104,101,10,32,32,32, - 32,32,32,32,32,102,105,110,100,101,114,46,78,114,159,0, - 0,0,41,3,114,118,0,0,0,114,139,0,0,0,114,43, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,174,3,0,0,115,4,0,0,0, - 0,3,6,1,122,19,70,105,108,101,76,111,97,100,101,114, - 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, - 0,0,115,24,0,0,0,124,0,106,0,124,1,106,0,107, - 2,111,22,124,0,106,1,124,1,106,1,107,2,83,0,114, - 109,0,0,0,169,2,218,9,95,95,99,108,97,115,115,95, - 95,114,131,0,0,0,169,2,114,118,0,0,0,90,5,111, - 116,104,101,114,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,6,95,95,101,113,95,95,180,3,0,0,115, - 6,0,0,0,0,1,12,1,10,255,122,17,70,105,108,101, - 76,111,97,100,101,114,46,95,95,101,113,95,95,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,106, - 1,131,1,116,0,124,0,106,2,131,1,65,0,83,0,114, - 109,0,0,0,169,3,218,4,104,97,115,104,114,116,0,0, - 0,114,43,0,0,0,169,1,114,118,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,95, - 104,97,115,104,95,95,184,3,0,0,115,2,0,0,0,0, - 1,122,19,70,105,108,101,76,111,97,100,101,114,46,95,95, - 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, - 16,0,0,0,116,0,116,1,124,0,131,2,160,2,124,1, - 161,1,83,0,41,1,122,100,76,111,97,100,32,97,32,109, - 111,100,117,108,101,32,102,114,111,109,32,97,32,102,105,108, - 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, - 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, - 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, - 100,46,10,10,32,32,32,32,32,32,32,32,41,3,218,5, - 115,117,112,101,114,114,239,0,0,0,114,220,0,0,0,114, - 219,0,0,0,169,1,114,241,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,220,0,0,0,187,3,0,0,115,2, - 0,0,0,0,10,122,22,70,105,108,101,76,111,97,100,101, - 114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, - 0,169,1,122,58,82,101,116,117,114,110,32,116,104,101,32, - 112,97,116,104,32,116,111,32,116,104,101,32,115,111,117,114, - 99,101,32,102,105,108,101,32,97,115,32,102,111,117,110,100, - 32,98,121,32,116,104,101,32,102,105,110,100,101,114,46,114, - 47,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,179,0,0,0,199,3,0, - 0,115,2,0,0,0,0,3,122,23,70,105,108,101,76,111, - 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,126,0,0,0,116, - 0,124,0,116,1,116,2,102,2,131,2,114,70,116,3,160, - 4,116,5,124,1,131,1,161,1,143,24,125,2,124,2,160, - 6,161,0,87,0,2,0,100,1,4,0,4,0,131,3,1, - 0,83,0,49,0,115,58,48,0,1,0,1,0,1,0,89, - 0,1,0,110,52,116,3,160,7,124,1,100,2,161,2,143, - 24,125,2,124,2,160,6,161,0,87,0,2,0,100,1,4, - 0,4,0,131,3,1,0,83,0,49,0,115,112,48,0,1, - 0,1,0,1,0,89,0,1,0,100,1,83,0,41,3,122, - 39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97, - 32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,97, - 119,32,98,121,116,101,115,46,78,218,1,114,41,8,114,161, - 0,0,0,114,221,0,0,0,218,19,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,114,63,0, - 0,0,90,9,111,112,101,110,95,99,111,100,101,114,84,0, - 0,0,90,4,114,101,97,100,114,64,0,0,0,41,3,114, - 118,0,0,0,114,43,0,0,0,114,67,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,227,0, - 0,0,204,3,0,0,115,10,0,0,0,0,2,14,1,16, - 1,40,2,14,1,122,19,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,100,97,116,97,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,18,0,0,0,124,0,160,0,124,1,161,1, - 114,14,124,0,83,0,100,0,83,0,114,109,0,0,0,41, - 1,114,182,0,0,0,169,2,114,118,0,0,0,114,216,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,215,3,0,0,115,6,0,0,0,0, - 2,10,1,4,1,122,30,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,114,101,115,111,117,114,99,101,95,114, - 101,97,100,101,114,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,32, - 0,0,0,116,0,116,1,124,0,106,2,131,1,100,1,25, - 0,124,1,131,2,125,2,116,3,160,4,124,2,100,2,161, - 2,83,0,41,3,78,114,72,0,0,0,114,251,0,0,0, - 41,5,114,37,0,0,0,114,46,0,0,0,114,43,0,0, - 0,114,63,0,0,0,114,64,0,0,0,169,3,114,118,0, - 0,0,90,8,114,101,115,111,117,114,99,101,114,43,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,221, - 3,0,0,115,4,0,0,0,0,1,20,1,122,24,70,105, - 108,101,76,111,97,100,101,114,46,111,112,101,110,95,114,101, - 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,124,0,160,0,124,1,161,1,115,14,116,1, - 130,1,116,2,116,3,124,0,106,4,131,1,100,1,25,0, - 124,1,131,2,125,2,124,2,83,0,169,2,78,114,72,0, - 0,0,41,5,218,11,105,115,95,114,101,115,111,117,114,99, - 101,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, - 114,114,111,114,114,37,0,0,0,114,46,0,0,0,114,43, - 0,0,0,114,255,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,13,114,101,115,111,117,114,99, - 101,95,112,97,116,104,225,3,0,0,115,8,0,0,0,0, - 1,10,1,4,1,20,1,122,24,70,105,108,101,76,111,97, - 100,101,114,46,114,101,115,111,117,114,99,101,95,112,97,116, - 104,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,67,0,0,0,115,40,0,0,0,116, - 0,124,1,107,6,114,12,100,1,83,0,116,1,116,2,124, - 0,106,3,131,1,100,2,25,0,124,1,131,2,125,2,116, - 4,124,2,131,1,83,0,41,3,78,70,114,72,0,0,0, - 41,5,114,34,0,0,0,114,37,0,0,0,114,46,0,0, - 0,114,43,0,0,0,114,53,0,0,0,169,3,114,118,0, - 0,0,114,116,0,0,0,114,43,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,2,1,0,0, - 231,3,0,0,115,8,0,0,0,0,1,8,1,4,1,20, - 1,122,22,70,105,108,101,76,111,97,100,101,114,46,105,115, - 95,114,101,115,111,117,114,99,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,5,0,0,0,67,0, - 0,0,115,24,0,0,0,116,0,116,1,160,2,116,3,124, - 0,106,4,131,1,100,1,25,0,161,1,131,1,83,0,114, - 1,1,0,0,41,5,218,4,105,116,101,114,114,2,0,0, - 0,218,7,108,105,115,116,100,105,114,114,46,0,0,0,114, - 43,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,99,111,110,116,101,110, - 116,115,237,3,0,0,115,2,0,0,0,0,1,122,19,70, - 105,108,101,76,111,97,100,101,114,46,99,111,110,116,101,110, - 116,115,41,17,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, - 0,0,114,247,0,0,0,114,136,0,0,0,114,220,0,0, - 0,114,179,0,0,0,114,227,0,0,0,114,254,0,0,0, - 114,0,1,0,0,114,4,1,0,0,114,2,1,0,0,114, - 8,1,0,0,90,13,95,95,99,108,97,115,115,99,101,108, - 108,95,95,114,3,0,0,0,114,3,0,0,0,114,249,0, - 0,0,114,6,0,0,0,114,239,0,0,0,169,3,0,0, - 115,30,0,0,0,8,2,4,3,8,6,8,4,8,3,2, - 1,14,11,2,1,10,4,8,11,2,1,10,5,8,4,8, - 6,8,6,114,239,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,46,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,156,1,100,8,100,9,132,2,90,6, - 100,10,83,0,41,11,218,16,83,111,117,114,99,101,70,105, - 108,101,76,111,97,100,101,114,122,62,67,111,110,99,114,101, - 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,32,111,102,32,83,111,117,114,99,101,76,111,97,100,101, - 114,32,117,115,105,110,103,32,116,104,101,32,102,105,108,101, - 32,115,121,115,116,101,109,46,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,22,0,0,0,116,0,124,1,131,1,125,2,124,2, - 106,1,124,2,106,2,100,1,156,2,83,0,41,2,122,33, - 82,101,116,117,114,110,32,116,104,101,32,109,101,116,97,100, - 97,116,97,32,102,111,114,32,116,104,101,32,112,97,116,104, - 46,41,2,114,169,0,0,0,114,234,0,0,0,41,3,114, - 48,0,0,0,218,8,115,116,95,109,116,105,109,101,90,7, - 115,116,95,115,105,122,101,41,3,114,118,0,0,0,114,43, - 0,0,0,114,238,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,224,0,0,0,245,3,0,0, - 115,4,0,0,0,0,2,8,1,122,27,83,111,117,114,99, - 101,70,105,108,101,76,111,97,100,101,114,46,112,97,116,104, - 95,115,116,97,116,115,99,4,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 24,0,0,0,116,0,124,1,131,1,125,4,124,0,106,1, - 124,2,124,3,124,4,100,1,141,3,83,0,41,2,78,169, - 1,218,5,95,109,111,100,101,41,2,114,114,0,0,0,114, - 225,0,0,0,41,5,114,118,0,0,0,114,107,0,0,0, - 114,106,0,0,0,114,25,0,0,0,114,51,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,226, - 0,0,0,250,3,0,0,115,4,0,0,0,0,2,8,1, - 122,32,83,111,117,114,99,101,70,105,108,101,76,111,97,100, - 101,114,46,95,99,97,99,104,101,95,98,121,116,101,99,111, - 100,101,114,59,0,0,0,114,11,1,0,0,99,3,0,0, - 0,0,0,0,0,1,0,0,0,9,0,0,0,11,0,0, - 0,67,0,0,0,115,2,1,0,0,116,0,124,1,131,1, - 92,2,125,4,125,5,103,0,125,6,124,4,114,52,116,1, - 124,4,131,1,115,52,116,0,124,4,131,1,92,2,125,4, - 125,7,124,6,160,2,124,7,161,1,1,0,113,16,116,3, - 124,6,131,1,68,0,93,108,125,7,116,4,124,4,124,7, - 131,2,125,4,122,14,116,5,160,6,124,4,161,1,1,0, - 87,0,113,60,4,0,116,7,107,10,114,112,1,0,1,0, - 1,0,89,0,113,60,89,0,113,60,4,0,116,8,107,10, - 114,166,1,0,125,8,1,0,122,30,116,9,160,10,100,1, - 124,4,124,8,161,3,1,0,87,0,89,0,100,2,125,8, - 126,8,1,0,100,2,83,0,100,2,125,8,126,8,48,0, - 48,0,113,60,122,28,116,11,124,1,124,2,124,3,131,3, - 1,0,116,9,160,10,100,3,124,1,161,2,1,0,87,0, - 110,54,4,0,116,8,107,10,144,0,114,252,1,0,125,8, - 1,0,122,26,116,9,160,10,100,1,124,1,124,8,161,3, - 1,0,87,0,89,0,100,2,125,8,126,8,110,10,100,2, - 125,8,126,8,48,0,48,0,100,2,83,0,41,4,122,27, - 87,114,105,116,101,32,98,121,116,101,115,32,100,97,116,97, - 32,116,111,32,97,32,102,105,108,101,46,122,27,99,111,117, - 108,100,32,110,111,116,32,99,114,101,97,116,101,32,123,33, - 114,125,58,32,123,33,114,125,78,122,12,99,114,101,97,116, - 101,100,32,123,33,114,125,41,12,114,46,0,0,0,114,55, - 0,0,0,114,186,0,0,0,114,41,0,0,0,114,37,0, - 0,0,114,2,0,0,0,90,5,109,107,100,105,114,218,15, - 70,105,108,101,69,120,105,115,116,115,69,114,114,111,114,114, - 49,0,0,0,114,134,0,0,0,114,149,0,0,0,114,68, - 0,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, - 25,0,0,0,114,12,1,0,0,218,6,112,97,114,101,110, - 116,114,96,0,0,0,114,36,0,0,0,114,32,0,0,0, - 114,228,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,225,0,0,0,255,3,0,0,115,48,0, - 0,0,0,2,12,1,4,2,12,1,12,1,12,2,12,1, - 10,1,2,1,14,1,14,2,8,1,16,3,6,1,2,0, - 2,255,4,2,28,1,2,1,12,1,16,1,18,2,8,1, - 2,255,122,25,83,111,117,114,99,101,70,105,108,101,76,111, - 97,100,101,114,46,115,101,116,95,100,97,116,97,78,41,7, + 124,11,131,5,1,0,87,0,110,24,4,0,116,15,116,16, + 102,2,144,1,121,76,1,0,1,0,1,0,89,0,110,32, + 48,0,116,17,160,18,100,13,124,8,124,2,161,3,1,0, + 116,19,124,13,124,1,124,8,124,2,100,14,141,4,83,0, + 124,4,100,1,117,0,144,1,114,128,124,0,160,6,124,2, + 161,1,125,4,124,0,160,20,124,4,124,2,161,2,125,14, + 116,17,160,18,100,15,124,2,161,2,1,0,116,21,106,22, + 144,2,115,20,124,8,100,1,117,1,144,2,114,20,124,3, + 100,1,117,1,144,2,114,20,124,6,144,1,114,220,124,5, + 100,1,117,0,144,1,114,206,116,9,160,11,124,4,161,1, + 125,5,116,23,124,14,124,5,124,7,131,3,125,10,110,16, + 116,24,124,14,124,3,116,25,124,4,131,1,131,3,125,10, + 122,18,124,0,160,26,124,2,124,8,124,10,161,3,1,0, + 87,0,110,20,4,0,116,2,144,2,121,18,1,0,1,0, + 1,0,89,0,110,2,48,0,124,14,83,0,41,16,122,190, + 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, + 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, + 99,116,76,111,97,100,101,114,46,103,101,116,95,99,111,100, + 101,46,10,10,32,32,32,32,32,32,32,32,82,101,97,100, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 114,101,113,117,105,114,101,115,32,112,97,116,104,95,115,116, + 97,116,115,32,116,111,32,98,101,32,105,109,112,108,101,109, + 101,110,116,101,100,46,32,84,111,32,119,114,105,116,101,10, + 32,32,32,32,32,32,32,32,98,121,116,101,99,111,100,101, + 44,32,115,101,116,95,100,97,116,97,32,109,117,115,116,32, + 97,108,115,111,32,98,101,32,105,109,112,108,101,109,101,110, + 116,101,100,46,10,10,32,32,32,32,32,32,32,32,78,70, + 84,114,169,0,0,0,114,159,0,0,0,114,145,0,0,0, + 114,38,0,0,0,114,72,0,0,0,114,27,0,0,0,90, + 5,110,101,118,101,114,90,6,97,108,119,97,121,115,218,4, + 115,105,122,101,122,13,123,125,32,109,97,116,99,104,101,115, + 32,123,125,41,3,114,116,0,0,0,114,106,0,0,0,114, + 107,0,0,0,122,19,99,111,100,101,32,111,98,106,101,99, + 116,32,102,114,111,109,32,123,125,41,27,114,179,0,0,0, + 114,97,0,0,0,114,81,0,0,0,114,224,0,0,0,114, + 49,0,0,0,114,17,0,0,0,114,227,0,0,0,114,152, + 0,0,0,218,10,109,101,109,111,114,121,118,105,101,119,114, + 163,0,0,0,90,21,99,104,101,99,107,95,104,97,115,104, + 95,98,97,115,101,100,95,112,121,99,115,114,157,0,0,0, + 218,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, + 66,69,82,114,158,0,0,0,114,156,0,0,0,114,117,0, + 0,0,114,150,0,0,0,114,134,0,0,0,114,149,0,0, + 0,114,165,0,0,0,114,233,0,0,0,114,8,0,0,0, + 218,19,100,111,110,116,95,119,114,105,116,101,95,98,121,116, + 101,99,111,100,101,114,171,0,0,0,114,170,0,0,0,114, + 22,0,0,0,114,226,0,0,0,41,15,114,118,0,0,0, + 114,139,0,0,0,114,107,0,0,0,114,154,0,0,0,114, + 174,0,0,0,114,157,0,0,0,90,10,104,97,115,104,95, + 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, + 114,99,101,114,106,0,0,0,218,2,115,116,114,25,0,0, + 0,114,151,0,0,0,114,82,0,0,0,90,10,98,121,116, + 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, + 106,101,99,116,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,213,0,0,0,85,3,0,0,115,152,0,0, + 0,0,7,10,1,4,1,4,1,4,1,4,1,4,1,2, + 1,12,1,12,1,12,2,2,1,14,1,12,1,8,2,12, + 1,2,1,14,1,12,1,6,3,2,1,2,254,6,4,2, + 1,12,1,16,1,12,1,6,1,12,1,12,1,2,255,2, + 2,8,254,4,3,10,1,4,1,2,1,2,254,4,4,8, + 1,2,255,6,3,2,1,2,1,2,1,6,1,2,1,2, + 251,8,7,18,1,6,2,8,1,2,255,4,2,6,1,2, + 1,2,254,6,3,10,1,10,1,12,1,12,1,18,1,6, + 255,4,2,6,1,10,1,10,1,14,2,6,1,6,255,4, + 2,2,1,18,1,14,1,6,1,122,21,83,111,117,114,99, + 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, + 78,41,10,114,125,0,0,0,114,124,0,0,0,114,126,0, + 0,0,114,223,0,0,0,114,224,0,0,0,114,226,0,0, + 0,114,225,0,0,0,114,229,0,0,0,114,233,0,0,0, + 114,213,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,221,0,0,0,26,3, + 0,0,115,14,0,0,0,8,2,8,8,8,14,8,10,8, + 7,8,10,14,8,114,221,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, + 0,0,0,115,124,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,100,7,132,0,90,6,101,7,135,0, + 102,1,100,8,100,9,132,8,131,1,90,8,101,7,100,10, + 100,11,132,0,131,1,90,9,100,12,100,13,132,0,90,10, + 101,7,100,14,100,15,132,0,131,1,90,11,100,16,100,17, + 132,0,90,12,100,18,100,19,132,0,90,13,100,20,100,21, + 132,0,90,14,100,22,100,23,132,0,90,15,135,0,4,0, + 90,16,83,0,41,24,218,10,70,105,108,101,76,111,97,100, + 101,114,122,103,66,97,115,101,32,102,105,108,101,32,108,111, + 97,100,101,114,32,99,108,97,115,115,32,119,104,105,99,104, + 32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32, + 108,111,97,100,101,114,32,112,114,111,116,111,99,111,108,32, + 109,101,116,104,111,100,115,32,116,104,97,116,10,32,32,32, + 32,114,101,113,117,105,114,101,32,102,105,108,101,32,115,121, + 115,116,101,109,32,117,115,97,103,101,46,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,124, + 2,124,0,95,1,100,1,83,0,41,2,122,75,67,97,99, + 104,101,32,116,104,101,32,109,111,100,117,108,101,32,110,97, + 109,101,32,97,110,100,32,116,104,101,32,112,97,116,104,32, + 116,111,32,116,104,101,32,102,105,108,101,32,102,111,117,110, + 100,32,98,121,32,116,104,101,10,32,32,32,32,32,32,32, + 32,102,105,110,100,101,114,46,78,114,159,0,0,0,41,3, + 114,118,0,0,0,114,139,0,0,0,114,43,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,209, + 0,0,0,175,3,0,0,115,4,0,0,0,0,3,6,1, + 122,19,70,105,108,101,76,111,97,100,101,114,46,95,95,105, + 110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, + 0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124, + 0,106,1,124,1,106,1,107,2,83,0,114,109,0,0,0, + 169,2,218,9,95,95,99,108,97,115,115,95,95,114,131,0, + 0,0,169,2,114,118,0,0,0,90,5,111,116,104,101,114, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 6,95,95,101,113,95,95,181,3,0,0,115,6,0,0,0, + 0,1,12,1,10,255,122,17,70,105,108,101,76,111,97,100, + 101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,20,0,0,0,116,0,124,0,106,1,131,1,116, + 0,124,0,106,2,131,1,65,0,83,0,114,109,0,0,0, + 169,3,218,4,104,97,115,104,114,116,0,0,0,114,43,0, + 0,0,169,1,114,118,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,95,104,97,115,104, + 95,95,185,3,0,0,115,2,0,0,0,0,1,122,19,70, + 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,3,0,0,0,115,16,0,0,0, + 116,0,116,1,124,0,131,2,160,2,124,1,161,1,83,0, + 41,1,122,100,76,111,97,100,32,97,32,109,111,100,117,108, + 101,32,102,114,111,109,32,97,32,102,105,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,41,3,218,5,115,117,112,101, + 114,114,239,0,0,0,114,220,0,0,0,114,219,0,0,0, + 169,1,114,241,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,220,0,0,0,188,3,0,0,115,2,0,0,0,0, + 10,122,22,70,105,108,101,76,111,97,100,101,114,46,108,111, + 97,100,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,6,0,0,0,124,0,106,0,83,0,169,1,122, + 58,82,101,116,117,114,110,32,116,104,101,32,112,97,116,104, + 32,116,111,32,116,104,101,32,115,111,117,114,99,101,32,102, + 105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32, + 116,104,101,32,102,105,110,100,101,114,46,114,47,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,179,0,0,0,200,3,0,0,115,2,0, + 0,0,0,3,122,23,70,105,108,101,76,111,97,100,101,114, + 46,103,101,116,95,102,105,108,101,110,97,109,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, + 0,0,67,0,0,0,115,126,0,0,0,116,0,124,0,116, + 1,116,2,102,2,131,2,114,70,116,3,160,4,116,5,124, + 1,131,1,161,1,143,24,125,2,124,2,160,6,161,0,87, + 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,49, + 0,115,58,48,0,1,0,1,0,1,0,89,0,1,0,110, + 52,116,3,160,7,124,1,100,2,161,2,143,24,125,2,124, + 2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,131, + 3,1,0,83,0,49,0,115,112,48,0,1,0,1,0,1, + 0,89,0,1,0,100,1,83,0,41,3,122,39,82,101,116, + 117,114,110,32,116,104,101,32,100,97,116,97,32,102,114,111, + 109,32,112,97,116,104,32,97,115,32,114,97,119,32,98,121, + 116,101,115,46,78,218,1,114,41,8,114,161,0,0,0,114, + 221,0,0,0,218,19,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,114,63,0,0,0,90,9, + 111,112,101,110,95,99,111,100,101,114,84,0,0,0,90,4, + 114,101,97,100,114,64,0,0,0,41,3,114,118,0,0,0, + 114,43,0,0,0,114,67,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,227,0,0,0,205,3, + 0,0,115,10,0,0,0,0,2,14,1,16,1,40,2,14, + 1,122,19,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 18,0,0,0,124,0,160,0,124,1,161,1,114,14,124,0, + 83,0,100,0,83,0,114,109,0,0,0,41,1,114,182,0, + 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,19,103, + 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, + 101,114,216,3,0,0,115,6,0,0,0,0,2,10,1,4, + 1,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, + 114,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,32,0,0,0,116, + 0,116,1,124,0,106,2,131,1,100,1,25,0,124,1,131, + 2,125,2,116,3,160,4,124,2,100,2,161,2,83,0,41, + 3,78,114,72,0,0,0,114,251,0,0,0,41,5,114,37, + 0,0,0,114,46,0,0,0,114,43,0,0,0,114,63,0, + 0,0,114,64,0,0,0,169,3,114,118,0,0,0,90,8, + 114,101,115,111,117,114,99,101,114,43,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,13,111,112, + 101,110,95,114,101,115,111,117,114,99,101,222,3,0,0,115, + 4,0,0,0,0,1,20,1,122,24,70,105,108,101,76,111, + 97,100,101,114,46,111,112,101,110,95,114,101,115,111,117,114, + 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,160,0,124,1,161,1,115,14,116,1,130,1,116,2, + 116,3,124,0,106,4,131,1,100,1,25,0,124,1,131,2, + 125,2,124,2,83,0,169,2,78,114,72,0,0,0,41,5, + 218,11,105,115,95,114,101,115,111,117,114,99,101,218,17,70, + 105,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, + 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, + 255,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, + 116,104,226,3,0,0,115,8,0,0,0,0,1,10,1,4, + 1,20,1,122,24,70,105,108,101,76,111,97,100,101,114,46, + 114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,40,0,0,0,116,0,124,1,118, + 0,114,12,100,1,83,0,116,1,116,2,124,0,106,3,131, + 1,100,2,25,0,124,1,131,2,125,2,116,4,124,2,131, + 1,83,0,41,3,78,70,114,72,0,0,0,41,5,114,34, + 0,0,0,114,37,0,0,0,114,46,0,0,0,114,43,0, + 0,0,114,53,0,0,0,169,3,114,118,0,0,0,114,116, + 0,0,0,114,43,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,2,1,0,0,232,3,0,0, + 115,8,0,0,0,0,1,8,1,4,1,20,1,122,22,70, + 105,108,101,76,111,97,100,101,114,46,105,115,95,114,101,115, + 111,117,114,99,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,24, + 0,0,0,116,0,116,1,160,2,116,3,124,0,106,4,131, + 1,100,1,25,0,161,1,131,1,83,0,114,1,1,0,0, + 41,5,218,4,105,116,101,114,114,2,0,0,0,218,7,108, + 105,115,116,100,105,114,114,46,0,0,0,114,43,0,0,0, + 114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,8,99,111,110,116,101,110,116,115,238,3, + 0,0,115,2,0,0,0,0,1,122,19,70,105,108,101,76, + 111,97,100,101,114,46,99,111,110,116,101,110,116,115,41,17, 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,224,0,0,0,114,226,0,0,0,114,225, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,9,1,0,0,241,3,0,0, - 115,8,0,0,0,8,2,4,2,8,5,8,5,114,9,1, + 127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,247, + 0,0,0,114,136,0,0,0,114,220,0,0,0,114,179,0, + 0,0,114,227,0,0,0,114,254,0,0,0,114,0,1,0, + 0,114,4,1,0,0,114,2,1,0,0,114,8,1,0,0, + 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, + 3,0,0,0,114,3,0,0,0,114,249,0,0,0,114,6, + 0,0,0,114,239,0,0,0,170,3,0,0,115,30,0,0, + 0,8,2,4,3,8,6,8,4,8,3,2,1,14,11,2, + 1,10,4,8,11,2,1,10,5,8,4,8,6,8,6,114, + 239,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,46,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,156,1,100,8,100,9,132,2,90,6,100,10,83,0, + 41,11,218,16,83,111,117,114,99,101,70,105,108,101,76,111, + 97,100,101,114,122,62,67,111,110,99,114,101,116,101,32,105, + 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, + 32,83,111,117,114,99,101,76,111,97,100,101,114,32,117,115, + 105,110,103,32,116,104,101,32,102,105,108,101,32,115,121,115, + 116,101,109,46,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,3,0,0,0,67,0,0,0,115,22,0, + 0,0,116,0,124,1,131,1,125,2,124,2,106,1,124,2, + 106,2,100,1,156,2,83,0,41,2,122,33,82,101,116,117, + 114,110,32,116,104,101,32,109,101,116,97,100,97,116,97,32, + 102,111,114,32,116,104,101,32,112,97,116,104,46,41,2,114, + 169,0,0,0,114,234,0,0,0,41,3,114,48,0,0,0, + 218,8,115,116,95,109,116,105,109,101,90,7,115,116,95,115, + 105,122,101,41,3,114,118,0,0,0,114,43,0,0,0,114, + 238,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,224,0,0,0,246,3,0,0,115,4,0,0, + 0,0,2,8,1,122,27,83,111,117,114,99,101,70,105,108, + 101,76,111,97,100,101,114,46,112,97,116,104,95,115,116,97, + 116,115,99,4,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,5,0,0,0,67,0,0,0,115,24,0,0,0, + 116,0,124,1,131,1,125,4,124,0,106,1,124,2,124,3, + 124,4,100,1,141,3,83,0,41,2,78,169,1,218,5,95, + 109,111,100,101,41,2,114,114,0,0,0,114,225,0,0,0, + 41,5,114,118,0,0,0,114,107,0,0,0,114,106,0,0, + 0,114,25,0,0,0,114,51,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,226,0,0,0,251, + 3,0,0,115,4,0,0,0,0,2,8,1,122,32,83,111, + 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,114,59, + 0,0,0,114,11,1,0,0,99,3,0,0,0,0,0,0, + 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, + 0,115,252,0,0,0,116,0,124,1,131,1,92,2,125,4, + 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, + 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, + 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, + 68,0,93,104,125,7,116,4,124,4,124,7,131,2,125,4, + 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, + 4,0,116,7,121,110,1,0,1,0,1,0,89,0,113,60, + 89,0,113,60,4,0,116,8,121,162,1,0,125,8,1,0, + 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, + 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, + 100,2,125,8,126,8,48,0,48,0,113,60,122,28,116,11, + 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, + 124,1,161,2,1,0,87,0,110,52,4,0,116,8,144,0, + 121,246,1,0,125,8,1,0,122,26,116,9,160,10,100,1, + 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, + 126,8,110,10,100,2,125,8,126,8,48,0,48,0,100,2, + 83,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, + 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, + 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, + 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, + 12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,114, + 46,0,0,0,114,55,0,0,0,114,186,0,0,0,114,41, + 0,0,0,114,37,0,0,0,114,2,0,0,0,90,5,109, + 107,100,105,114,218,15,70,105,108,101,69,120,105,115,116,115, + 69,114,114,111,114,114,49,0,0,0,114,134,0,0,0,114, + 149,0,0,0,114,68,0,0,0,41,9,114,118,0,0,0, + 114,43,0,0,0,114,25,0,0,0,114,12,1,0,0,218, + 6,112,97,114,101,110,116,114,96,0,0,0,114,36,0,0, + 0,114,32,0,0,0,114,228,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,225,0,0,0,0, + 4,0,0,115,48,0,0,0,0,2,12,1,4,2,12,1, + 12,1,12,2,12,1,10,1,2,1,14,1,12,2,8,1, + 14,3,6,1,2,0,2,255,4,2,28,1,2,1,12,1, + 16,1,16,2,8,1,2,255,122,25,83,111,117,114,99,101, + 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, + 97,116,97,78,41,7,114,125,0,0,0,114,124,0,0,0, + 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, + 226,0,0,0,114,225,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,9,1, + 0,0,242,3,0,0,115,8,0,0,0,8,2,4,2,8, + 5,8,5,114,9,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, + 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, + 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, + 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, + 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, + 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, + 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, + 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, + 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, + 4,78,114,159,0,0,0,114,145,0,0,0,41,2,114,116, + 0,0,0,114,106,0,0,0,41,5,114,179,0,0,0,114, + 227,0,0,0,114,152,0,0,0,114,165,0,0,0,114,235, + 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, + 43,0,0,0,114,25,0,0,0,114,151,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, + 0,0,35,4,0,0,115,22,0,0,0,0,1,10,1,10, + 4,2,1,2,254,6,4,12,1,2,1,14,1,2,1,2, + 253,122,29,83,111,117,114,99,101,108,101,115,115,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,39,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111, + 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,3, + 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,229,0,0,0,51,4,0,0, + 115,2,0,0,0,0,2,122,31,83,111,117,114,99,101,108, + 101,115,115,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,115,111,117,114,99,101,78,41,6,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 213,0,0,0,114,229,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,15,1, + 0,0,31,4,0,0,115,6,0,0,0,8,2,4,2,8, + 16,114,15,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, + 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, + 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, + 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, + 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, + 41,21,114,252,0,0,0,122,93,76,111,97,100,101,114,32, + 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, + 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, + 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, + 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, + 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 100,0,83,0,114,109,0,0,0,114,159,0,0,0,114,5, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,209,0,0,0,68,4,0,0,115,4,0,0,0, + 0,1,6,1,122,28,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,116, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, + 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, + 124,1,106,1,107,2,83,0,114,109,0,0,0,114,240,0, + 0,0,114,242,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,243,0,0,0,72,4,0,0,115, + 6,0,0,0,0,1,12,1,10,255,122,26,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, + 106,2,131,1,65,0,83,0,114,109,0,0,0,114,244,0, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,247,0,0,0,76,4,0,0,115, + 2,0,0,0,0,1,122,28,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, + 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, + 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, + 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, + 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101, + 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, + 114,111,109,32,123,33,114,125,41,7,114,134,0,0,0,114, + 214,0,0,0,114,163,0,0,0,90,14,99,114,101,97,116, + 101,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, + 0,0,0,114,43,0,0,0,41,3,114,118,0,0,0,114, + 187,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,212,0,0,0,79,4,0, + 0,115,18,0,0,0,0,2,4,1,4,0,2,255,4,2, + 6,1,4,0,4,255,4,2,122,33,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,99,114, + 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0, + 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106, + 3,124,1,161,2,1,0,116,0,160,4,100,1,124,0,106, + 5,124,0,106,6,161,3,1,0,100,2,83,0,41,3,122, + 30,73,110,105,116,105,97,108,105,122,101,32,97,110,32,101, + 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,122, + 40,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, + 101,32,123,33,114,125,32,101,120,101,99,117,116,101,100,32, + 102,114,111,109,32,123,33,114,125,78,41,7,114,134,0,0, + 0,114,214,0,0,0,114,163,0,0,0,90,12,101,120,101, + 99,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, + 0,0,0,114,43,0,0,0,114,253,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, + 0,87,4,0,0,115,10,0,0,0,0,2,14,1,6,1, + 4,0,4,255,122,31,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, + 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, + 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, + 0,131,1,131,1,83,0,41,4,122,49,82,101,116,117,114, + 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, + 115,32,97,32,112,97,99,107,97,103,101,46,114,38,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, + 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, + 0,1,0,113,2,100,1,83,0,41,2,114,209,0,0,0, + 78,114,3,0,0,0,169,2,114,31,0,0,0,218,6,115, + 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, + 109,101,114,3,0,0,0,114,6,0,0,0,218,9,60,103, + 101,110,101,120,112,114,62,96,4,0,0,115,4,0,0,0, + 4,1,2,255,122,49,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,99, + 107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,103, + 101,110,101,120,112,114,62,41,4,114,46,0,0,0,114,43, + 0,0,0,218,3,97,110,121,218,18,69,88,84,69,78,83, + 73,79,78,95,83,85,70,70,73,88,69,83,114,219,0,0, + 0,114,3,0,0,0,114,18,1,0,0,114,6,0,0,0, + 114,182,0,0,0,93,4,0,0,115,8,0,0,0,0,2, + 14,1,12,1,2,255,122,30,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, + 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,41,2,122,63,82,101,116,117, + 114,110,32,78,111,110,101,32,97,115,32,97,110,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,99, + 97,110,110,111,116,32,99,114,101,97,116,101,32,97,32,99, + 111,100,101,32,111,98,106,101,99,116,46,78,114,3,0,0, + 0,114,219,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,213,0,0,0,99,4,0,0,115,2, + 0,0,0,0,2,122,28,69,120,116,101,110,115,105,111,110, + 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99, + 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,53,82,101,116,117,114,110,32, + 78,111,110,101,32,97,115,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,115,32,104,97,118,101,32,110, + 111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, + 3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,229,0,0,0,103,4,0, + 0,115,2,0,0,0,0,2,122,30,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,6,0,0,0,124,0,106,0,83,0,114,250,0,0, + 0,114,47,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,107, + 4,0,0,115,2,0,0,0,0,3,122,32,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,209,0,0,0,114,243,0,0,0,114,247,0, + 0,0,114,212,0,0,0,114,217,0,0,0,114,182,0,0, + 0,114,213,0,0,0,114,229,0,0,0,114,136,0,0,0, + 114,179,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,252,0,0,0,60,4, + 0,0,115,22,0,0,0,8,2,4,6,8,4,8,4,8, + 3,8,8,8,6,8,6,8,4,8,4,2,1,114,252,0, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,104,0,0,0, 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, - 41,7,218,20,83,111,117,114,99,101,108,101,115,115,70,105, - 108,101,76,111,97,100,101,114,122,45,76,111,97,100,101,114, - 32,119,104,105,99,104,32,104,97,110,100,108,101,115,32,115, - 111,117,114,99,101,108,101,115,115,32,102,105,108,101,32,105, - 109,112,111,114,116,115,46,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, - 115,68,0,0,0,124,0,160,0,124,1,161,1,125,2,124, - 0,160,1,124,2,161,1,125,3,124,1,124,2,100,1,156, - 2,125,4,116,2,124,3,124,1,124,4,131,3,1,0,116, - 3,116,4,124,3,131,1,100,2,100,0,133,2,25,0,124, - 1,124,2,100,3,141,3,83,0,41,4,78,114,159,0,0, - 0,114,145,0,0,0,41,2,114,116,0,0,0,114,106,0, - 0,0,41,5,114,179,0,0,0,114,227,0,0,0,114,152, - 0,0,0,114,165,0,0,0,114,235,0,0,0,41,5,114, - 118,0,0,0,114,139,0,0,0,114,43,0,0,0,114,25, - 0,0,0,114,151,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,34,4,0,0, - 115,22,0,0,0,0,1,10,1,10,4,2,1,2,254,6, - 4,12,1,2,1,14,1,2,1,2,253,122,29,83,111,117, - 114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, + 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, + 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, + 132,0,90,10,100,16,100,17,132,0,90,11,100,18,100,19, + 132,0,90,12,100,20,100,21,132,0,90,13,100,22,100,23, + 132,0,90,14,100,24,83,0,41,25,218,14,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,97,38,1,0,0,82, + 101,112,114,101,115,101,110,116,115,32,97,32,110,97,109,101, + 115,112,97,99,101,32,112,97,99,107,97,103,101,39,115,32, + 112,97,116,104,46,32,32,73,116,32,117,115,101,115,32,116, + 104,101,32,109,111,100,117,108,101,32,110,97,109,101,10,32, + 32,32,32,116,111,32,102,105,110,100,32,105,116,115,32,112, + 97,114,101,110,116,32,109,111,100,117,108,101,44,32,97,110, + 100,32,102,114,111,109,32,116,104,101,114,101,32,105,116,32, + 108,111,111,107,115,32,117,112,32,116,104,101,32,112,97,114, + 101,110,116,39,115,10,32,32,32,32,95,95,112,97,116,104, + 95,95,46,32,32,87,104,101,110,32,116,104,105,115,32,99, + 104,97,110,103,101,115,44,32,116,104,101,32,109,111,100,117, + 108,101,39,115,32,111,119,110,32,112,97,116,104,32,105,115, + 32,114,101,99,111,109,112,117,116,101,100,44,10,32,32,32, + 32,117,115,105,110,103,32,112,97,116,104,95,102,105,110,100, + 101,114,46,32,32,70,111,114,32,116,111,112,45,108,101,118, + 101,108,32,109,111,100,117,108,101,115,44,32,116,104,101,32, + 112,97,114,101,110,116,32,109,111,100,117,108,101,39,115,32, + 112,97,116,104,10,32,32,32,32,105,115,32,115,121,115,46, + 112,97,116,104,46,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,36, + 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116, + 2,124,0,160,3,161,0,131,1,124,0,95,4,124,3,124, + 0,95,5,100,0,83,0,114,109,0,0,0,41,6,218,5, + 95,110,97,109,101,218,5,95,112,97,116,104,114,111,0,0, + 0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,112, + 97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,110, + 116,95,112,97,116,104,218,12,95,112,97,116,104,95,102,105, + 110,100,101,114,169,4,114,118,0,0,0,114,116,0,0,0, + 114,43,0,0,0,90,11,112,97,116,104,95,102,105,110,100, + 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,209,0,0,0,120,4,0,0,115,8,0,0,0,0, + 1,6,1,6,1,14,1,122,23,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,95,105,110,105,116,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, + 106,0,160,1,100,1,161,1,92,3,125,1,125,2,125,3, + 124,2,100,2,107,2,114,30,100,3,83,0,124,1,100,4, + 102,2,83,0,41,5,122,62,82,101,116,117,114,110,115,32, + 97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,101, + 110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,32, + 112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,114, + 45,110,97,109,101,41,114,70,0,0,0,114,39,0,0,0, + 41,2,114,8,0,0,0,114,43,0,0,0,90,8,95,95, + 112,97,116,104,95,95,41,2,114,23,1,0,0,114,40,0, + 0,0,41,4,114,118,0,0,0,114,14,1,0,0,218,3, + 100,111,116,90,2,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,23,95,102,105,110,100,95,112,97, + 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,126, + 4,0,0,115,8,0,0,0,0,2,18,1,8,2,4,3, + 122,38,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97, + 116,104,95,110,97,109,101,115,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,28,0,0,0,124,0,160,0,161,0,92,2,125,1, + 125,2,116,1,116,2,106,3,124,1,25,0,124,2,131,2, + 83,0,114,109,0,0,0,41,4,114,30,1,0,0,114,130, + 0,0,0,114,8,0,0,0,218,7,109,111,100,117,108,101, + 115,41,3,114,118,0,0,0,90,18,112,97,114,101,110,116, + 95,109,111,100,117,108,101,95,110,97,109,101,90,14,112,97, + 116,104,95,97,116,116,114,95,110,97,109,101,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,25,1,0,0, + 136,4,0,0,115,4,0,0,0,0,1,12,1,122,31,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,103, + 101,116,95,112,97,114,101,110,116,95,112,97,116,104,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, + 0,0,0,67,0,0,0,115,80,0,0,0,116,0,124,0, + 160,1,161,0,131,1,125,1,124,1,124,0,106,2,107,3, + 114,74,124,0,160,3,124,0,106,4,124,1,161,2,125,2, + 124,2,100,0,117,1,114,68,124,2,106,5,100,0,117,0, + 114,68,124,2,106,6,114,68,124,2,106,6,124,0,95,7, + 124,1,124,0,95,2,124,0,106,7,83,0,114,109,0,0, + 0,41,8,114,111,0,0,0,114,25,1,0,0,114,26,1, + 0,0,114,27,1,0,0,114,23,1,0,0,114,140,0,0, + 0,114,178,0,0,0,114,24,1,0,0,41,3,114,118,0, + 0,0,90,11,112,97,114,101,110,116,95,112,97,116,104,114, + 187,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,12,95,114,101,99,97,108,99,117,108,97,116, + 101,140,4,0,0,115,16,0,0,0,0,2,12,1,10,1, + 14,3,18,1,6,1,8,1,6,1,122,27,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,114,101,99,97, + 108,99,117,108,97,116,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, + 0,114,109,0,0,0,41,2,114,6,1,0,0,114,32,1, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,8,95,95,105,116,101,114,95,95, + 153,4,0,0,115,2,0,0,0,0,1,122,23,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,105,116, + 101,114,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,12,0, + 0,0,124,0,160,0,161,0,124,1,25,0,83,0,114,109, + 0,0,0,169,1,114,32,1,0,0,41,2,114,118,0,0, + 0,218,5,105,110,100,101,120,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,11,95,95,103,101,116,105,116, + 101,109,95,95,156,4,0,0,115,2,0,0,0,0,1,122, + 26,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,103,101,116,105,116,101,109,95,95,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,14,0,0,0,124,2,124,0,106,0,124, + 1,60,0,100,0,83,0,114,109,0,0,0,41,1,114,24, + 1,0,0,41,3,114,118,0,0,0,114,35,1,0,0,114, + 43,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,95, + 159,4,0,0,115,2,0,0,0,0,1,122,26,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, + 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, + 0,114,109,0,0,0,41,2,114,22,0,0,0,114,32,1, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,7,95,95,108,101,110,95,95,162, + 4,0,0,115,2,0,0,0,0,1,122,22,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,95,108,101,110, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, + 20,95,78,97,109,101,115,112,97,99,101,80,97,116,104,40, + 123,33,114,125,41,41,2,114,61,0,0,0,114,24,1,0, + 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,8,95,95,114,101,112,114,95,95,165, + 4,0,0,115,2,0,0,0,0,1,122,23,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,95,114,101,112, + 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, + 0,124,1,124,0,160,0,161,0,118,0,83,0,114,109,0, + 0,0,114,34,1,0,0,169,2,114,118,0,0,0,218,4, + 105,116,101,109,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, + 95,168,4,0,0,115,2,0,0,0,0,1,122,27,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,99, + 111,110,116,97,105,110,115,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,16,0,0,0,124,0,106,0,160,1,124,1,161, + 1,1,0,100,0,83,0,114,109,0,0,0,41,2,114,24, + 1,0,0,114,186,0,0,0,114,40,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,186,0,0, + 0,171,4,0,0,115,2,0,0,0,0,1,122,21,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,97,112,112, + 101,110,100,78,41,15,114,125,0,0,0,114,124,0,0,0, + 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, + 30,1,0,0,114,25,1,0,0,114,32,1,0,0,114,33, + 1,0,0,114,36,1,0,0,114,37,1,0,0,114,38,1, + 0,0,114,39,1,0,0,114,42,1,0,0,114,186,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,22,1,0,0,113,4,0,0,115,24, + 0,0,0,8,1,4,6,8,6,8,10,8,4,8,13,8, + 3,8,3,8,3,8,3,8,3,8,3,114,22,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,80,0,0,0,101,0, + 90,1,100,0,90,2,100,1,100,2,132,0,90,3,101,4, + 100,3,100,4,132,0,131,1,90,5,100,5,100,6,132,0, + 90,6,100,7,100,8,132,0,90,7,100,9,100,10,132,0, + 90,8,100,11,100,12,132,0,90,9,100,13,100,14,132,0, + 90,10,100,15,100,16,132,0,90,11,100,17,83,0,41,18, + 218,16,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,99,4,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,18,0,0,0, + 116,0,124,1,124,2,124,3,131,3,124,0,95,1,100,0, + 83,0,114,109,0,0,0,41,2,114,22,1,0,0,114,24, + 1,0,0,114,28,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,209,0,0,0,177,4,0,0, + 115,2,0,0,0,0,1,122,25,95,78,97,109,101,115,112, + 97,99,101,76,111,97,100,101,114,46,95,95,105,110,105,116, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, + 100,1,160,0,124,1,106,1,161,1,83,0,41,2,122,115, + 82,101,116,117,114,110,32,114,101,112,114,32,102,111,114,32, + 116,104,101,32,109,111,100,117,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, + 84,104,101,32,105,109,112,111,114,116,32,109,97,99,104,105, + 110,101,114,121,32,100,111,101,115,32,116,104,101,32,106,111, + 98,32,105,116,115,101,108,102,46,10,10,32,32,32,32,32, + 32,32,32,122,25,60,109,111,100,117,108,101,32,123,33,114, + 125,32,40,110,97,109,101,115,112,97,99,101,41,62,41,2, + 114,61,0,0,0,114,125,0,0,0,41,2,114,193,0,0, + 0,114,216,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,109,111,100,117,108,101,95,114,101, + 112,114,180,4,0,0,115,2,0,0,0,0,7,122,28,95, + 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, + 109,111,100,117,108,101,95,114,101,112,114,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,78, + 84,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,189, + 4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,105,115,95, + 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,78,114,39,0,0, + 0,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,192, + 4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,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,39,0,0,0,122,8,60, + 115,116,114,105,110,103,62,114,215,0,0,0,84,41,1,114, + 231,0,0,0,41,1,114,232,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 213,0,0,0,195,4,0,0,115,2,0,0,0,0,1,122, + 25,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, 114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,39, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,116, - 104,101,114,101,32,105,115,32,110,111,32,115,111,117,114,99, - 101,32,99,111,100,101,46,78,114,3,0,0,0,114,219,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,229,0,0,0,50,4,0,0,115,2,0,0,0,0, - 2,122,31,83,111,117,114,99,101,108,101,115,115,70,105,108, - 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, - 99,101,78,41,6,114,125,0,0,0,114,124,0,0,0,114, - 126,0,0,0,114,127,0,0,0,114,213,0,0,0,114,229, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,15,1,0,0,30,4,0,0, - 115,6,0,0,0,8,2,4,2,8,16,114,15,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, - 132,0,131,1,90,13,100,20,83,0,41,21,114,252,0,0, - 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, - 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, - 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, - 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, - 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, - 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,109, - 0,0,0,114,159,0,0,0,114,5,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, - 0,67,4,0,0,115,4,0,0,0,0,1,6,1,122,28, - 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, - 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, - 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, - 83,0,114,109,0,0,0,114,240,0,0,0,114,242,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,243,0,0,0,71,4,0,0,115,6,0,0,0,0,1, - 12,1,10,255,122,26,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, - 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, - 83,0,114,109,0,0,0,114,244,0,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,247,0,0,0,75,4,0,0,115,2,0,0,0,0,1, - 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, - 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, - 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, - 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, - 41,2,122,38,67,114,101,97,116,101,32,97,110,32,117,110, - 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, - 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, - 114,125,41,7,114,134,0,0,0,114,214,0,0,0,114,163, - 0,0,0,90,14,99,114,101,97,116,101,95,100,121,110,97, - 109,105,99,114,149,0,0,0,114,116,0,0,0,114,43,0, - 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,212,0,0,0,78,4,0,0,115,18,0,0,0, - 0,2,4,1,4,0,2,255,4,2,6,1,4,0,4,255, - 4,2,122,33,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,5,0,0,0,67,0,0,0,115,36, - 0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,1, - 0,116,0,160,4,100,1,124,0,106,5,124,0,106,6,161, - 3,1,0,100,2,83,0,41,3,122,30,73,110,105,116,105, - 97,108,105,122,101,32,97,110,32,101,120,116,101,110,115,105, - 111,110,32,109,111,100,117,108,101,122,40,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,32,123,33,114,125, - 32,101,120,101,99,117,116,101,100,32,102,114,111,109,32,123, - 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, - 114,163,0,0,0,90,12,101,120,101,99,95,100,121,110,97, - 109,105,99,114,149,0,0,0,114,116,0,0,0,114,43,0, - 0,0,114,253,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,217,0,0,0,86,4,0,0,115, - 10,0,0,0,0,2,14,1,6,1,4,0,4,255,122,31, - 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, - 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,3,0,0,0,115,36,0,0,0,116,0,124, - 0,106,1,131,1,100,1,25,0,137,0,116,2,135,0,102, - 1,100,2,100,3,132,8,116,3,68,0,131,1,131,1,83, - 0,41,4,122,49,82,101,116,117,114,110,32,84,114,117,101, - 32,105,102,32,116,104,101,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,32,105,115,32,97,32,112,97, - 99,107,97,103,101,46,114,38,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 51,0,0,0,115,26,0,0,0,124,0,93,18,125,1,136, - 0,100,0,124,1,23,0,107,2,86,0,1,0,113,2,100, - 1,83,0,41,2,114,209,0,0,0,78,114,3,0,0,0, - 169,2,114,31,0,0,0,218,6,115,117,102,102,105,120,169, - 1,90,9,102,105,108,101,95,110,97,109,101,114,3,0,0, - 0,114,6,0,0,0,218,9,60,103,101,110,101,120,112,114, - 62,95,4,0,0,115,4,0,0,0,4,1,2,255,122,49, - 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, - 100,101,114,46,105,115,95,112,97,99,107,97,103,101,46,60, - 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, - 62,41,4,114,46,0,0,0,114,43,0,0,0,218,3,97, - 110,121,218,18,69,88,84,69,78,83,73,79,78,95,83,85, - 70,70,73,88,69,83,114,219,0,0,0,114,3,0,0,0, - 114,18,1,0,0,114,6,0,0,0,114,182,0,0,0,92, - 4,0,0,115,8,0,0,0,0,2,14,1,12,1,2,255, - 122,30,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,63,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,97,110,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, - 99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,98, - 106,101,99,116,46,78,114,3,0,0,0,114,219,0,0,0, + 0,0,0,115,4,0,0,0,100,1,83,0,114,210,0,0, + 0,114,3,0,0,0,114,211,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,198, + 4,0,0,115,2,0,0,0,0,1,122,30,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, + 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,0,83,0,114,109,0,0, + 0,114,3,0,0,0,114,253,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,217,0,0,0,201, + 4,0,0,115,2,0,0,0,0,1,122,28,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,26,0,0,0,116,0,160,1,100,1,124,0,106,2, + 161,2,1,0,116,0,160,3,124,0,124,1,161,2,83,0, + 41,2,122,98,76,111,97,100,32,97,32,110,97,109,101,115, + 112,97,99,101,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, + 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, + 32,32,32,32,32,32,122,38,110,97,109,101,115,112,97,99, + 101,32,109,111,100,117,108,101,32,108,111,97,100,101,100,32, + 119,105,116,104,32,112,97,116,104,32,123,33,114,125,41,4, + 114,134,0,0,0,114,149,0,0,0,114,24,1,0,0,114, + 218,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,220,0,0,0,204,4,0, + 0,115,8,0,0,0,0,7,6,1,4,255,4,2,122,28, + 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, + 46,108,111,97,100,95,109,111,100,117,108,101,78,41,12,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,209, + 0,0,0,114,207,0,0,0,114,44,1,0,0,114,182,0, + 0,0,114,229,0,0,0,114,213,0,0,0,114,212,0,0, + 0,114,217,0,0,0,114,220,0,0,0,114,3,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,98,4,0,0,115,2,0,0,0,0,2,122, - 28,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, - 97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,53,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,115,32,104,97,118,101,32,110,111,32,115,111,117,114, - 99,101,32,99,111,100,101,46,78,114,3,0,0,0,114,219, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,229,0,0,0,102,4,0,0,115,2,0,0,0, - 0,2,122,30,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, - 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, - 124,0,106,0,83,0,114,250,0,0,0,114,47,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,179,0,0,0,106,4,0,0,115,2,0, - 0,0,0,3,122,32,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,102,105, - 108,101,110,97,109,101,78,41,14,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,127,0,0,0,114,209,0, - 0,0,114,243,0,0,0,114,247,0,0,0,114,212,0,0, - 0,114,217,0,0,0,114,182,0,0,0,114,213,0,0,0, - 114,229,0,0,0,114,136,0,0,0,114,179,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,252,0,0,0,59,4,0,0,115,22,0,0, - 0,8,2,4,6,8,4,8,4,8,3,8,8,8,6,8, - 6,8,4,8,4,2,1,114,252,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,104,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,100,7,132,0,90,6,100,8, - 100,9,132,0,90,7,100,10,100,11,132,0,90,8,100,12, - 100,13,132,0,90,9,100,14,100,15,132,0,90,10,100,16, - 100,17,132,0,90,11,100,18,100,19,132,0,90,12,100,20, - 100,21,132,0,90,13,100,22,100,23,132,0,90,14,100,24, - 83,0,41,25,218,14,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,97,38,1,0,0,82,101,112,114,101,115,101, - 110,116,115,32,97,32,110,97,109,101,115,112,97,99,101,32, - 112,97,99,107,97,103,101,39,115,32,112,97,116,104,46,32, - 32,73,116,32,117,115,101,115,32,116,104,101,32,109,111,100, - 117,108,101,32,110,97,109,101,10,32,32,32,32,116,111,32, - 102,105,110,100,32,105,116,115,32,112,97,114,101,110,116,32, - 109,111,100,117,108,101,44,32,97,110,100,32,102,114,111,109, - 32,116,104,101,114,101,32,105,116,32,108,111,111,107,115,32, - 117,112,32,116,104,101,32,112,97,114,101,110,116,39,115,10, - 32,32,32,32,95,95,112,97,116,104,95,95,46,32,32,87, - 104,101,110,32,116,104,105,115,32,99,104,97,110,103,101,115, - 44,32,116,104,101,32,109,111,100,117,108,101,39,115,32,111, - 119,110,32,112,97,116,104,32,105,115,32,114,101,99,111,109, - 112,117,116,101,100,44,10,32,32,32,32,117,115,105,110,103, - 32,112,97,116,104,95,102,105,110,100,101,114,46,32,32,70, - 111,114,32,116,111,112,45,108,101,118,101,108,32,109,111,100, - 117,108,101,115,44,32,116,104,101,32,112,97,114,101,110,116, - 32,109,111,100,117,108,101,39,115,32,112,97,116,104,10,32, - 32,32,32,105,115,32,115,121,115,46,112,97,116,104,46,99, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 3,0,0,0,67,0,0,0,115,36,0,0,0,124,1,124, - 0,95,0,124,2,124,0,95,1,116,2,124,0,160,3,161, - 0,131,1,124,0,95,4,124,3,124,0,95,5,100,0,83, - 0,114,109,0,0,0,41,6,218,5,95,110,97,109,101,218, - 5,95,112,97,116,104,114,111,0,0,0,218,16,95,103,101, - 116,95,112,97,114,101,110,116,95,112,97,116,104,218,17,95, - 108,97,115,116,95,112,97,114,101,110,116,95,112,97,116,104, - 218,12,95,112,97,116,104,95,102,105,110,100,101,114,169,4, - 114,118,0,0,0,114,116,0,0,0,114,43,0,0,0,90, - 11,112,97,116,104,95,102,105,110,100,101,114,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, - 119,4,0,0,115,8,0,0,0,0,1,6,1,6,1,14, - 1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,124,0,106,0,160,1,100,1, - 161,1,92,3,125,1,125,2,125,3,124,2,100,2,107,2, - 114,30,100,3,83,0,124,1,100,4,102,2,83,0,41,5, - 122,62,82,101,116,117,114,110,115,32,97,32,116,117,112,108, - 101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100, - 117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116, - 45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41, - 114,70,0,0,0,114,39,0,0,0,41,2,114,8,0,0, - 0,114,43,0,0,0,90,8,95,95,112,97,116,104,95,95, - 41,2,114,23,1,0,0,114,40,0,0,0,41,4,114,118, - 0,0,0,114,14,1,0,0,218,3,100,111,116,90,2,109, - 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,23,95,102,105,110,100,95,112,97,114,101,110,116,95,112, - 97,116,104,95,110,97,109,101,115,125,4,0,0,115,8,0, - 0,0,0,2,18,1,8,2,4,3,122,38,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,102,105,110,100, - 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, - 101,115,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,28,0,0,0, - 124,0,160,0,161,0,92,2,125,1,125,2,116,1,116,2, - 106,3,124,1,25,0,124,2,131,2,83,0,114,109,0,0, - 0,41,4,114,30,1,0,0,114,130,0,0,0,114,8,0, - 0,0,218,7,109,111,100,117,108,101,115,41,3,114,118,0, - 0,0,90,18,112,97,114,101,110,116,95,109,111,100,117,108, - 101,95,110,97,109,101,90,14,112,97,116,104,95,97,116,116, - 114,95,110,97,109,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,25,1,0,0,135,4,0,0,115,4, - 0,0,0,0,1,12,1,122,31,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,103,101,116,95,112,97,114, - 101,110,116,95,112,97,116,104,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, - 0,115,80,0,0,0,116,0,124,0,160,1,161,0,131,1, - 125,1,124,1,124,0,106,2,107,3,114,74,124,0,160,3, - 124,0,106,4,124,1,161,2,125,2,124,2,100,0,107,9, - 114,68,124,2,106,5,100,0,107,8,114,68,124,2,106,6, - 114,68,124,2,106,6,124,0,95,7,124,1,124,0,95,2, - 124,0,106,7,83,0,114,109,0,0,0,41,8,114,111,0, - 0,0,114,25,1,0,0,114,26,1,0,0,114,27,1,0, - 0,114,23,1,0,0,114,140,0,0,0,114,178,0,0,0, - 114,24,1,0,0,41,3,114,118,0,0,0,90,11,112,97, - 114,101,110,116,95,112,97,116,104,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, - 114,101,99,97,108,99,117,108,97,116,101,139,4,0,0,115, - 16,0,0,0,0,2,12,1,10,1,14,3,18,1,6,1, - 8,1,6,1,122,27,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,46,95,114,101,99,97,108,99,117,108,97,116, - 101,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, - 41,2,114,6,1,0,0,114,32,1,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,8,95,95,105,116,101,114,95,95,152,4,0,0,115,2, - 0,0,0,0,1,122,23,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, - 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, - 161,0,124,1,25,0,83,0,114,109,0,0,0,169,1,114, - 32,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, - 101,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,155,4, - 0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, - 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, - 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, - 0,114,109,0,0,0,41,1,114,24,1,0,0,41,3,114, - 118,0,0,0,114,35,1,0,0,114,43,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, - 95,115,101,116,105,116,101,109,95,95,158,4,0,0,115,2, - 0,0,0,0,1,122,26,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, - 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, - 41,2,114,22,0,0,0,114,32,1,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,7,95,95,108,101,110,95,95,161,4,0,0,115,2,0, - 0,0,0,1,122,22,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,46,95,95,108,101,110,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, - 106,1,161,1,83,0,41,2,78,122,20,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,40,123,33,114,125,41,41, - 2,114,61,0,0,0,114,24,1,0,0,114,246,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 8,95,95,114,101,112,114,95,95,164,4,0,0,115,2,0, - 0,0,0,1,122,23,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,46,95,95,114,101,112,114,95,95,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,12,0,0,0,124,1,124,0,160, - 0,161,0,107,6,83,0,114,109,0,0,0,114,34,1,0, - 0,169,2,114,118,0,0,0,218,4,105,116,101,109,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, - 95,99,111,110,116,97,105,110,115,95,95,167,4,0,0,115, - 2,0,0,0,0,1,122,27,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,46,95,95,99,111,110,116,97,105,110, - 115,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, - 0,124,0,106,0,160,1,124,1,161,1,1,0,100,0,83, - 0,114,109,0,0,0,41,2,114,24,1,0,0,114,186,0, - 0,0,114,40,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,186,0,0,0,170,4,0,0,115, - 2,0,0,0,0,1,122,21,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,46,97,112,112,101,110,100,78,41,15, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,209,0,0,0,114,30,1,0,0,114,25, - 1,0,0,114,32,1,0,0,114,33,1,0,0,114,36,1, - 0,0,114,37,1,0,0,114,38,1,0,0,114,39,1,0, - 0,114,42,1,0,0,114,186,0,0,0,114,3,0,0,0, + 43,1,0,0,176,4,0,0,115,18,0,0,0,8,1,8, + 3,2,1,10,8,8,3,8,3,8,3,8,3,8,3,114, + 43,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,64,0,0,0,115,118,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,101,4, + 100,2,100,3,132,0,131,1,90,5,101,4,100,4,100,5, + 132,0,131,1,90,6,101,4,100,6,100,7,132,0,131,1, + 90,7,101,4,100,8,100,9,132,0,131,1,90,8,101,4, + 100,19,100,11,100,12,132,1,131,1,90,9,101,4,100,20, + 100,13,100,14,132,1,131,1,90,10,101,4,100,21,100,15, + 100,16,132,1,131,1,90,11,101,4,100,17,100,18,132,0, + 131,1,90,12,100,10,83,0,41,22,218,10,80,97,116,104, + 70,105,110,100,101,114,122,62,77,101,116,97,32,112,97,116, + 104,32,102,105,110,100,101,114,32,102,111,114,32,115,121,115, + 46,112,97,116,104,32,97,110,100,32,112,97,99,107,97,103, + 101,32,95,95,112,97,116,104,95,95,32,97,116,116,114,105, + 98,117,116,101,115,46,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, + 64,0,0,0,116,0,116,1,106,2,160,3,161,0,131,1, + 68,0,93,44,92,2,125,1,125,2,124,2,100,1,117,0, + 114,40,116,1,106,2,124,1,61,0,113,14,116,4,124,2, + 100,2,131,2,114,14,124,2,160,5,161,0,1,0,113,14, + 100,1,83,0,41,3,122,125,67,97,108,108,32,116,104,101, + 32,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, + 101,115,40,41,32,109,101,116,104,111,100,32,111,110,32,97, + 108,108,32,112,97,116,104,32,101,110,116,114,121,32,102,105, + 110,100,101,114,115,10,32,32,32,32,32,32,32,32,115,116, + 111,114,101,100,32,105,110,32,115,121,115,46,112,97,116,104, + 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,115, + 32,40,119,104,101,114,101,32,105,109,112,108,101,109,101,110, + 116,101,100,41,46,78,218,17,105,110,118,97,108,105,100,97, + 116,101,95,99,97,99,104,101,115,41,6,218,4,108,105,115, + 116,114,8,0,0,0,218,19,112,97,116,104,95,105,109,112, + 111,114,116,101,114,95,99,97,99,104,101,218,5,105,116,101, + 109,115,114,128,0,0,0,114,46,1,0,0,41,3,114,193, + 0,0,0,114,116,0,0,0,218,6,102,105,110,100,101,114, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 22,1,0,0,112,4,0,0,115,24,0,0,0,8,1,4, - 6,8,6,8,10,8,4,8,13,8,3,8,3,8,3,8, - 3,8,3,8,3,114,22,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, - 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, - 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, - 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, - 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, - 124,3,131,3,124,0,95,1,100,0,83,0,114,109,0,0, - 0,41,2,114,22,1,0,0,114,24,1,0,0,114,28,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,209,0,0,0,176,4,0,0,115,2,0,0,0,0, - 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,1, - 106,1,161,1,83,0,41,2,122,115,82,101,116,117,114,110, - 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, - 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, - 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, - 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, - 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, - 101,115,112,97,99,101,41,62,41,2,114,61,0,0,0,114, - 125,0,0,0,41,2,114,193,0,0,0,114,216,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,109,111,100,117,108,101,95,114,101,112,114,179,4,0,0, - 115,2,0,0,0,0,7,122,28,95,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,46,109,111,100,117,108,101, - 95,114,101,112,114,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,78,84,114,3,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,182,0,0,0,188,4,0,0,115,2,0, - 0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,105,115,95,112,97,99,107,97,103, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,78,114,39,0,0,0,114,3,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,229,0,0,0,191,4,0,0,115,2,0, - 0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,6,0,0,0,67,0,0,0,115,16,0,0,0,116, - 0,100,1,100,2,100,3,100,4,100,5,141,4,83,0,41, - 6,78,114,39,0,0,0,122,8,60,115,116,114,105,110,103, - 62,114,215,0,0,0,84,41,1,114,231,0,0,0,41,1, - 114,232,0,0,0,114,219,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,213,0,0,0,194,4, - 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, - 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,83,0,114,210,0,0,0,114,3,0,0,0, - 114,211,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,212,0,0,0,197,4,0,0,115,2,0, - 0,0,0,1,122,30,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,0,83,0,114,109,0,0,0,114,3,0,0,0, - 114,253,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,217,0,0,0,200,4,0,0,115,2,0, - 0,0,0,1,122,28,95,78,97,109,101,115,112,97,99,101, - 76,111,97,100,101,114,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,26,0,0,0, - 116,0,160,1,100,1,124,0,106,2,161,2,1,0,116,0, - 160,3,124,0,124,1,161,2,83,0,41,2,122,98,76,111, - 97,100,32,97,32,110,97,109,101,115,112,97,99,101,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, - 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 122,38,110,97,109,101,115,112,97,99,101,32,109,111,100,117, - 108,101,32,108,111,97,100,101,100,32,119,105,116,104,32,112, - 97,116,104,32,123,33,114,125,41,4,114,134,0,0,0,114, - 149,0,0,0,114,24,1,0,0,114,218,0,0,0,114,219, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,220,0,0,0,203,4,0,0,115,8,0,0,0, - 0,7,6,1,4,255,4,2,122,28,95,78,97,109,101,115, - 112,97,99,101,76,111,97,100,101,114,46,108,111,97,100,95, - 109,111,100,117,108,101,78,41,12,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,209,0,0,0,114,207,0, - 0,0,114,44,1,0,0,114,182,0,0,0,114,229,0,0, - 0,114,213,0,0,0,114,212,0,0,0,114,217,0,0,0, - 114,220,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,43,1,0,0,175,4, - 0,0,115,18,0,0,0,8,1,8,3,2,1,10,8,8, - 3,8,3,8,3,8,3,8,3,114,43,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,64,0,0,0,115,118,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,101,4,100,2,100,3,132,0, - 131,1,90,5,101,4,100,4,100,5,132,0,131,1,90,6, - 101,4,100,6,100,7,132,0,131,1,90,7,101,4,100,8, - 100,9,132,0,131,1,90,8,101,4,100,19,100,11,100,12, - 132,1,131,1,90,9,101,4,100,20,100,13,100,14,132,1, - 131,1,90,10,101,4,100,21,100,15,100,16,132,1,131,1, - 90,11,101,4,100,17,100,18,132,0,131,1,90,12,100,10, - 83,0,41,22,218,10,80,97,116,104,70,105,110,100,101,114, - 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, - 101,114,32,102,111,114,32,115,121,115,46,112,97,116,104,32, - 97,110,100,32,112,97,99,107,97,103,101,32,95,95,112,97, - 116,104,95,95,32,97,116,116,114,105,98,117,116,101,115,46, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,64,0,0,0,116,0, - 116,1,106,2,160,3,161,0,131,1,68,0,93,44,92,2, - 125,1,125,2,124,2,100,1,107,8,114,40,116,1,106,2, - 124,1,61,0,113,14,116,4,124,2,100,2,131,2,114,14, - 124,2,160,5,161,0,1,0,113,14,100,1,83,0,41,3, - 122,125,67,97,108,108,32,116,104,101,32,105,110,118,97,108, - 105,100,97,116,101,95,99,97,99,104,101,115,40,41,32,109, - 101,116,104,111,100,32,111,110,32,97,108,108,32,112,97,116, - 104,32,101,110,116,114,121,32,102,105,110,100,101,114,115,10, - 32,32,32,32,32,32,32,32,115,116,111,114,101,100,32,105, - 110,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,115,32,40,119,104,101,114, - 101,32,105,109,112,108,101,109,101,110,116,101,100,41,46,78, - 218,17,105,110,118,97,108,105,100,97,116,101,95,99,97,99, - 104,101,115,41,6,218,4,108,105,115,116,114,8,0,0,0, - 218,19,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,218,5,105,116,101,109,115,114,128,0,0, - 0,114,46,1,0,0,41,3,114,193,0,0,0,114,116,0, - 0,0,218,6,102,105,110,100,101,114,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,46,1,0,0,221,4, - 0,0,115,10,0,0,0,0,4,22,1,8,1,10,1,10, - 1,122,28,80,97,116,104,70,105,110,100,101,114,46,105,110, - 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 9,0,0,0,67,0,0,0,115,84,0,0,0,116,0,106, - 1,100,1,107,9,114,28,116,0,106,1,115,28,116,2,160, - 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, - 44,125,2,122,14,124,2,124,1,131,1,87,0,2,0,1, - 0,83,0,4,0,116,5,107,10,114,76,1,0,1,0,1, - 0,89,0,113,34,89,0,113,34,48,0,113,34,100,1,83, - 0,41,3,122,46,83,101,97,114,99,104,32,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,102,111,114,32,97, - 32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,116, - 104,39,46,78,122,23,115,121,115,46,112,97,116,104,95,104, - 111,111,107,115,32,105,115,32,101,109,112,116,121,41,6,114, - 8,0,0,0,218,10,112,97,116,104,95,104,111,111,107,115, - 114,74,0,0,0,114,75,0,0,0,114,138,0,0,0,114, - 117,0,0,0,41,3,114,193,0,0,0,114,43,0,0,0, - 90,4,104,111,111,107,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,95,112,97,116,104,95,104,111,111, - 107,115,231,4,0,0,115,16,0,0,0,0,3,16,1,12, - 1,10,1,2,1,14,1,14,1,12,2,122,22,80,97,116, - 104,70,105,110,100,101,114,46,95,112,97,116,104,95,104,111, - 111,107,115,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,104,0,0, - 0,124,1,100,1,107,2,114,44,122,12,116,0,160,1,161, - 0,125,1,87,0,110,22,4,0,116,2,107,10,114,42,1, - 0,1,0,1,0,89,0,100,2,83,0,48,0,122,14,116, - 3,106,4,124,1,25,0,125,2,87,0,110,40,4,0,116, - 5,107,10,114,98,1,0,1,0,1,0,124,0,160,6,124, + 46,1,0,0,222,4,0,0,115,10,0,0,0,0,4,22, + 1,8,1,10,1,10,1,122,28,80,97,116,104,70,105,110, + 100,101,114,46,105,110,118,97,108,105,100,97,116,101,95,99, + 97,99,104,101,115,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,9,0,0,0,67,0,0,0,115,82, + 0,0,0,116,0,106,1,100,1,117,1,114,28,116,0,106, + 1,115,28,116,2,160,3,100,2,116,4,161,2,1,0,116, + 0,106,1,68,0,93,42,125,2,122,14,124,2,124,1,131, + 1,87,0,2,0,1,0,83,0,4,0,116,5,121,74,1, + 0,1,0,1,0,89,0,113,34,89,0,113,34,48,0,113, + 34,100,1,83,0,41,3,122,46,83,101,97,114,99,104,32, + 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,102, + 111,114,32,97,32,102,105,110,100,101,114,32,102,111,114,32, + 39,112,97,116,104,39,46,78,122,23,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,105,115,32,101,109,112,116, + 121,41,6,114,8,0,0,0,218,10,112,97,116,104,95,104, + 111,111,107,115,114,74,0,0,0,114,75,0,0,0,114,138, + 0,0,0,114,117,0,0,0,41,3,114,193,0,0,0,114, + 43,0,0,0,90,4,104,111,111,107,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,11,95,112,97,116,104, + 95,104,111,111,107,115,232,4,0,0,115,16,0,0,0,0, + 3,16,1,12,1,10,1,2,1,14,1,12,1,12,2,122, + 22,80,97,116,104,70,105,110,100,101,114,46,95,112,97,116, + 104,95,104,111,111,107,115,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, + 115,100,0,0,0,124,1,100,1,107,2,114,42,122,12,116, + 0,160,1,161,0,125,1,87,0,110,20,4,0,116,2,121, + 40,1,0,1,0,1,0,89,0,100,2,83,0,48,0,122, + 14,116,3,106,4,124,1,25,0,125,2,87,0,110,38,4, + 0,116,5,121,94,1,0,1,0,1,0,124,0,160,6,124, 1,161,1,125,2,124,2,116,3,106,4,124,1,60,0,89, 0,110,2,48,0,124,2,83,0,41,3,122,210,71,101,116, 32,116,104,101,32,102,105,110,100,101,114,32,102,111,114,32, @@ -2137,16 +2134,16 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,114,193,0,0,0,114,43,0,0,0,114,50,1,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, 20,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,244,4,0,0,115,22,0,0,0,0,8, - 8,1,2,1,12,1,14,3,8,1,2,1,14,1,14,1, + 99,97,99,104,101,245,4,0,0,115,22,0,0,0,0,8, + 8,1,2,1,12,1,12,3,8,1,2,1,14,1,12,1, 10,1,16,1,122,31,80,97,116,104,70,105,110,100,101,114, 46,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, 99,97,99,104,101,99,3,0,0,0,0,0,0,0,0,0, 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,82, 0,0,0,116,0,124,2,100,1,131,2,114,26,124,2,160, 1,124,1,161,1,92,2,125,3,125,4,110,14,124,2,160, - 2,124,1,161,1,125,3,103,0,125,4,124,3,100,0,107, - 9,114,60,116,3,160,4,124,1,124,3,161,2,83,0,116, + 2,124,1,161,1,125,3,103,0,125,4,124,3,100,0,117, + 1,114,60,116,3,160,4,124,1,124,3,161,2,83,0,116, 3,160,5,124,1,100,0,161,2,125,5,124,4,124,5,95, 6,124,5,83,0,41,2,78,114,137,0,0,0,41,7,114, 128,0,0,0,114,137,0,0,0,114,206,0,0,0,114,134, @@ -2155,7 +2152,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,114,140,0,0,0,114,141,0,0,0,114,187,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, 0,218,16,95,108,101,103,97,99,121,95,103,101,116,95,115, - 112,101,99,10,5,0,0,115,18,0,0,0,0,4,10,1, + 112,101,99,11,5,0,0,115,18,0,0,0,0,4,10,1, 16,2,10,1,4,1,8,1,12,1,12,1,6,1,122,27, 80,97,116,104,70,105,110,100,101,114,46,95,108,101,103,97, 99,121,95,103,101,116,95,115,112,101,99,78,99,4,0,0, @@ -2163,12 +2160,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,67,0,0,0,115,166,0,0,0,103,0,125,4,124,2, 68,0,93,134,125,5,116,0,124,5,116,1,116,2,102,2, 131,2,115,28,113,8,124,0,160,3,124,5,161,1,125,6, - 124,6,100,1,107,9,114,8,116,4,124,6,100,2,131,2, + 124,6,100,1,117,1,114,8,116,4,124,6,100,2,131,2, 114,70,124,6,160,5,124,1,124,3,161,2,125,7,110,12, 124,0,160,6,124,1,124,6,161,2,125,7,124,7,100,1, - 107,8,114,92,113,8,124,7,106,7,100,1,107,9,114,110, + 117,0,114,92,113,8,124,7,106,7,100,1,117,1,114,110, 124,7,2,0,1,0,83,0,124,7,106,8,125,8,124,8, - 100,1,107,8,114,132,116,9,100,3,131,1,130,1,124,4, + 100,1,117,0,114,132,116,9,100,3,131,1,130,1,124,4, 160,10,124,8,161,1,1,0,113,8,116,11,160,12,124,1, 100,1,161,2,125,7,124,4,124,7,95,8,124,7,83,0, 41,4,122,63,70,105,110,100,32,116,104,101,32,108,111,97, @@ -2186,16 +2183,16 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 112,97,99,101,95,112,97,116,104,90,5,101,110,116,114,121, 114,50,1,0,0,114,187,0,0,0,114,141,0,0,0,114, 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 95,103,101,116,95,115,112,101,99,25,5,0,0,115,40,0, + 95,103,101,116,95,115,112,101,99,26,5,0,0,115,40,0, 0,0,0,5,4,1,8,1,14,1,2,1,10,1,8,1, 10,1,14,2,12,1,8,1,2,1,10,1,8,1,6,1, 8,1,8,5,12,2,12,1,6,1,122,20,80,97,116,104, 70,105,110,100,101,114,46,95,103,101,116,95,115,112,101,99, 99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0, 0,5,0,0,0,67,0,0,0,115,100,0,0,0,124,2, - 100,1,107,8,114,14,116,0,106,1,125,2,124,0,160,2, - 124,1,124,2,124,3,161,3,125,4,124,4,100,1,107,8, - 114,40,100,1,83,0,124,4,106,3,100,1,107,8,114,92, + 100,1,117,0,114,14,116,0,106,1,125,2,124,0,160,2, + 124,1,124,2,124,3,161,3,125,4,124,4,100,1,117,0, + 114,40,100,1,83,0,124,4,106,3,100,1,117,0,114,92, 124,4,106,4,125,5,124,5,114,86,100,1,124,4,95,5, 116,6,124,1,124,5,124,0,106,2,131,3,124,4,95,4, 124,4,83,0,100,1,83,0,110,4,124,4,83,0,100,1, @@ -2213,14 +2210,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 181,0,0,0,114,22,1,0,0,41,6,114,193,0,0,0, 114,139,0,0,0,114,43,0,0,0,114,202,0,0,0,114, 187,0,0,0,114,57,1,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,203,0,0,0,57,5,0, + 0,0,0,114,6,0,0,0,114,203,0,0,0,58,5,0, 0,115,26,0,0,0,0,6,8,1,6,1,14,1,8,1, 4,1,10,1,6,1,4,3,6,1,16,1,4,2,6,2, 122,20,80,97,116,104,70,105,110,100,101,114,46,102,105,110, 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,1,107,8,114,24,100,1,83,0,124,3,106,1, + 124,3,100,1,117,0,114,24,100,1,83,0,124,3,106,1, 83,0,41,2,122,170,102,105,110,100,32,116,104,101,32,109, 111,100,117,108,101,32,111,110,32,115,121,115,46,112,97,116, 104,32,111,114,32,39,112,97,116,104,39,32,98,97,115,101, @@ -2233,7 +2230,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, 78,114,204,0,0,0,114,205,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,81, + 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,82, 5,0,0,115,8,0,0,0,0,8,12,1,8,1,4,1, 122,22,80,97,116,104,70,105,110,100,101,114,46,102,105,110, 100,95,109,111,100,117,108,101,99,1,0,0,0,0,0,0, @@ -2265,7 +2262,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, 4,114,193,0,0,0,114,119,0,0,0,114,120,0,0,0, 114,59,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,60,1,0,0,94,5,0,0,115,4,0, + 6,0,0,0,114,60,1,0,0,95,5,0,0,115,4,0, 0,0,0,10,12,1,122,29,80,97,116,104,70,105,110,100, 101,114,46,102,105,110,100,95,100,105,115,116,114,105,98,117, 116,105,111,110,115,41,1,78,41,2,78,78,41,1,78,41, @@ -2274,7 +2271,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58, 1,0,0,114,203,0,0,0,114,206,0,0,0,114,60,1, 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,45,1,0,0,217,4,0,0,115, + 0,114,6,0,0,0,114,45,1,0,0,218,4,0,0,115, 34,0,0,0,8,2,4,2,2,1,10,9,2,1,10,12, 2,1,10,21,2,1,10,14,2,1,12,31,2,1,12,23, 2,1,12,12,2,1,114,45,1,0,0,99,0,0,0,0, @@ -2319,7 +2316,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 14,125,1,124,1,136,0,102,2,86,0,1,0,113,2,100, 0,83,0,114,109,0,0,0,114,3,0,0,0,114,16,1, 0,0,169,1,114,140,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,19,1,0,0,123,5,0,0,115,4,0,0, + 0,0,0,114,19,1,0,0,124,5,0,0,115,4,0,0, 0,4,0,2,0,122,38,70,105,108,101,70,105,110,100,101, 114,46,95,95,105,110,105,116,95,95,46,60,108,111,99,97, 108,115,62,46,60,103,101,110,101,120,112,114,62,114,70,0, @@ -2332,7 +2329,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, 108,111,97,100,101,114,115,114,189,0,0,0,114,3,0,0, 0,114,62,1,0,0,114,6,0,0,0,114,209,0,0,0, - 117,5,0,0,115,16,0,0,0,0,4,4,1,12,1,26, + 118,5,0,0,115,16,0,0,0,0,4,4,1,12,1,26, 1,6,2,10,1,6,1,8,1,122,19,70,105,108,101,70, 105,110,100,101,114,46,95,95,105,110,105,116,95,95,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, @@ -2341,13 +2338,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, 114,121,32,109,116,105,109,101,46,114,104,0,0,0,78,41, 1,114,64,1,0,0,114,246,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,131, + 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,132, 5,0,0,115,2,0,0,0,0,2,122,28,70,105,108,101, 70,105,110,100,101,114,46,105,110,118,97,108,105,100,97,116, 101,95,99,97,99,104,101,115,99,2,0,0,0,0,0,0, 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, - 124,2,100,1,107,8,114,26,100,1,103,0,102,2,83,0, + 124,2,100,1,117,0,114,26,100,1,103,0,102,2,83,0, 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, 41,2,122,197,84,114,121,32,116,111,32,102,105,110,100,32, 97,32,108,111,97,100,101,114,32,102,111,114,32,116,104,101, @@ -2365,7 +2362,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,140,0,0,0,114,178,0,0,0,41,3,114,118,0, 0,0,114,139,0,0,0,114,187,0,0,0,114,3,0,0, 0,114,3,0,0,0,114,6,0,0,0,114,137,0,0,0, - 137,5,0,0,115,8,0,0,0,0,7,10,1,8,1,8, + 138,5,0,0,115,8,0,0,0,0,7,10,1,8,1,8, 1,122,22,70,105,108,101,70,105,110,100,101,114,46,102,105, 110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,0, 0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,0, @@ -2375,363 +2372,362 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,7,114,118,0,0,0,114,188,0,0,0,114,139,0,0, 0,114,43,0,0,0,90,4,115,109,115,108,114,202,0,0, 0,114,140,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,58,1,0,0,149,5,0,0,115,8, + 114,6,0,0,0,114,58,1,0,0,150,5,0,0,115,8, 0,0,0,0,1,10,1,8,1,2,255,122,20,70,105,108, 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, - 0,0,0,8,0,0,0,67,0,0,0,115,98,1,0,0, + 0,0,0,8,0,0,0,67,0,0,0,115,96,1,0,0, 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, - 161,0,131,1,106,5,125,5,87,0,110,24,4,0,116,6, - 107,10,114,66,1,0,1,0,1,0,100,4,125,5,89,0, - 110,2,48,0,124,5,124,0,106,7,107,3,114,92,124,0, - 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, - 114,114,124,0,106,10,125,6,124,4,160,11,161,0,125,7, - 110,10,124,0,106,12,125,6,124,4,125,7,124,7,124,6, - 107,6,114,218,116,13,124,0,106,2,124,4,131,2,125,8, - 124,0,106,14,68,0,93,58,92,2,125,9,125,10,100,5, - 124,9,23,0,125,11,116,13,124,8,124,11,131,2,125,12, - 116,15,124,12,131,1,114,150,124,0,160,16,124,10,124,1, - 124,12,124,8,103,1,124,2,161,5,2,0,1,0,83,0, - 113,150,116,17,124,8,131,1,125,3,124,0,106,14,68,0, - 93,82,92,2,125,9,125,10,116,13,124,0,106,2,124,4, - 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, - 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, - 107,6,114,224,116,15,124,12,131,1,114,224,124,0,160,16, - 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, - 83,0,113,224,124,3,144,1,114,94,116,18,160,19,100,9, - 124,8,161,2,1,0,116,18,160,20,124,1,100,8,161,2, - 125,13,124,8,103,1,124,13,95,21,124,13,83,0,100,8, - 83,0,41,10,122,111,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,115,112,101,99,32,102,111,114,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,115,32,116,104,101,32,109,97,116,99,104,105,110,103, - 32,115,112,101,99,44,32,111,114,32,78,111,110,101,32,105, - 102,32,110,111,116,32,102,111,117,110,100,46,10,32,32,32, - 32,32,32,32,32,70,114,70,0,0,0,114,27,0,0,0, - 114,104,0,0,0,114,209,0,0,0,122,9,116,114,121,105, - 110,103,32,123,125,41,1,90,9,118,101,114,98,111,115,105, - 116,121,78,122,25,112,111,115,115,105,98,108,101,32,110,97, - 109,101,115,112,97,99,101,32,102,111,114,32,123,125,41,22, - 114,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, - 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, - 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, - 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, - 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, - 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,0, - 0,0,114,134,0,0,0,114,149,0,0,0,114,183,0,0, - 0,114,178,0,0,0,41,14,114,118,0,0,0,114,139,0, - 0,0,114,202,0,0,0,90,12,105,115,95,110,97,109,101, - 115,112,97,99,101,90,11,116,97,105,108,95,109,111,100,117, - 108,101,114,169,0,0,0,90,5,99,97,99,104,101,90,12, - 99,97,99,104,101,95,109,111,100,117,108,101,90,9,98,97, - 115,101,95,112,97,116,104,114,17,1,0,0,114,188,0,0, - 0,90,13,105,110,105,116,95,102,105,108,101,110,97,109,101, - 90,9,102,117,108,108,95,112,97,116,104,114,187,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 203,0,0,0,154,5,0,0,115,74,0,0,0,0,5,4, - 1,14,1,2,1,24,1,14,1,10,1,10,1,8,1,6, - 2,6,1,6,1,10,2,6,1,4,2,8,1,12,1,14, - 1,8,1,10,1,8,1,26,4,8,2,14,1,16,1,16, - 1,12,1,8,1,10,1,2,0,2,255,10,2,6,1,12, - 1,12,1,8,1,4,1,122,20,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, - 0,0,67,0,0,0,115,190,0,0,0,124,0,106,0,125, - 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, - 0,161,1,125,2,87,0,110,30,4,0,116,4,116,5,116, - 6,102,3,107,10,114,58,1,0,1,0,1,0,103,0,125, - 2,89,0,110,2,48,0,116,7,106,8,160,9,100,1,161, - 1,115,84,116,10,124,2,131,1,124,0,95,11,110,74,116, - 10,131,0,125,3,124,2,68,0,93,56,125,4,124,4,160, - 12,100,2,161,1,92,3,125,5,125,6,125,7,124,6,114, - 136,100,3,160,13,124,5,124,7,160,14,161,0,161,2,125, - 8,110,4,124,5,125,8,124,3,160,15,124,8,161,1,1, - 0,113,94,124,3,124,0,95,11,116,7,106,8,160,9,116, - 16,161,1,114,186,100,4,100,5,132,0,124,2,68,0,131, - 1,124,0,95,17,100,6,83,0,41,7,122,68,70,105,108, - 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112, - 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115, - 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111, - 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121, - 46,114,0,0,0,0,114,70,0,0,0,114,60,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0, - 124,0,93,12,125,1,124,1,160,0,161,0,146,2,113,4, - 83,0,114,3,0,0,0,41,1,114,105,0,0,0,41,2, - 114,31,0,0,0,90,2,102,110,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,9,60,115,101,116,99,111, - 109,112,62,231,5,0,0,115,4,0,0,0,6,0,2,0, - 122,41,70,105,108,101,70,105,110,100,101,114,46,95,102,105, - 108,108,95,99,97,99,104,101,46,60,108,111,99,97,108,115, - 62,46,60,115,101,116,99,111,109,112,62,78,41,18,114,43, - 0,0,0,114,2,0,0,0,114,7,1,0,0,114,54,0, - 0,0,114,3,1,0,0,218,15,80,101,114,109,105,115,115, - 105,111,110,69,114,114,111,114,218,18,78,111,116,65,68,105, - 114,101,99,116,111,114,121,69,114,114,111,114,114,8,0,0, - 0,114,9,0,0,0,114,10,0,0,0,114,65,1,0,0, - 114,66,1,0,0,114,100,0,0,0,114,61,0,0,0,114, - 105,0,0,0,218,3,97,100,100,114,11,0,0,0,114,67, - 1,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, - 8,1,0,0,90,21,108,111,119,101,114,95,115,117,102,102, - 105,120,95,99,111,110,116,101,110,116,115,114,41,1,0,0, - 114,116,0,0,0,114,29,1,0,0,114,17,1,0,0,90, - 8,110,101,119,95,110,97,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,69,1,0,0,202,5,0, - 0,115,34,0,0,0,0,2,6,1,2,1,22,1,20,3, - 10,3,12,1,12,7,6,1,8,1,16,1,4,1,18,2, - 4,1,12,1,6,1,12,1,122,22,70,105,108,101,70,105, - 110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,101, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,7,0,0,0,115,18,0,0,0,135,0, - 135,1,102,2,100,1,100,2,132,8,125,2,124,2,83,0, - 41,3,97,20,1,0,0,65,32,99,108,97,115,115,32,109, - 101,116,104,111,100,32,119,104,105,99,104,32,114,101,116,117, - 114,110,115,32,97,32,99,108,111,115,117,114,101,32,116,111, - 32,117,115,101,32,111,110,32,115,121,115,46,112,97,116,104, - 95,104,111,111,107,10,32,32,32,32,32,32,32,32,119,104, - 105,99,104,32,119,105,108,108,32,114,101,116,117,114,110,32, - 97,110,32,105,110,115,116,97,110,99,101,32,117,115,105,110, - 103,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, - 108,111,97,100,101,114,115,32,97,110,100,32,116,104,101,32, - 112,97,116,104,10,32,32,32,32,32,32,32,32,99,97,108, - 108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,117, - 114,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32, - 116,104,101,32,112,97,116,104,32,99,97,108,108,101,100,32, - 111,110,32,116,104,101,32,99,108,111,115,117,114,101,32,105, - 115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114, - 121,44,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 115,10,32,32,32,32,32,32,32,32,114,97,105,115,101,100, - 46,10,10,32,32,32,32,32,32,32,32,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, - 19,0,0,0,115,34,0,0,0,116,0,124,0,131,1,115, - 20,116,1,100,1,124,0,100,2,141,2,130,1,136,0,124, - 0,102,1,136,1,158,2,142,0,83,0,41,3,122,45,80, - 97,116,104,32,104,111,111,107,32,102,111,114,32,105,109,112, - 111,114,116,108,105,98,46,109,97,99,104,105,110,101,114,121, - 46,70,105,108,101,70,105,110,100,101,114,46,122,30,111,110, - 108,121,32,100,105,114,101,99,116,111,114,105,101,115,32,97, - 114,101,32,115,117,112,112,111,114,116,101,100,114,47,0,0, - 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, - 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, - 0,0,0,114,6,0,0,0,218,24,112,97,116,104,95,104, - 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100, - 101,114,243,5,0,0,115,6,0,0,0,0,2,8,1,12, - 1,122,54,70,105,108,101,70,105,110,100,101,114,46,112,97, - 116,104,95,104,111,111,107,46,60,108,111,99,97,108,115,62, - 46,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, - 105,108,101,70,105,110,100,101,114,114,3,0,0,0,41,3, - 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, - 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, - 112,97,116,104,95,104,111,111,107,233,5,0,0,115,4,0, - 0,0,0,10,14,6,122,20,70,105,108,101,70,105,110,100, - 101,114,46,112,97,116,104,95,104,111,111,107,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, - 106,1,161,1,83,0,41,2,78,122,16,70,105,108,101,70, - 105,110,100,101,114,40,123,33,114,125,41,41,2,114,61,0, - 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, - 251,5,0,0,115,2,0,0,0,0,1,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,95, - 41,1,78,41,15,114,125,0,0,0,114,124,0,0,0,114, - 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,46, - 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, - 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, - 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,61,1,0,0,108,5,0,0,115,22,0, - 0,0,8,2,4,7,8,14,8,4,4,2,8,12,8,5, - 10,48,8,31,2,1,10,17,114,61,1,0,0,99,4,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, - 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, - 1,161,1,125,4,124,0,160,0,100,2,161,1,125,5,124, - 4,115,66,124,5,114,36,124,5,106,1,125,4,110,30,124, - 2,124,3,107,2,114,56,116,2,124,1,124,2,131,2,125, - 4,110,10,116,3,124,1,124,2,131,2,125,4,124,5,115, - 84,116,4,124,1,124,2,124,4,100,3,141,3,125,5,122, - 36,124,5,124,0,100,2,60,0,124,4,124,0,100,1,60, - 0,124,2,124,0,100,4,60,0,124,3,124,0,100,5,60, - 0,87,0,110,20,4,0,116,5,107,10,114,140,1,0,1, - 0,1,0,89,0,110,2,48,0,100,0,83,0,41,6,78, - 218,10,95,95,108,111,97,100,101,114,95,95,218,8,95,95, - 115,112,101,99,95,95,114,62,1,0,0,90,8,95,95,102, - 105,108,101,95,95,90,10,95,95,99,97,99,104,101,100,95, - 95,41,6,218,3,103,101,116,114,140,0,0,0,114,15,1, - 0,0,114,9,1,0,0,114,190,0,0,0,218,9,69,120, - 99,101,112,116,105,111,110,41,6,90,2,110,115,114,116,0, - 0,0,90,8,112,97,116,104,110,97,109,101,90,9,99,112, - 97,116,104,110,97,109,101,114,140,0,0,0,114,187,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, - 1,6,0,0,115,34,0,0,0,0,2,10,1,10,1,4, - 1,4,1,8,1,8,1,12,2,10,1,4,1,14,1,2, - 1,8,1,8,1,8,1,12,1,14,2,114,81,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 116,1,160,2,161,0,102,2,125,0,116,3,116,4,102,2, - 125,1,116,5,116,6,102,2,125,2,124,0,124,1,124,2, - 103,3,83,0,41,1,122,95,82,101,116,117,114,110,115,32, - 97,32,108,105,115,116,32,111,102,32,102,105,108,101,45,98, - 97,115,101,100,32,109,111,100,117,108,101,32,108,111,97,100, - 101,114,115,46,10,10,32,32,32,32,69,97,99,104,32,105, - 116,101,109,32,105,115,32,97,32,116,117,112,108,101,32,40, - 108,111,97,100,101,114,44,32,115,117,102,102,105,120,101,115, - 41,46,10,32,32,32,32,41,7,114,252,0,0,0,114,163, - 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, - 117,102,102,105,120,101,115,114,9,1,0,0,114,101,0,0, - 0,114,15,1,0,0,114,88,0,0,0,41,3,90,10,101, - 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, - 101,90,8,98,121,116,101,99,111,100,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,184,0,0,0,24, - 6,0,0,115,8,0,0,0,0,5,12,1,8,1,8,1, - 114,184,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,12,0,0,0,9,0,0,0,67,0,0,0,115,178, - 1,0,0,124,0,97,0,116,0,106,1,97,1,116,0,106, - 2,97,2,116,1,106,3,116,4,25,0,125,1,100,1,68, - 0,93,48,125,2,124,2,116,1,106,3,107,7,114,56,116, - 0,160,5,124,2,161,1,125,3,110,10,116,1,106,3,124, - 2,25,0,125,3,116,6,124,1,124,2,124,3,131,3,1, - 0,113,30,100,2,100,3,103,1,102,2,100,4,100,5,100, - 3,103,2,102,2,102,2,125,4,124,4,68,0,93,110,92, - 2,125,5,125,6,116,7,100,6,100,7,132,0,124,6,68, - 0,131,1,131,1,115,136,74,0,130,1,124,6,100,8,25, - 0,125,7,124,5,116,1,106,3,107,6,114,170,116,1,106, - 3,124,5,25,0,125,8,1,0,113,226,113,106,122,20,116, - 0,160,5,124,5,161,1,125,8,87,0,1,0,113,226,87, - 0,113,106,4,0,116,8,107,10,114,214,1,0,1,0,1, - 0,89,0,113,106,89,0,113,106,48,0,113,106,116,8,100, - 9,131,1,130,1,116,6,124,1,100,10,124,8,131,3,1, - 0,116,6,124,1,100,11,124,7,131,3,1,0,116,6,124, - 1,100,12,100,13,160,9,124,6,161,1,131,3,1,0,116, - 6,124,1,100,14,100,15,100,16,132,0,124,6,68,0,131, - 1,131,3,1,0,116,0,160,5,100,17,161,1,125,9,116, - 6,124,1,100,17,124,9,131,3,1,0,116,0,160,5,100, - 18,161,1,125,10,116,6,124,1,100,18,124,10,131,3,1, - 0,124,5,100,4,107,2,144,1,114,110,116,0,160,5,100, - 19,161,1,125,11,116,6,124,1,100,20,124,11,131,3,1, - 0,116,6,124,1,100,21,116,10,131,0,131,3,1,0,116, - 11,160,12,116,2,160,13,161,0,161,1,1,0,124,5,100, - 4,107,2,144,1,114,174,116,14,160,15,100,22,161,1,1, - 0,100,23,116,11,107,6,144,1,114,174,100,24,116,16,95, - 17,100,25,83,0,41,26,122,205,83,101,116,117,112,32,116, - 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, - 112,111,114,116,101,114,115,32,102,111,114,32,105,109,112,111, - 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, - 110,103,32,110,101,101,100,101,100,10,32,32,32,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, - 109,32,105,110,116,111,32,116,104,101,32,103,108,111,98,97, - 108,32,110,97,109,101,115,112,97,99,101,46,10,10,32,32, - 32,32,79,116,104,101,114,32,99,111,109,112,111,110,101,110, - 116,115,32,97,114,101,32,101,120,116,114,97,99,116,101,100, - 32,102,114,111,109,32,116,104,101,32,99,111,114,101,32,98, - 111,111,116,115,116,114,97,112,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,41,4,114,63,0,0,0,114,74,0, - 0,0,218,8,98,117,105,108,116,105,110,115,114,160,0,0, - 0,90,5,112,111,115,105,120,250,1,47,90,2,110,116,250, - 1,92,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,115,0,0,0,115,26,0,0,0, - 124,0,93,18,125,1,116,0,124,1,131,1,100,0,107,2, - 86,0,1,0,113,2,100,1,83,0,41,2,114,38,0,0, - 0,78,41,1,114,22,0,0,0,41,2,114,31,0,0,0, - 114,94,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,19,1,0,0,60,6,0,0,115,4,0, - 0,0,4,0,2,0,122,25,95,115,101,116,117,112,46,60, - 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, - 62,114,72,0,0,0,122,30,105,109,112,111,114,116,108,105, - 98,32,114,101,113,117,105,114,101,115,32,112,111,115,105,120, - 32,111,114,32,110,116,114,2,0,0,0,114,34,0,0,0, - 114,30,0,0,0,114,39,0,0,0,114,57,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, - 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, - 4,83,0,41,1,114,73,0,0,0,114,3,0,0,0,41, - 2,114,31,0,0,0,218,1,115,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,70,1,0,0,76,6,0, - 0,115,4,0,0,0,6,0,2,0,122,25,95,115,101,116, - 117,112,46,60,108,111,99,97,108,115,62,46,60,115,101,116, - 99,111,109,112,62,90,7,95,116,104,114,101,97,100,90,8, - 95,119,101,97,107,114,101,102,90,6,119,105,110,114,101,103, - 114,192,0,0,0,114,7,0,0,0,122,4,46,112,121,119, - 122,6,95,100,46,112,121,100,84,78,41,18,114,134,0,0, - 0,114,8,0,0,0,114,163,0,0,0,114,31,1,0,0, - 114,125,0,0,0,90,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,114,129,0,0,0,218,3, - 97,108,108,114,117,0,0,0,114,35,0,0,0,114,13,0, - 0,0,114,21,1,0,0,114,167,0,0,0,114,82,1,0, - 0,114,101,0,0,0,114,186,0,0,0,114,191,0,0,0, - 114,195,0,0,0,41,12,218,17,95,98,111,111,116,115,116, - 114,97,112,95,109,111,100,117,108,101,90,11,115,101,108,102, - 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, - 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, - 111,100,117,108,101,90,10,111,115,95,100,101,116,97,105,108, - 115,90,10,98,117,105,108,116,105,110,95,111,115,114,30,0, - 0,0,114,34,0,0,0,90,9,111,115,95,109,111,100,117, - 108,101,90,13,116,104,114,101,97,100,95,109,111,100,117,108, - 101,90,14,119,101,97,107,114,101,102,95,109,111,100,117,108, - 101,90,13,119,105,110,114,101,103,95,109,111,100,117,108,101, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 6,95,115,101,116,117,112,35,6,0,0,115,78,0,0,0, - 0,8,4,1,6,1,6,3,10,1,8,1,10,1,12,2, - 10,1,14,3,22,1,12,2,22,1,8,1,10,1,10,1, - 6,2,2,1,10,1,10,1,14,1,12,2,8,1,12,1, - 12,1,18,1,22,3,10,1,12,3,10,1,12,3,10,1, - 10,1,12,3,14,1,14,1,10,1,10,1,10,1,114,89, - 1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0, - 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116, - 2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161, - 1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100, - 1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116, - 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, - 112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46, - 78,41,10,114,89,1,0,0,114,184,0,0,0,114,8,0, - 0,0,114,51,1,0,0,114,167,0,0,0,114,61,1,0, - 0,114,76,1,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,186,0,0,0,114,45,1,0,0,41,2,114,88,1, - 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111, - 97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,8,95,105,110,115,116,97,108,108,100,6, - 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, - 91,1,0,0,41,1,114,59,0,0,0,41,1,78,41,3, - 78,78,78,41,2,114,72,0,0,0,114,72,0,0,0,41, - 1,84,41,1,78,41,1,78,41,63,114,127,0,0,0,114, - 12,0,0,0,90,37,95,67,65,83,69,95,73,78,83,69, - 78,83,73,84,73,86,69,95,80,76,65,84,70,79,82,77, - 83,95,66,89,84,69,83,95,75,69,89,114,11,0,0,0, - 114,13,0,0,0,114,20,0,0,0,114,26,0,0,0,114, - 28,0,0,0,114,37,0,0,0,114,46,0,0,0,114,48, - 0,0,0,114,52,0,0,0,114,53,0,0,0,114,55,0, - 0,0,114,58,0,0,0,114,68,0,0,0,218,4,116,121, - 112,101,218,8,95,95,99,111,100,101,95,95,114,162,0,0, - 0,114,18,0,0,0,114,148,0,0,0,114,17,0,0,0, - 114,23,0,0,0,114,236,0,0,0,114,91,0,0,0,114, - 87,0,0,0,114,101,0,0,0,114,88,0,0,0,90,23, - 68,69,66,85,71,95,66,89,84,69,67,79,68,69,95,83, - 85,70,70,73,88,69,83,90,27,79,80,84,73,77,73,90, - 69,68,95,66,89,84,69,67,79,68,69,95,83,85,70,70, - 73,88,69,83,114,97,0,0,0,114,102,0,0,0,114,108, - 0,0,0,114,112,0,0,0,114,114,0,0,0,114,136,0, - 0,0,114,143,0,0,0,114,152,0,0,0,114,156,0,0, - 0,114,158,0,0,0,114,165,0,0,0,114,170,0,0,0, - 114,171,0,0,0,114,176,0,0,0,218,6,111,98,106,101, - 99,116,114,185,0,0,0,114,190,0,0,0,114,191,0,0, - 0,114,208,0,0,0,114,221,0,0,0,114,239,0,0,0, - 114,9,1,0,0,114,15,1,0,0,114,21,1,0,0,114, - 252,0,0,0,114,22,1,0,0,114,43,1,0,0,114,45, - 1,0,0,114,61,1,0,0,114,81,1,0,0,114,184,0, - 0,0,114,89,1,0,0,114,91,1,0,0,114,3,0,0, + 161,0,131,1,106,5,125,5,87,0,110,22,4,0,116,6, + 121,64,1,0,1,0,1,0,100,4,125,5,89,0,110,2, + 48,0,124,5,124,0,106,7,107,3,114,90,124,0,160,8, + 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,112, + 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, + 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, + 114,216,116,13,124,0,106,2,124,4,131,2,125,8,124,0, + 106,14,68,0,93,58,92,2,125,9,125,10,100,5,124,9, + 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, + 124,12,131,1,114,148,124,0,160,16,124,10,124,1,124,12, + 124,8,103,1,124,2,161,5,2,0,1,0,83,0,113,148, + 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,82, + 92,2,125,9,125,10,116,13,124,0,106,2,124,4,124,9, + 23,0,131,2,125,12,116,18,106,19,100,6,124,12,100,3, + 100,7,141,3,1,0,124,7,124,9,23,0,124,6,118,0, + 114,222,116,15,124,12,131,1,114,222,124,0,160,16,124,10, + 124,1,124,12,100,8,124,2,161,5,2,0,1,0,83,0, + 113,222,124,3,144,1,114,92,116,18,160,19,100,9,124,8, + 161,2,1,0,116,18,160,20,124,1,100,8,161,2,125,13, + 124,8,103,1,124,13,95,21,124,13,83,0,100,8,83,0, + 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, + 97,32,115,112,101,99,32,102,111,114,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, + 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, + 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, + 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, + 32,32,32,70,114,70,0,0,0,114,27,0,0,0,114,104, + 0,0,0,114,209,0,0,0,122,9,116,114,121,105,110,103, + 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, + 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, + 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,40, + 0,0,0,114,48,0,0,0,114,43,0,0,0,114,2,0, + 0,0,114,54,0,0,0,114,10,1,0,0,114,49,0,0, + 0,114,64,1,0,0,218,11,95,102,105,108,108,95,99,97, + 99,104,101,114,7,0,0,0,114,67,1,0,0,114,105,0, + 0,0,114,66,1,0,0,114,37,0,0,0,114,63,1,0, + 0,114,53,0,0,0,114,58,1,0,0,114,55,0,0,0, + 114,134,0,0,0,114,149,0,0,0,114,183,0,0,0,114, + 178,0,0,0,41,14,114,118,0,0,0,114,139,0,0,0, + 114,202,0,0,0,90,12,105,115,95,110,97,109,101,115,112, + 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, + 114,169,0,0,0,90,5,99,97,99,104,101,90,12,99,97, + 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, + 95,112,97,116,104,114,17,1,0,0,114,188,0,0,0,90, + 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, + 102,117,108,108,95,112,97,116,104,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,203,0, + 0,0,155,5,0,0,115,74,0,0,0,0,5,4,1,14, + 1,2,1,24,1,12,1,10,1,10,1,8,1,6,2,6, + 1,6,1,10,2,6,1,4,2,8,1,12,1,14,1,8, + 1,10,1,8,1,26,4,8,2,14,1,16,1,16,1,12, + 1,8,1,10,1,2,0,2,255,10,2,6,1,12,1,12, + 1,8,1,4,1,122,20,70,105,108,101,70,105,110,100,101, + 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0, + 67,0,0,0,115,188,0,0,0,124,0,106,0,125,1,122, + 22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161, + 1,125,2,87,0,110,28,4,0,116,4,116,5,116,6,102, + 3,121,56,1,0,1,0,1,0,103,0,125,2,89,0,110, + 2,48,0,116,7,106,8,160,9,100,1,161,1,115,82,116, + 10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125, + 3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161, + 1,92,3,125,5,125,6,125,7,124,6,114,134,100,3,160, + 13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124, + 5,125,8,124,3,160,15,124,8,161,1,1,0,113,92,124, + 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114, + 184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95, + 17,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104, + 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, + 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, + 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, + 105,115,32,100,105,114,101,99,116,111,114,121,46,114,0,0, + 0,0,114,70,0,0,0,114,60,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,12, + 125,1,124,1,160,0,161,0,146,2,113,4,83,0,114,3, + 0,0,0,41,1,114,105,0,0,0,41,2,114,31,0,0, + 0,90,2,102,110,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,9,60,115,101,116,99,111,109,112,62,232, + 5,0,0,115,4,0,0,0,6,0,2,0,122,41,70,105, + 108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,99, + 97,99,104,101,46,60,108,111,99,97,108,115,62,46,60,115, + 101,116,99,111,109,112,62,78,41,18,114,43,0,0,0,114, + 2,0,0,0,114,7,1,0,0,114,54,0,0,0,114,3, + 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69, + 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116, + 111,114,121,69,114,114,111,114,114,8,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,65,1,0,0,114,66,1,0, + 0,114,100,0,0,0,114,61,0,0,0,114,105,0,0,0, + 218,3,97,100,100,114,11,0,0,0,114,67,1,0,0,41, + 9,114,118,0,0,0,114,43,0,0,0,114,8,1,0,0, + 90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,99, + 111,110,116,101,110,116,115,114,41,1,0,0,114,116,0,0, + 0,114,29,1,0,0,114,17,1,0,0,90,8,110,101,119, + 95,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,69,1,0,0,203,5,0,0,115,34,0, + 0,0,0,2,6,1,2,1,22,1,18,3,10,3,12,1, + 12,7,6,1,8,1,16,1,4,1,18,2,4,1,12,1, + 6,1,12,1,122,22,70,105,108,101,70,105,110,100,101,114, + 46,95,102,105,108,108,95,99,97,99,104,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,7,0,0,0,115,18,0,0,0,135,0,135,1,102,2, + 100,1,100,2,132,8,125,2,124,2,83,0,41,3,97,20, + 1,0,0,65,32,99,108,97,115,115,32,109,101,116,104,111, + 100,32,119,104,105,99,104,32,114,101,116,117,114,110,115,32, + 97,32,99,108,111,115,117,114,101,32,116,111,32,117,115,101, + 32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111, + 107,10,32,32,32,32,32,32,32,32,119,104,105,99,104,32, + 119,105,108,108,32,114,101,116,117,114,110,32,97,110,32,105, + 110,115,116,97,110,99,101,32,117,115,105,110,103,32,116,104, + 101,32,115,112,101,99,105,102,105,101,100,32,108,111,97,100, + 101,114,115,32,97,110,100,32,116,104,101,32,112,97,116,104, + 10,32,32,32,32,32,32,32,32,99,97,108,108,101,100,32, + 111,110,32,116,104,101,32,99,108,111,115,117,114,101,46,10, + 10,32,32,32,32,32,32,32,32,73,102,32,116,104,101,32, + 112,97,116,104,32,99,97,108,108,101,100,32,111,110,32,116, + 104,101,32,99,108,111,115,117,114,101,32,105,115,32,110,111, + 116,32,97,32,100,105,114,101,99,116,111,114,121,44,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,115,10,32,32, + 32,32,32,32,32,32,114,97,105,115,101,100,46,10,10,32, + 32,32,32,32,32,32,32,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,19,0,0,0, + 115,34,0,0,0,116,0,124,0,131,1,115,20,116,1,100, + 1,124,0,100,2,141,2,130,1,136,0,124,0,102,1,136, + 1,158,2,142,0,83,0,41,3,122,45,80,97,116,104,32, + 104,111,111,107,32,102,111,114,32,105,109,112,111,114,116,108, + 105,98,46,109,97,99,104,105,110,101,114,121,46,70,105,108, + 101,70,105,110,100,101,114,46,122,30,111,110,108,121,32,100, + 105,114,101,99,116,111,114,105,101,115,32,97,114,101,32,115, + 117,112,112,111,114,116,101,100,114,47,0,0,0,41,2,114, + 55,0,0,0,114,117,0,0,0,114,47,0,0,0,169,2, + 114,193,0,0,0,114,68,1,0,0,114,3,0,0,0,114, + 6,0,0,0,218,24,112,97,116,104,95,104,111,111,107,95, + 102,111,114,95,70,105,108,101,70,105,110,100,101,114,244,5, + 0,0,115,6,0,0,0,0,2,8,1,12,1,122,54,70, + 105,108,101,70,105,110,100,101,114,46,112,97,116,104,95,104, + 111,111,107,46,60,108,111,99,97,108,115,62,46,112,97,116, + 104,95,104,111,111,107,95,102,111,114,95,70,105,108,101,70, + 105,110,100,101,114,114,3,0,0,0,41,3,114,193,0,0, + 0,114,68,1,0,0,114,75,1,0,0,114,3,0,0,0, + 114,74,1,0,0,114,6,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,234,5,0,0,115,4,0,0,0,0,10, + 14,6,122,20,70,105,108,101,70,105,110,100,101,114,46,112, + 97,116,104,95,104,111,111,107,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,100,1,160,0,124,0,106,1,161,1, + 83,0,41,2,78,122,16,70,105,108,101,70,105,110,100,101, + 114,40,123,33,114,125,41,41,2,114,61,0,0,0,114,43, + 0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,39,1,0,0,252,5,0,0, + 115,2,0,0,0,0,1,122,19,70,105,108,101,70,105,110, + 100,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, + 15,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,209,0,0,0,114,46,1,0,0,114, + 143,0,0,0,114,206,0,0,0,114,137,0,0,0,114,58, + 1,0,0,114,203,0,0,0,114,69,1,0,0,114,207,0, + 0,0,114,76,1,0,0,114,39,1,0,0,114,3,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,126, - 0,0,0,4,22,4,1,4,1,2,1,2,255,4,4,8, - 17,8,5,8,5,8,6,8,6,8,12,8,10,8,9,8, - 5,8,7,8,9,10,22,10,127,0,16,16,1,12,2,4, - 1,4,2,6,2,6,2,8,2,16,71,8,40,8,19,8, - 12,8,12,8,28,8,17,8,33,8,28,8,24,10,13,10, - 10,10,11,8,14,6,3,4,1,2,255,12,68,14,64,14, - 29,16,127,0,17,14,72,18,45,18,26,4,3,18,53,14, - 63,14,42,14,127,0,20,14,127,0,22,10,23,8,11,8, - 65, + 114,61,1,0,0,109,5,0,0,115,22,0,0,0,8,2, + 4,7,8,14,8,4,4,2,8,12,8,5,10,48,8,31, + 2,1,10,17,114,61,1,0,0,99,4,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,144,0,0,0,124,0,160,0,100,1,161,1,125, + 4,124,0,160,0,100,2,161,1,125,5,124,4,115,66,124, + 5,114,36,124,5,106,1,125,4,110,30,124,2,124,3,107, + 2,114,56,116,2,124,1,124,2,131,2,125,4,110,10,116, + 3,124,1,124,2,131,2,125,4,124,5,115,84,116,4,124, + 1,124,2,124,4,100,3,141,3,125,5,122,36,124,5,124, + 0,100,2,60,0,124,4,124,0,100,1,60,0,124,2,124, + 0,100,4,60,0,124,3,124,0,100,5,60,0,87,0,110, + 18,4,0,116,5,121,138,1,0,1,0,1,0,89,0,110, + 2,48,0,100,0,83,0,41,6,78,218,10,95,95,108,111, + 97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95, + 114,62,1,0,0,90,8,95,95,102,105,108,101,95,95,90, + 10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103, + 101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0, + 0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111, + 110,41,6,90,2,110,115,114,116,0,0,0,90,8,112,97, + 116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109, + 101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,2,6,0,0,115,34, + 0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8, + 1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8, + 1,12,1,12,2,114,81,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, + 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, + 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1, + 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, + 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, + 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, + 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, + 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, + 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, + 32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101, + 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, + 115,114,9,1,0,0,114,101,0,0,0,114,15,1,0,0, + 114,88,0,0,0,41,3,90,10,101,120,116,101,110,115,105, + 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, + 101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,184,0,0,0,25,6,0,0,115,8,0, + 0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, + 9,0,0,0,67,0,0,0,115,176,1,0,0,124,0,97, + 0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106, + 3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124, + 2,116,1,106,3,118,1,114,56,116,0,160,5,124,2,161, + 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, + 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, + 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, + 2,125,4,124,4,68,0,93,108,92,2,125,5,125,6,116, + 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, + 136,74,0,130,1,124,6,100,8,25,0,125,7,124,5,116, + 1,106,3,118,0,114,170,116,1,106,3,124,5,25,0,125, + 8,1,0,113,224,113,106,122,20,116,0,160,5,124,5,161, + 1,125,8,87,0,1,0,113,224,87,0,113,106,4,0,116, + 8,121,212,1,0,1,0,1,0,89,0,113,106,89,0,113, + 106,48,0,113,106,116,8,100,9,131,1,130,1,116,6,124, + 1,100,10,124,8,131,3,1,0,116,6,124,1,100,11,124, + 7,131,3,1,0,116,6,124,1,100,12,100,13,160,9,124, + 6,161,1,131,3,1,0,116,6,124,1,100,14,100,15,100, + 16,132,0,124,6,68,0,131,1,131,3,1,0,116,0,160, + 5,100,17,161,1,125,9,116,6,124,1,100,17,124,9,131, + 3,1,0,116,0,160,5,100,18,161,1,125,10,116,6,124, + 1,100,18,124,10,131,3,1,0,124,5,100,4,107,2,144, + 1,114,108,116,0,160,5,100,19,161,1,125,11,116,6,124, + 1,100,20,124,11,131,3,1,0,116,6,124,1,100,21,116, + 10,131,0,131,3,1,0,116,11,160,12,116,2,160,13,161, + 0,161,1,1,0,124,5,100,4,107,2,144,1,114,172,116, + 14,160,15,100,22,161,1,1,0,100,23,116,11,118,0,144, + 1,114,172,100,24,116,16,95,17,100,25,83,0,41,26,122, + 205,83,101,116,117,112,32,116,104,101,32,112,97,116,104,45, + 98,97,115,101,100,32,105,109,112,111,114,116,101,114,115,32, + 102,111,114,32,105,109,112,111,114,116,108,105,98,32,98,121, + 32,105,109,112,111,114,116,105,110,103,32,110,101,101,100,101, + 100,10,32,32,32,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,32,97,110,100,32,105,110,106,101,99, + 116,105,110,103,32,116,104,101,109,32,105,110,116,111,32,116, + 104,101,32,103,108,111,98,97,108,32,110,97,109,101,115,112, + 97,99,101,46,10,10,32,32,32,32,79,116,104,101,114,32, + 99,111,109,112,111,110,101,110,116,115,32,97,114,101,32,101, + 120,116,114,97,99,116,101,100,32,102,114,111,109,32,116,104, + 101,32,99,111,114,101,32,98,111,111,116,115,116,114,97,112, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,41,4, + 114,63,0,0,0,114,74,0,0,0,218,8,98,117,105,108, + 116,105,110,115,114,160,0,0,0,90,5,112,111,115,105,120, + 250,1,47,90,2,110,116,250,1,92,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,115, + 0,0,0,115,26,0,0,0,124,0,93,18,125,1,116,0, + 124,1,131,1,100,0,107,2,86,0,1,0,113,2,100,1, + 83,0,41,2,114,38,0,0,0,78,41,1,114,22,0,0, + 0,41,2,114,31,0,0,0,114,94,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,19,1,0, + 0,61,6,0,0,115,4,0,0,0,4,0,2,0,122,25, + 95,115,101,116,117,112,46,60,108,111,99,97,108,115,62,46, + 60,103,101,110,101,120,112,114,62,114,72,0,0,0,122,30, + 105,109,112,111,114,116,108,105,98,32,114,101,113,117,105,114, + 101,115,32,112,111,115,105,120,32,111,114,32,110,116,114,2, + 0,0,0,114,34,0,0,0,114,30,0,0,0,114,39,0, + 0,0,114,57,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,83,0,0,0, + 115,22,0,0,0,104,0,124,0,93,14,125,1,100,0,124, + 1,155,0,157,2,146,2,113,4,83,0,41,1,114,73,0, + 0,0,114,3,0,0,0,41,2,114,31,0,0,0,218,1, + 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,70,1,0,0,77,6,0,0,115,4,0,0,0,6,0, + 2,0,122,25,95,115,101,116,117,112,46,60,108,111,99,97, + 108,115,62,46,60,115,101,116,99,111,109,112,62,90,7,95, + 116,104,114,101,97,100,90,8,95,119,101,97,107,114,101,102, + 90,6,119,105,110,114,101,103,114,192,0,0,0,114,7,0, + 0,0,122,4,46,112,121,119,122,6,95,100,46,112,121,100, + 84,78,41,18,114,134,0,0,0,114,8,0,0,0,114,163, + 0,0,0,114,31,1,0,0,114,125,0,0,0,90,18,95, + 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, + 101,114,129,0,0,0,218,3,97,108,108,114,117,0,0,0, + 114,35,0,0,0,114,13,0,0,0,114,21,1,0,0,114, + 167,0,0,0,114,82,1,0,0,114,101,0,0,0,114,186, + 0,0,0,114,191,0,0,0,114,195,0,0,0,41,12,218, + 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, + 108,101,90,11,115,101,108,102,95,109,111,100,117,108,101,90, + 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, + 117,105,108,116,105,110,95,109,111,100,117,108,101,90,10,111, + 115,95,100,101,116,97,105,108,115,90,10,98,117,105,108,116, + 105,110,95,111,115,114,30,0,0,0,114,34,0,0,0,90, + 9,111,115,95,109,111,100,117,108,101,90,13,116,104,114,101, + 97,100,95,109,111,100,117,108,101,90,14,119,101,97,107,114, + 101,102,95,109,111,100,117,108,101,90,13,119,105,110,114,101, + 103,95,109,111,100,117,108,101,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,36, + 6,0,0,115,78,0,0,0,0,8,4,1,6,1,6,3, + 10,1,8,1,10,1,12,2,10,1,14,3,22,1,12,2, + 22,1,8,1,10,1,10,1,6,2,2,1,10,1,10,1, + 12,1,12,2,8,1,12,1,12,1,18,1,22,3,10,1, + 12,3,10,1,12,3,10,1,10,1,12,3,14,1,14,1, + 10,1,10,1,10,1,114,89,1,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 67,0,0,0,115,50,0,0,0,116,0,124,0,131,1,1, + 0,116,1,131,0,125,1,116,2,106,3,160,4,116,5,106, + 6,124,1,142,0,103,1,161,1,1,0,116,2,106,7,160, + 8,116,9,161,1,1,0,100,1,83,0,41,2,122,41,73, + 110,115,116,97,108,108,32,116,104,101,32,112,97,116,104,45, + 98,97,115,101,100,32,105,109,112,111,114,116,32,99,111,109, + 112,111,110,101,110,116,115,46,78,41,10,114,89,1,0,0, + 114,184,0,0,0,114,8,0,0,0,114,51,1,0,0,114, + 167,0,0,0,114,61,1,0,0,114,76,1,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,186,0,0,0,114,45, + 1,0,0,41,2,114,88,1,0,0,90,17,115,117,112,112, + 111,114,116,101,100,95,108,111,97,100,101,114,115,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,105, + 110,115,116,97,108,108,101,6,0,0,115,8,0,0,0,0, + 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,59, + 0,0,0,41,1,78,41,3,78,78,78,41,2,114,72,0, + 0,0,114,72,0,0,0,41,1,84,41,1,78,41,1,78, + 41,63,114,127,0,0,0,114,12,0,0,0,90,37,95,67, + 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, + 80,76,65,84,70,79,82,77,83,95,66,89,84,69,83,95, + 75,69,89,114,11,0,0,0,114,13,0,0,0,114,20,0, + 0,0,114,26,0,0,0,114,28,0,0,0,114,37,0,0, + 0,114,46,0,0,0,114,48,0,0,0,114,52,0,0,0, + 114,53,0,0,0,114,55,0,0,0,114,58,0,0,0,114, + 68,0,0,0,218,4,116,121,112,101,218,8,95,95,99,111, + 100,101,95,95,114,162,0,0,0,114,18,0,0,0,114,148, + 0,0,0,114,17,0,0,0,114,23,0,0,0,114,236,0, + 0,0,114,91,0,0,0,114,87,0,0,0,114,101,0,0, + 0,114,88,0,0,0,90,23,68,69,66,85,71,95,66,89, + 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,90, + 27,79,80,84,73,77,73,90,69,68,95,66,89,84,69,67, + 79,68,69,95,83,85,70,70,73,88,69,83,114,97,0,0, + 0,114,102,0,0,0,114,108,0,0,0,114,112,0,0,0, + 114,114,0,0,0,114,136,0,0,0,114,143,0,0,0,114, + 152,0,0,0,114,156,0,0,0,114,158,0,0,0,114,165, + 0,0,0,114,170,0,0,0,114,171,0,0,0,114,176,0, + 0,0,218,6,111,98,106,101,99,116,114,185,0,0,0,114, + 190,0,0,0,114,191,0,0,0,114,208,0,0,0,114,221, + 0,0,0,114,239,0,0,0,114,9,1,0,0,114,15,1, + 0,0,114,21,1,0,0,114,252,0,0,0,114,22,1,0, + 0,114,43,1,0,0,114,45,1,0,0,114,61,1,0,0, + 114,81,1,0,0,114,184,0,0,0,114,89,1,0,0,114, + 91,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,126,0,0,0,4,22,4,1,4, + 1,2,1,2,255,4,4,8,17,8,5,8,5,8,6,8, + 6,8,12,8,10,8,9,8,5,8,7,8,9,10,22,10, + 127,0,17,16,1,12,2,4,1,4,2,6,2,6,2,8, + 2,16,71,8,40,8,19,8,12,8,12,8,28,8,17,8, + 33,8,28,8,24,10,13,10,10,10,11,8,14,6,3,4, + 1,2,255,12,68,14,64,14,29,16,127,0,17,14,72,18, + 45,18,26,4,3,18,53,14,63,14,42,14,127,0,20,14, + 127,0,22,10,23,8,11,8,65, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index a05a7a3b945a1..199c4106280a5 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -117,863 +117,860 @@ const unsigned char _Py_M__zipimport[] = { 111,102,32,116,104,101,10,32,32,32,32,122,105,112,102,105, 108,101,32,116,97,114,103,101,116,101,100,46,10,32,32,32, 32,99,2,0,0,0,0,0,0,0,0,0,0,0,8,0, - 0,0,9,0,0,0,67,0,0,0,115,36,1,0,0,116, + 0,0,9,0,0,0,67,0,0,0,115,32,1,0,0,116, 0,124,1,116,1,131,2,115,28,100,1,100,0,108,2,125, 2,124,2,160,3,124,1,161,1,125,1,124,1,115,44,116, 4,100,2,124,1,100,3,141,2,130,1,116,5,114,60,124, 1,160,6,116,5,116,7,161,2,125,1,103,0,125,3,122, - 14,116,8,160,9,124,1,161,1,125,4,87,0,110,72,4, - 0,116,10,116,11,102,2,107,10,114,150,1,0,1,0,1, - 0,116,8,160,12,124,1,161,1,92,2,125,5,125,6,124, - 5,124,1,107,2,114,132,116,4,100,4,124,1,100,3,141, - 2,130,1,124,5,125,1,124,3,160,13,124,6,161,1,1, - 0,89,0,113,64,48,0,124,4,106,14,100,5,64,0,100, - 6,107,3,114,182,116,4,100,4,124,1,100,3,141,2,130, - 1,113,182,113,64,122,12,116,15,124,1,25,0,125,7,87, - 0,110,36,4,0,116,16,107,10,114,230,1,0,1,0,1, - 0,116,17,124,1,131,1,125,7,124,7,116,15,124,1,60, - 0,89,0,110,2,48,0,124,7,124,0,95,18,124,1,124, - 0,95,19,116,8,106,20,124,3,100,0,100,0,100,7,133, - 3,25,0,142,0,124,0,95,21,124,0,106,21,144,1,114, - 32,124,0,4,0,106,21,116,7,55,0,2,0,95,21,100, - 0,83,0,41,8,78,114,0,0,0,0,122,21,97,114,99, - 104,105,118,101,32,112,97,116,104,32,105,115,32,101,109,112, - 116,121,169,1,218,4,112,97,116,104,122,14,110,111,116,32, - 97,32,90,105,112,32,102,105,108,101,105,0,240,0,0,105, - 0,128,0,0,233,255,255,255,255,41,22,218,10,105,115,105, - 110,115,116,97,110,99,101,218,3,115,116,114,218,2,111,115, - 90,8,102,115,100,101,99,111,100,101,114,3,0,0,0,218, - 12,97,108,116,95,112,97,116,104,95,115,101,112,218,7,114, - 101,112,108,97,99,101,218,8,112,97,116,104,95,115,101,112, - 218,19,95,98,111,111,116,115,116,114,97,112,95,101,120,116, - 101,114,110,97,108,90,10,95,112,97,116,104,95,115,116,97, - 116,218,7,79,83,69,114,114,111,114,218,10,86,97,108,117, - 101,69,114,114,111,114,90,11,95,112,97,116,104,95,115,112, - 108,105,116,218,6,97,112,112,101,110,100,90,7,115,116,95, - 109,111,100,101,218,20,95,122,105,112,95,100,105,114,101,99, - 116,111,114,121,95,99,97,99,104,101,218,8,75,101,121,69, - 114,114,111,114,218,15,95,114,101,97,100,95,100,105,114,101, - 99,116,111,114,121,218,6,95,102,105,108,101,115,218,7,97, - 114,99,104,105,118,101,218,10,95,112,97,116,104,95,106,111, - 105,110,218,6,112,114,101,102,105,120,41,8,218,4,115,101, - 108,102,114,13,0,0,0,114,17,0,0,0,114,31,0,0, - 0,90,2,115,116,90,7,100,105,114,110,97,109,101,90,8, - 98,97,115,101,110,97,109,101,218,5,102,105,108,101,115,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,105,110,105,116,95,95,63,0,0,0,115,58,0,0, - 0,0,1,10,1,8,1,10,1,4,1,12,1,4,1,12, - 2,4,2,2,1,14,1,18,3,14,1,8,1,12,1,4, - 1,16,3,14,2,12,1,4,2,2,1,12,1,14,1,8, - 1,14,1,6,1,6,2,22,1,8,1,122,20,122,105,112, - 105,109,112,111,114,116,101,114,46,95,95,105,110,105,116,95, - 95,78,99,3,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,4,0,0,0,67,0,0,0,115,78,0,0,0, - 116,0,124,0,124,1,131,2,125,3,124,3,100,1,107,9, - 114,26,124,0,103,0,102,2,83,0,116,1,124,0,124,1, - 131,2,125,4,116,2,124,0,124,4,131,2,114,70,100,1, - 124,0,106,3,155,0,116,4,155,0,124,4,155,0,157,3, - 103,1,102,2,83,0,100,1,103,0,102,2,83,0,41,2, - 97,239,1,0,0,102,105,110,100,95,108,111,97,100,101,114, - 40,102,117,108,108,110,97,109,101,44,32,112,97,116,104,61, - 78,111,110,101,41,32,45,62,32,115,101,108,102,44,32,115, - 116,114,32,111,114,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,83,101,97,114,99,104,32,102,111,114,32, - 97,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, - 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, - 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, - 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, - 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, - 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, - 115,32,116,104,101,32,122,105,112,105,109,112,111,114,116,101, - 114,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110, - 99,101,32,105,116,115,101,108,102,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,119,97,115,32,102,111,117,110, - 100,44,32,97,32,115,116,114,105,110,103,32,99,111,110,116, - 97,105,110,105,110,103,32,116,104,101,10,32,32,32,32,32, - 32,32,32,102,117,108,108,32,112,97,116,104,32,110,97,109, - 101,32,105,102,32,105,116,39,115,32,112,111,115,115,105,98, - 108,121,32,97,32,112,111,114,116,105,111,110,32,111,102,32, - 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, - 97,103,101,44,10,32,32,32,32,32,32,32,32,111,114,32, - 78,111,110,101,32,111,116,104,101,114,119,105,115,101,46,32, - 84,104,101,32,111,112,116,105,111,110,97,108,32,39,112,97, - 116,104,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 105,103,110,111,114,101,100,32,45,45,32,105,116,39,115,10, - 32,32,32,32,32,32,32,32,116,104,101,114,101,32,102,111, - 114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32, - 119,105,116,104,32,116,104,101,32,105,109,112,111,114,116,101, - 114,32,112,114,111,116,111,99,111,108,46,10,32,32,32,32, - 32,32,32,32,78,41,5,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,105,110,102,111,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,112,97,116,104,218,7,95,105,115, - 95,100,105,114,114,29,0,0,0,114,20,0,0,0,41,5, - 114,32,0,0,0,218,8,102,117,108,108,110,97,109,101,114, - 13,0,0,0,218,2,109,105,218,7,109,111,100,112,97,116, - 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,11,102,105,110,100,95,108,111,97,100,101,114,109,0,0, - 0,115,14,0,0,0,0,10,10,1,8,2,8,7,10,1, - 10,4,24,2,122,23,122,105,112,105,109,112,111,114,116,101, - 114,46,102,105,110,100,95,108,111,97,100,101,114,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,16,0,0,0,124,0,160,0,124, - 1,124,2,161,2,100,1,25,0,83,0,41,2,97,139,1, - 0,0,102,105,110,100,95,109,111,100,117,108,101,40,102,117, - 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, - 101,41,32,45,62,32,115,101,108,102,32,111,114,32,78,111, - 110,101,46,10,10,32,32,32,32,32,32,32,32,83,101,97, - 114,99,104,32,102,111,114,32,97,32,109,111,100,117,108,101, - 32,115,112,101,99,105,102,105,101,100,32,98,121,32,39,102, - 117,108,108,110,97,109,101,39,46,32,39,102,117,108,108,110, - 97,109,101,39,32,109,117,115,116,32,98,101,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,117,108,108,121,32,113, - 117,97,108,105,102,105,101,100,32,40,100,111,116,116,101,100, - 41,32,109,111,100,117,108,101,32,110,97,109,101,46,32,73, - 116,32,114,101,116,117,114,110,115,32,116,104,101,32,122,105, - 112,105,109,112,111,114,116,101,114,10,32,32,32,32,32,32, - 32,32,105,110,115,116,97,110,99,101,32,105,116,115,101,108, - 102,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 119,97,115,32,102,111,117,110,100,44,32,111,114,32,78,111, - 110,101,32,105,102,32,105,116,32,119,97,115,110,39,116,46, - 10,32,32,32,32,32,32,32,32,84,104,101,32,111,112,116, - 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, - 32,45,45,32,105,116,39,115,32,116,104,101,114,101,32,102, - 111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121, - 10,32,32,32,32,32,32,32,32,119,105,116,104,32,116,104, - 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, - 99,111,108,46,10,32,32,32,32,32,32,32,32,114,0,0, - 0,0,41,1,114,41,0,0,0,41,3,114,32,0,0,0, - 114,38,0,0,0,114,13,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,11,102,105,110,100,95, - 109,111,100,117,108,101,141,0,0,0,115,2,0,0,0,0, - 9,122,23,122,105,112,105,109,112,111,114,116,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,67, - 0,0,0,115,20,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,124,2,83,0,41,1,122,163, - 103,101,116,95,99,111,100,101,40,102,117,108,108,110,97,109, - 101,41,32,45,62,32,99,111,100,101,32,111,98,106,101,99, - 116,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, - 99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,32,109,111,100,117,108,101,46,32,82,97,105, - 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, - 32,98,101,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,169,1,218,16,95,103,101,116,95,109,111,100,117, - 108,101,95,99,111,100,101,169,5,114,32,0,0,0,114,38, - 0,0,0,218,4,99,111,100,101,218,9,105,115,112,97,99, - 107,97,103,101,114,40,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,8,103,101,116,95,99,111, - 100,101,153,0,0,0,115,4,0,0,0,0,6,16,1,122, - 20,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,118, - 0,0,0,116,0,114,16,124,1,160,1,116,0,116,2,161, - 2,125,1,124,1,125,2,124,1,160,3,124,0,106,4,116, - 2,23,0,161,1,114,58,124,1,116,5,124,0,106,4,116, - 2,23,0,131,1,100,1,133,2,25,0,125,2,122,14,124, - 0,106,6,124,2,25,0,125,3,87,0,110,32,4,0,116, - 7,107,10,114,104,1,0,1,0,1,0,116,8,100,2,100, - 3,124,2,131,3,130,1,89,0,110,2,48,0,116,9,124, - 0,106,4,124,3,131,2,83,0,41,4,122,154,103,101,116, - 95,100,97,116,97,40,112,97,116,104,110,97,109,101,41,32, - 45,62,32,115,116,114,105,110,103,32,119,105,116,104,32,102, - 105,108,101,32,100,97,116,97,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,116,104,101,32,100,97, - 116,97,32,97,115,115,111,99,105,97,116,101,100,32,119,105, - 116,104,32,39,112,97,116,104,110,97,109,101,39,46,32,82, - 97,105,115,101,32,79,83,69,114,114,111,114,32,105,102,10, - 32,32,32,32,32,32,32,32,116,104,101,32,102,105,108,101, - 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,78,114,0,0,0,0,218,0,41, - 10,114,18,0,0,0,114,19,0,0,0,114,20,0,0,0, - 218,10,115,116,97,114,116,115,119,105,116,104,114,29,0,0, - 0,218,3,108,101,110,114,28,0,0,0,114,26,0,0,0, - 114,22,0,0,0,218,9,95,103,101,116,95,100,97,116,97, - 41,4,114,32,0,0,0,218,8,112,97,116,104,110,97,109, - 101,90,3,107,101,121,218,9,116,111,99,95,101,110,116,114, - 121,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,8,103,101,116,95,100,97,116,97,163,0,0,0,115,20, - 0,0,0,0,6,4,1,12,2,4,1,16,1,22,2,2, - 1,14,1,14,1,18,1,122,20,122,105,112,105,109,112,111, - 114,116,101,114,46,103,101,116,95,100,97,116,97,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0, - 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,124, - 1,131,2,92,3,125,2,125,3,125,4,124,4,83,0,41, - 1,122,106,103,101,116,95,102,105,108,101,110,97,109,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,102,105,108, - 101,110,97,109,101,32,115,116,114,105,110,103,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, - 101,32,102,105,108,101,110,97,109,101,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,46,10,32,32,32,32,32,32,32,32,114,43,0, - 0,0,114,45,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,12,103,101,116,95,102,105,108,101, - 110,97,109,101,184,0,0,0,115,4,0,0,0,0,7,16, - 1,122,24,122,105,112,105,109,112,111,114,116,101,114,46,103, - 101,116,95,102,105,108,101,110,97,109,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,8,0,0,0, - 67,0,0,0,115,128,0,0,0,116,0,124,0,124,1,131, - 2,125,2,124,2,100,1,107,8,114,36,116,1,100,2,124, - 1,155,2,157,2,124,1,100,3,141,2,130,1,116,2,124, - 0,124,1,131,2,125,3,124,2,114,64,116,3,160,4,124, - 3,100,4,161,2,125,4,110,10,124,3,155,0,100,5,157, - 2,125,4,122,14,124,0,106,5,124,4,25,0,125,5,87, - 0,110,22,4,0,116,6,107,10,114,110,1,0,1,0,1, - 0,89,0,100,1,83,0,48,0,116,7,124,0,106,8,124, - 5,131,2,160,9,161,0,83,0,41,6,122,253,103,101,116, - 95,115,111,117,114,99,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,115,111,117,114,99,101,32,115,116,114,105, - 110,103,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,116,104,101,32,115,111,117,114,99,101,32,99, - 111,100,101,32,102,111,114,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,109,111,100,117,108,101,46,32,82,97, - 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, - 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, - 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, - 116,32,98,101,32,102,111,117,110,100,44,32,114,101,116,117, - 114,110,32,78,111,110,101,32,105,102,32,116,104,101,32,97, - 114,99,104,105,118,101,32,100,111,101,115,10,32,32,32,32, - 32,32,32,32,99,111,110,116,97,105,110,32,116,104,101,32, - 109,111,100,117,108,101,44,32,98,117,116,32,104,97,115,32, - 110,111,32,115,111,117,114,99,101,32,102,111,114,32,105,116, - 46,10,32,32,32,32,32,32,32,32,78,250,18,99,97,110, - 39,116,32,102,105,110,100,32,109,111,100,117,108,101,32,169, - 1,218,4,110,97,109,101,250,11,95,95,105,110,105,116,95, - 95,46,112,121,250,3,46,112,121,41,10,114,35,0,0,0, - 114,3,0,0,0,114,36,0,0,0,114,21,0,0,0,114, - 30,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, - 0,0,0,114,29,0,0,0,218,6,100,101,99,111,100,101, - 41,6,114,32,0,0,0,114,38,0,0,0,114,39,0,0, - 0,114,13,0,0,0,218,8,102,117,108,108,112,97,116,104, - 114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,10,103,101,116,95,115,111,117,114,99,101, - 195,0,0,0,115,24,0,0,0,0,7,10,1,8,1,18, - 2,10,1,4,1,14,2,10,2,2,1,14,1,14,2,8, - 1,122,22,122,105,112,105,109,112,111,114,116,101,114,46,103, - 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, + 14,116,8,160,9,124,1,161,1,125,4,87,0,110,70,4, + 0,116,10,116,11,102,2,121,148,1,0,1,0,1,0,116, + 8,160,12,124,1,161,1,92,2,125,5,125,6,124,5,124, + 1,107,2,114,130,116,4,100,4,124,1,100,3,141,2,130, + 1,124,5,125,1,124,3,160,13,124,6,161,1,1,0,89, + 0,113,64,48,0,124,4,106,14,100,5,64,0,100,6,107, + 3,114,180,116,4,100,4,124,1,100,3,141,2,130,1,113, + 180,113,64,122,12,116,15,124,1,25,0,125,7,87,0,110, + 34,4,0,116,16,121,226,1,0,1,0,1,0,116,17,124, + 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,110, + 2,48,0,124,7,124,0,95,18,124,1,124,0,95,19,116, + 8,106,20,124,3,100,0,100,0,100,7,133,3,25,0,142, + 0,124,0,95,21,124,0,106,21,144,1,114,28,124,0,4, + 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,41, + 8,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, + 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, + 218,4,112,97,116,104,122,14,110,111,116,32,97,32,90,105, + 112,32,102,105,108,101,105,0,240,0,0,105,0,128,0,0, + 233,255,255,255,255,41,22,218,10,105,115,105,110,115,116,97, + 110,99,101,218,3,115,116,114,218,2,111,115,90,8,102,115, + 100,101,99,111,100,101,114,3,0,0,0,218,12,97,108,116, + 95,112,97,116,104,95,115,101,112,218,7,114,101,112,108,97, + 99,101,218,8,112,97,116,104,95,115,101,112,218,19,95,98, + 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, + 108,90,10,95,112,97,116,104,95,115,116,97,116,218,7,79, + 83,69,114,114,111,114,218,10,86,97,108,117,101,69,114,114, + 111,114,90,11,95,112,97,116,104,95,115,112,108,105,116,218, + 6,97,112,112,101,110,100,90,7,115,116,95,109,111,100,101, + 218,20,95,122,105,112,95,100,105,114,101,99,116,111,114,121, + 95,99,97,99,104,101,218,8,75,101,121,69,114,114,111,114, + 218,15,95,114,101,97,100,95,100,105,114,101,99,116,111,114, + 121,218,6,95,102,105,108,101,115,218,7,97,114,99,104,105, + 118,101,218,10,95,112,97,116,104,95,106,111,105,110,218,6, + 112,114,101,102,105,120,41,8,218,4,115,101,108,102,114,13, + 0,0,0,114,17,0,0,0,114,31,0,0,0,90,2,115, + 116,90,7,100,105,114,110,97,109,101,90,8,98,97,115,101, + 110,97,109,101,218,5,102,105,108,101,115,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,95,95,105,110, + 105,116,95,95,63,0,0,0,115,58,0,0,0,0,1,10, + 1,8,1,10,1,4,1,12,1,4,1,12,2,4,2,2, + 1,14,1,16,3,14,1,8,1,12,1,4,1,16,3,14, + 2,12,1,4,2,2,1,12,1,12,1,8,1,14,1,6, + 1,6,2,22,1,8,1,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,95,95,105,110,105,116,95,95,78,99,3, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,78,0,0,0,116,0,124,0, + 124,1,131,2,125,3,124,3,100,1,117,1,114,26,124,0, + 103,0,102,2,83,0,116,1,124,0,124,1,131,2,125,4, + 116,2,124,0,124,4,131,2,114,70,100,1,124,0,106,3, + 155,0,116,4,155,0,124,4,155,0,157,3,103,1,102,2, + 83,0,100,1,103,0,102,2,83,0,41,2,97,239,1,0, + 0,102,105,110,100,95,108,111,97,100,101,114,40,102,117,108, + 108,110,97,109,101,44,32,112,97,116,104,61,78,111,110,101, + 41,32,45,62,32,115,101,108,102,44,32,115,116,114,32,111, + 114,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, + 32,83,101,97,114,99,104,32,102,111,114,32,97,32,109,111, + 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, + 121,32,39,102,117,108,108,110,97,109,101,39,46,32,39,102, + 117,108,108,110,97,109,101,39,32,109,117,115,116,32,98,101, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,117,108, + 108,121,32,113,117,97,108,105,102,105,101,100,32,40,100,111, + 116,116,101,100,41,32,109,111,100,117,108,101,32,110,97,109, + 101,46,32,73,116,32,114,101,116,117,114,110,115,32,116,104, + 101,32,122,105,112,105,109,112,111,114,116,101,114,10,32,32, + 32,32,32,32,32,32,105,110,115,116,97,110,99,101,32,105, + 116,115,101,108,102,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,119,97,115,32,102,111,117,110,100,44,32,97, + 32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105, + 110,103,32,116,104,101,10,32,32,32,32,32,32,32,32,102, + 117,108,108,32,112,97,116,104,32,110,97,109,101,32,105,102, + 32,105,116,39,115,32,112,111,115,115,105,98,108,121,32,97, + 32,112,111,114,116,105,111,110,32,111,102,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,44, + 10,32,32,32,32,32,32,32,32,111,114,32,78,111,110,101, + 32,111,116,104,101,114,119,105,115,101,46,32,84,104,101,32, + 111,112,116,105,111,110,97,108,32,39,112,97,116,104,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,111, + 114,101,100,32,45,45,32,105,116,39,115,10,32,32,32,32, + 32,32,32,32,116,104,101,114,101,32,102,111,114,32,99,111, + 109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104, + 32,116,104,101,32,105,109,112,111,114,116,101,114,32,112,114, + 111,116,111,99,111,108,46,10,32,32,32,32,32,32,32,32, + 78,41,5,218,16,95,103,101,116,95,109,111,100,117,108,101, + 95,105,110,102,111,218,16,95,103,101,116,95,109,111,100,117, + 108,101,95,112,97,116,104,218,7,95,105,115,95,100,105,114, + 114,29,0,0,0,114,20,0,0,0,41,5,114,32,0,0, + 0,218,8,102,117,108,108,110,97,109,101,114,13,0,0,0, + 218,2,109,105,218,7,109,111,100,112,97,116,104,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,11,102,105, + 110,100,95,108,111,97,100,101,114,109,0,0,0,115,14,0, + 0,0,0,10,10,1,8,2,8,7,10,1,10,4,24,2, + 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, + 110,100,95,108,111,97,100,101,114,99,3,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,40,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,107,8,114,36,116,1,100,2,124,1,155, - 2,157,2,124,1,100,3,141,2,130,1,124,2,83,0,41, - 4,122,171,105,115,95,112,97,99,107,97,103,101,40,102,117, - 108,108,110,97,109,101,41,32,45,62,32,98,111,111,108,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,84,114,117,101,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, - 32,102,117,108,108,110,97,109,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,46,10,32,32,32,32,32,32,32,32, - 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, - 57,0,0,0,114,58,0,0,0,41,2,114,35,0,0,0, - 114,3,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,39,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,10,105,115,95,112,97,99,107,97,103, - 101,221,0,0,0,115,8,0,0,0,0,6,10,1,8,1, - 18,1,122,22,122,105,112,105,109,112,111,114,116,101,114,46, - 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,67, - 0,0,0,115,248,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,116,1,106,2,160,3,124,1, - 161,1,125,5,124,5,100,1,107,8,115,46,116,4,124,5, - 116,5,131,2,115,64,116,5,124,1,131,1,125,5,124,5, - 116,1,106,2,124,1,60,0,124,0,124,5,95,6,122,84, - 124,3,114,108,116,7,124,0,124,1,131,2,125,6,116,8, - 160,9,124,0,106,10,124,6,161,2,125,7,124,7,103,1, - 124,5,95,11,116,12,124,5,100,2,131,2,115,124,116,13, - 124,5,95,13,116,8,160,14,124,5,106,15,124,1,124,4, - 161,3,1,0,116,16,124,2,124,5,106,15,131,2,1,0, - 87,0,110,22,1,0,1,0,1,0,116,1,106,2,124,1, - 61,0,130,0,89,0,110,2,48,0,122,14,116,1,106,2, - 124,1,25,0,125,5,87,0,110,36,4,0,116,17,107,10, - 114,228,1,0,1,0,1,0,116,18,100,3,124,1,155,2, - 100,4,157,3,131,1,130,1,89,0,110,2,48,0,116,19, - 160,20,100,5,124,1,124,4,161,3,1,0,124,5,83,0, - 41,6,122,245,108,111,97,100,95,109,111,100,117,108,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,76,111, - 97,100,32,116,104,101,32,109,111,100,117,108,101,32,115,112, - 101,99,105,102,105,101,100,32,98,121,32,39,102,117,108,108, - 110,97,109,101,39,46,32,39,102,117,108,108,110,97,109,101, - 39,32,109,117,115,116,32,98,101,32,116,104,101,10,32,32, - 32,32,32,32,32,32,102,117,108,108,121,32,113,117,97,108, - 105,102,105,101,100,32,40,100,111,116,116,101,100,41,32,109, - 111,100,117,108,101,32,110,97,109,101,46,32,73,116,32,114, - 101,116,117,114,110,115,32,116,104,101,32,105,109,112,111,114, - 116,101,100,10,32,32,32,32,32,32,32,32,109,111,100,117, - 108,101,44,32,111,114,32,114,97,105,115,101,115,32,90,105, + 0,0,115,16,0,0,0,124,0,160,0,124,1,124,2,161, + 2,100,1,25,0,83,0,41,2,97,139,1,0,0,102,105, + 110,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, + 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, + 62,32,115,101,108,102,32,111,114,32,78,111,110,101,46,10, + 10,32,32,32,32,32,32,32,32,83,101,97,114,99,104,32, + 102,111,114,32,97,32,109,111,100,117,108,101,32,115,112,101, + 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, + 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, + 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, + 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, + 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, + 116,117,114,110,115,32,116,104,101,32,122,105,112,105,109,112, + 111,114,116,101,114,10,32,32,32,32,32,32,32,32,105,110, + 115,116,97,110,99,101,32,105,116,115,101,108,102,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,119,97,115,32, + 102,111,117,110,100,44,32,111,114,32,78,111,110,101,32,105, + 102,32,105,116,32,119,97,115,110,39,116,46,10,32,32,32, + 32,32,32,32,32,84,104,101,32,111,112,116,105,111,110,97, + 108,32,39,112,97,116,104,39,32,97,114,103,117,109,101,110, + 116,32,105,115,32,105,103,110,111,114,101,100,32,45,45,32, + 105,116,39,115,32,116,104,101,114,101,32,102,111,114,32,99, + 111,109,112,97,116,105,98,105,108,105,116,121,10,32,32,32, + 32,32,32,32,32,119,105,116,104,32,116,104,101,32,105,109, + 112,111,114,116,101,114,32,112,114,111,116,111,99,111,108,46, + 10,32,32,32,32,32,32,32,32,114,0,0,0,0,41,1, + 114,41,0,0,0,41,3,114,32,0,0,0,114,38,0,0, + 0,114,13,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,141,0,0,0,115,2,0,0,0,0,9,122,23,122, + 105,112,105,109,112,111,114,116,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, + 125,3,125,4,124,2,83,0,41,1,122,163,103,101,116,95, + 99,111,100,101,40,102,117,108,108,110,97,109,101,41,32,45, + 62,32,99,111,100,101,32,111,98,106,101,99,116,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, + 104,101,32,99,111,100,101,32,111,98,106,101,99,116,32,102, + 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 32,109,111,100,117,108,101,46,32,82,97,105,115,101,32,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,10,32,32, + 32,32,32,32,32,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,169, + 1,218,16,95,103,101,116,95,109,111,100,117,108,101,95,99, + 111,100,101,169,5,114,32,0,0,0,114,38,0,0,0,218, + 4,99,111,100,101,218,9,105,115,112,97,99,107,97,103,101, + 114,40,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,8,103,101,116,95,99,111,100,101,153,0, + 0,0,115,4,0,0,0,0,6,16,1,122,20,122,105,112, + 105,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,8,0,0,0,67,0,0,0,115,116,0,0,0,116, + 0,114,16,124,1,160,1,116,0,116,2,161,2,125,1,124, + 1,125,2,124,1,160,3,124,0,106,4,116,2,23,0,161, + 1,114,58,124,1,116,5,124,0,106,4,116,2,23,0,131, + 1,100,1,133,2,25,0,125,2,122,14,124,0,106,6,124, + 2,25,0,125,3,87,0,110,30,4,0,116,7,121,102,1, + 0,1,0,1,0,116,8,100,2,100,3,124,2,131,3,130, + 1,89,0,110,2,48,0,116,9,124,0,106,4,124,3,131, + 2,83,0,41,4,122,154,103,101,116,95,100,97,116,97,40, + 112,97,116,104,110,97,109,101,41,32,45,62,32,115,116,114, + 105,110,103,32,119,105,116,104,32,102,105,108,101,32,100,97, + 116,97,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,116,104,101,32,100,97,116,97,32,97,115,115, + 111,99,105,97,116,101,100,32,119,105,116,104,32,39,112,97, + 116,104,110,97,109,101,39,46,32,82,97,105,115,101,32,79, + 83,69,114,114,111,114,32,105,102,10,32,32,32,32,32,32, + 32,32,116,104,101,32,102,105,108,101,32,119,97,115,110,39, + 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,78,114,0,0,0,0,218,0,41,10,114,18,0,0,0, + 114,19,0,0,0,114,20,0,0,0,218,10,115,116,97,114, + 116,115,119,105,116,104,114,29,0,0,0,218,3,108,101,110, + 114,28,0,0,0,114,26,0,0,0,114,22,0,0,0,218, + 9,95,103,101,116,95,100,97,116,97,41,4,114,32,0,0, + 0,218,8,112,97,116,104,110,97,109,101,90,3,107,101,121, + 218,9,116,111,99,95,101,110,116,114,121,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, + 100,97,116,97,163,0,0,0,115,20,0,0,0,0,6,4, + 1,12,2,4,1,16,1,22,2,2,1,14,1,12,1,18, + 1,122,20,122,105,112,105,109,112,111,114,116,101,114,46,103, + 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,3,0,0,0,67,0,0,0, + 115,20,0,0,0,116,0,124,0,124,1,131,2,92,3,125, + 2,125,3,125,4,124,4,83,0,41,1,122,106,103,101,116, + 95,102,105,108,101,110,97,109,101,40,102,117,108,108,110,97, + 109,101,41,32,45,62,32,102,105,108,101,110,97,109,101,32, + 115,116,114,105,110,103,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,32,116,104,101,32,102,105,108,101, + 110,97,109,101,32,102,111,114,32,116,104,101,32,115,112,101, + 99,105,102,105,101,100,32,109,111,100,117,108,101,46,10,32, + 32,32,32,32,32,32,32,114,43,0,0,0,114,45,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,12,103,101,116,95,102,105,108,101,110,97,109,101,184,0, + 0,0,115,4,0,0,0,0,7,16,1,122,24,122,105,112, + 105,109,112,111,114,116,101,114,46,103,101,116,95,102,105,108, + 101,110,97,109,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,8,0,0,0,67,0,0,0,115,126, + 0,0,0,116,0,124,0,124,1,131,2,125,2,124,2,100, + 1,117,0,114,36,116,1,100,2,124,1,155,2,157,2,124, + 1,100,3,141,2,130,1,116,2,124,0,124,1,131,2,125, + 3,124,2,114,64,116,3,160,4,124,3,100,4,161,2,125, + 4,110,10,124,3,155,0,100,5,157,2,125,4,122,14,124, + 0,106,5,124,4,25,0,125,5,87,0,110,20,4,0,116, + 6,121,108,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,116,7,124,0,106,8,124,5,131,2,160,9,161,0,83, + 0,41,6,122,253,103,101,116,95,115,111,117,114,99,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,115,111,117, + 114,99,101,32,115,116,114,105,110,103,46,10,10,32,32,32, + 32,32,32,32,32,82,101,116,117,114,110,32,116,104,101,32, + 115,111,117,114,99,101,32,99,111,100,101,32,102,111,114,32, + 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, + 100,117,108,101,46,32,82,97,105,115,101,32,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,10,32,32,32,32,32, + 32,32,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, + 110,100,44,32,114,101,116,117,114,110,32,78,111,110,101,32, + 105,102,32,116,104,101,32,97,114,99,104,105,118,101,32,100, + 111,101,115,10,32,32,32,32,32,32,32,32,99,111,110,116, + 97,105,110,32,116,104,101,32,109,111,100,117,108,101,44,32, + 98,117,116,32,104,97,115,32,110,111,32,115,111,117,114,99, + 101,32,102,111,114,32,105,116,46,10,32,32,32,32,32,32, + 32,32,78,250,18,99,97,110,39,116,32,102,105,110,100,32, + 109,111,100,117,108,101,32,169,1,218,4,110,97,109,101,250, + 11,95,95,105,110,105,116,95,95,46,112,121,250,3,46,112, + 121,41,10,114,35,0,0,0,114,3,0,0,0,114,36,0, + 0,0,114,21,0,0,0,114,30,0,0,0,114,28,0,0, + 0,114,26,0,0,0,114,52,0,0,0,114,29,0,0,0, + 218,6,100,101,99,111,100,101,41,6,114,32,0,0,0,114, + 38,0,0,0,114,39,0,0,0,114,13,0,0,0,218,8, + 102,117,108,108,112,97,116,104,114,54,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,10,103,101, + 116,95,115,111,117,114,99,101,195,0,0,0,115,24,0,0, + 0,0,7,10,1,8,1,18,2,10,1,4,1,14,2,10, + 2,2,1,14,1,12,2,8,1,122,22,122,105,112,105,109, + 112,111,114,116,101,114,46,103,101,116,95,115,111,117,114,99, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,40,0,0,0,116, + 0,124,0,124,1,131,2,125,2,124,2,100,1,117,0,114, + 36,116,1,100,2,124,1,155,2,157,2,124,1,100,3,141, + 2,130,1,124,2,83,0,41,4,122,171,105,115,95,112,97, + 99,107,97,103,101,40,102,117,108,108,110,97,109,101,41,32, + 45,62,32,98,111,111,108,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,32,84,114,117,101,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,115,112,101,99, + 105,102,105,101,100,32,98,121,32,102,117,108,108,110,97,109, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,10, + 32,32,32,32,32,32,32,32,82,97,105,115,101,32,90,105, 112,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,119,97,115,110,39,116,32,102,111,117,110,100,46, - 10,32,32,32,32,32,32,32,32,78,218,12,95,95,98,117, - 105,108,116,105,110,115,95,95,122,14,76,111,97,100,101,100, - 32,109,111,100,117,108,101,32,122,25,32,110,111,116,32,102, - 111,117,110,100,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,122,30,105,109,112,111,114,116,32,123,125,32,35, - 32,108,111,97,100,101,100,32,102,114,111,109,32,90,105,112, - 32,123,125,41,21,114,44,0,0,0,218,3,115,121,115,218, - 7,109,111,100,117,108,101,115,218,3,103,101,116,114,15,0, - 0,0,218,12,95,109,111,100,117,108,101,95,116,121,112,101, - 218,10,95,95,108,111,97,100,101,114,95,95,114,36,0,0, - 0,114,21,0,0,0,114,30,0,0,0,114,29,0,0,0, - 90,8,95,95,112,97,116,104,95,95,218,7,104,97,115,97, - 116,116,114,114,66,0,0,0,90,14,95,102,105,120,95,117, - 112,95,109,111,100,117,108,101,218,8,95,95,100,105,99,116, - 95,95,218,4,101,120,101,99,114,26,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,218,10,95,98,111,111, - 116,115,116,114,97,112,218,16,95,118,101,114,98,111,115,101, - 95,109,101,115,115,97,103,101,41,8,114,32,0,0,0,114, - 38,0,0,0,114,46,0,0,0,114,47,0,0,0,114,40, - 0,0,0,90,3,109,111,100,114,13,0,0,0,114,63,0, + 116,104,101,32,109,111,100,117,108,101,32,99,111,117,108,100, + 110,39,116,32,98,101,32,102,111,117,110,100,46,10,32,32, + 32,32,32,32,32,32,78,114,57,0,0,0,114,58,0,0, + 0,41,2,114,35,0,0,0,114,3,0,0,0,41,3,114, + 32,0,0,0,114,38,0,0,0,114,39,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,10,105, + 115,95,112,97,99,107,97,103,101,221,0,0,0,115,8,0, + 0,0,0,6,10,1,8,1,18,1,122,22,122,105,112,105, + 109,112,111,114,116,101,114,46,105,115,95,112,97,99,107,97, + 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,246,0,0,0, + 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, + 116,1,106,2,160,3,124,1,161,1,125,5,124,5,100,1, + 117,0,115,46,116,4,124,5,116,5,131,2,115,64,116,5, + 124,1,131,1,125,5,124,5,116,1,106,2,124,1,60,0, + 124,0,124,5,95,6,122,84,124,3,114,108,116,7,124,0, + 124,1,131,2,125,6,116,8,160,9,124,0,106,10,124,6, + 161,2,125,7,124,7,103,1,124,5,95,11,116,12,124,5, + 100,2,131,2,115,124,116,13,124,5,95,13,116,8,160,14, + 124,5,106,15,124,1,124,4,161,3,1,0,116,16,124,2, + 124,5,106,15,131,2,1,0,87,0,110,22,1,0,1,0, + 1,0,116,1,106,2,124,1,61,0,130,0,89,0,110,2, + 48,0,122,14,116,1,106,2,124,1,25,0,125,5,87,0, + 110,34,4,0,116,17,121,226,1,0,1,0,1,0,116,18, + 100,3,124,1,155,2,100,4,157,3,131,1,130,1,89,0, + 110,2,48,0,116,19,160,20,100,5,124,1,124,4,161,3, + 1,0,124,5,83,0,41,6,122,245,108,111,97,100,95,109, + 111,100,117,108,101,40,102,117,108,108,110,97,109,101,41,32, + 45,62,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,76,111,97,100,32,116,104,101,32,109,111,100, + 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, + 32,39,102,117,108,108,110,97,109,101,39,46,32,39,102,117, + 108,108,110,97,109,101,39,32,109,117,115,116,32,98,101,32, + 116,104,101,10,32,32,32,32,32,32,32,32,102,117,108,108, + 121,32,113,117,97,108,105,102,105,101,100,32,40,100,111,116, + 116,101,100,41,32,109,111,100,117,108,101,32,110,97,109,101, + 46,32,73,116,32,114,101,116,117,114,110,115,32,116,104,101, + 32,105,109,112,111,114,116,101,100,10,32,32,32,32,32,32, + 32,32,109,111,100,117,108,101,44,32,111,114,32,114,97,105, + 115,101,115,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,119,97,115,110,39,116,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, + 218,12,95,95,98,117,105,108,116,105,110,115,95,95,122,14, + 76,111,97,100,101,100,32,109,111,100,117,108,101,32,122,25, + 32,110,111,116,32,102,111,117,110,100,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,122,30,105,109,112,111,114, + 116,32,123,125,32,35,32,108,111,97,100,101,100,32,102,114, + 111,109,32,90,105,112,32,123,125,41,21,114,44,0,0,0, + 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, + 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, + 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, + 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, + 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, + 218,7,104,97,115,97,116,116,114,114,66,0,0,0,90,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, + 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 218,10,95,98,111,111,116,115,116,114,97,112,218,16,95,118, + 101,114,98,111,115,101,95,109,101,115,115,97,103,101,41,8, + 114,32,0,0,0,114,38,0,0,0,114,46,0,0,0,114, + 47,0,0,0,114,40,0,0,0,90,3,109,111,100,114,13, + 0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,11,108,111,97,100,95,109,111, + 100,117,108,101,234,0,0,0,115,48,0,0,0,0,7,16, + 1,12,1,18,1,8,1,10,1,6,2,2,1,4,3,10, + 1,14,1,8,2,10,1,6,1,16,1,16,1,6,1,8, + 1,8,2,2,1,14,1,12,1,22,1,14,1,122,23,122, + 105,112,105,109,112,111,114,116,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, + 86,0,0,0,122,20,124,0,160,0,124,1,161,1,115,18, + 87,0,100,1,83,0,87,0,110,20,4,0,116,1,121,40, + 1,0,1,0,1,0,89,0,100,1,83,0,48,0,116,2, + 106,3,115,76,100,2,100,3,108,4,109,5,125,2,1,0, + 124,2,160,6,116,2,161,1,1,0,100,4,116,2,95,3, + 116,2,124,0,124,1,131,2,83,0,41,5,122,204,82,101, + 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, + 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, + 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, + 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, + 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, + 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, + 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, + 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, + 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, + 41,1,218,14,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,84,41,7,114,65,0,0,0,114,3,0,0,0,218, + 24,95,90,105,112,73,109,112,111,114,116,82,101,115,111,117, + 114,99,101,82,101,97,100,101,114,218,11,95,114,101,103,105, + 115,116,101,114,101,100,90,13,105,109,112,111,114,116,108,105, + 98,46,97,98,99,114,79,0,0,0,90,8,114,101,103,105, + 115,116,101,114,41,3,114,32,0,0,0,114,38,0,0,0, + 114,79,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,19,103,101,116,95,114,101,115,111,117,114, + 99,101,95,114,101,97,100,101,114,16,1,0,0,115,20,0, + 0,0,0,6,2,1,10,1,10,1,12,1,8,1,6,1, + 12,1,10,1,6,1,122,31,122,105,112,105,109,112,111,114, + 116,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, + 115,24,0,0,0,100,1,124,0,106,0,155,0,116,1,155, + 0,124,0,106,2,155,0,100,2,157,5,83,0,41,3,78, + 122,21,60,122,105,112,105,109,112,111,114,116,101,114,32,111, + 98,106,101,99,116,32,34,122,2,34,62,41,3,114,29,0, + 0,0,114,20,0,0,0,114,31,0,0,0,41,1,114,32, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,8,95,95,114,101,112,114,95,95,34,1,0,0, + 115,2,0,0,0,0,1,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,95,95,114,101,112,114,95,95,41,1,78, + 41,1,78,41,15,114,6,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,7,95,95,100,111,99,95,95,114,34,0, + 0,0,114,41,0,0,0,114,42,0,0,0,114,48,0,0, + 0,114,55,0,0,0,114,56,0,0,0,114,64,0,0,0, + 114,65,0,0,0,114,78,0,0,0,114,82,0,0,0,114, + 83,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,4,0,0,0,45,0,0, + 0,115,24,0,0,0,8,1,4,17,8,46,10,32,10,12, + 8,10,8,21,8,11,8,26,8,13,8,38,8,18,122,12, + 95,95,105,110,105,116,95,95,46,112,121,99,84,114,60,0, + 0,0,70,41,3,122,4,46,112,121,99,84,70,41,3,114, + 61,0,0,0,70,70,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 20,0,0,0,124,0,106,0,124,1,160,1,100,1,161,1, + 100,2,25,0,23,0,83,0,41,3,78,218,1,46,233,2, + 0,0,0,41,2,114,31,0,0,0,218,10,114,112,97,114, + 116,105,116,105,111,110,41,2,114,32,0,0,0,114,38,0, 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,11,108,111,97,100,95,109,111,100,117,108,101,234,0, - 0,0,115,48,0,0,0,0,7,16,1,12,1,18,1,8, - 1,10,1,6,2,2,1,4,3,10,1,14,1,8,2,10, - 1,6,1,16,1,16,1,6,1,8,1,8,2,2,1,14, - 1,14,1,22,1,14,1,122,23,122,105,112,105,109,112,111, - 114,116,101,114,46,108,111,97,100,95,109,111,100,117,108,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,88,0,0,0,122,20, - 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, - 87,0,110,22,4,0,116,1,107,10,114,42,1,0,1,0, - 1,0,89,0,100,1,83,0,48,0,116,2,106,3,115,78, - 100,2,100,3,108,4,109,5,125,2,1,0,124,2,160,6, - 116,2,161,1,1,0,100,4,116,2,95,3,116,2,124,0, - 124,1,131,2,83,0,41,5,122,204,82,101,116,117,114,110, - 32,116,104,101,32,82,101,115,111,117,114,99,101,82,101,97, - 100,101,114,32,102,111,114,32,97,32,112,97,99,107,97,103, - 101,32,105,110,32,97,32,122,105,112,32,102,105,108,101,46, - 10,10,32,32,32,32,32,32,32,32,73,102,32,39,102,117, - 108,108,110,97,109,101,39,32,105,115,32,97,32,112,97,99, - 107,97,103,101,32,119,105,116,104,105,110,32,116,104,101,32, - 122,105,112,32,102,105,108,101,44,32,114,101,116,117,114,110, - 32,116,104,101,10,32,32,32,32,32,32,32,32,39,82,101, - 115,111,117,114,99,101,82,101,97,100,101,114,39,32,111,98, - 106,101,99,116,32,102,111,114,32,116,104,101,32,112,97,99, - 107,97,103,101,46,32,32,79,116,104,101,114,119,105,115,101, - 32,114,101,116,117,114,110,32,78,111,110,101,46,10,32,32, - 32,32,32,32,32,32,78,114,0,0,0,0,41,1,218,14, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,84,41, - 7,114,65,0,0,0,114,3,0,0,0,218,24,95,90,105, - 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,218,11,95,114,101,103,105,115,116,101,114, - 101,100,90,13,105,109,112,111,114,116,108,105,98,46,97,98, - 99,114,79,0,0,0,90,8,114,101,103,105,115,116,101,114, - 41,3,114,32,0,0,0,114,38,0,0,0,114,79,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,19,103,101,116,95,114,101,115,111,117,114,99,101,95,114, - 101,97,100,101,114,16,1,0,0,115,20,0,0,0,0,6, - 2,1,10,1,10,1,14,1,8,1,6,1,12,1,10,1, - 6,1,122,31,122,105,112,105,109,112,111,114,116,101,114,46, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,0, - 0,100,1,124,0,106,0,155,0,116,1,155,0,124,0,106, - 2,155,0,100,2,157,5,83,0,41,3,78,122,21,60,122, - 105,112,105,109,112,111,114,116,101,114,32,111,98,106,101,99, - 116,32,34,122,2,34,62,41,3,114,29,0,0,0,114,20, - 0,0,0,114,31,0,0,0,41,1,114,32,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,114,101,112,114,95,95,34,1,0,0,115,2,0,0, - 0,0,1,122,20,122,105,112,105,109,112,111,114,116,101,114, - 46,95,95,114,101,112,114,95,95,41,1,78,41,1,78,41, - 15,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, - 0,0,0,114,42,0,0,0,114,48,0,0,0,114,55,0, - 0,0,114,56,0,0,0,114,64,0,0,0,114,65,0,0, - 0,114,78,0,0,0,114,82,0,0,0,114,83,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,4,0,0,0,45,0,0,0,115,24,0, - 0,0,8,1,4,17,8,46,10,32,10,12,8,10,8,21, - 8,11,8,26,8,13,8,38,8,18,122,12,95,95,105,110, - 105,116,95,95,46,112,121,99,84,114,60,0,0,0,70,41, - 3,122,4,46,112,121,99,84,70,41,3,114,61,0,0,0, - 70,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,20,0,0,0, - 124,0,106,0,124,1,160,1,100,1,161,1,100,2,25,0, - 23,0,83,0,41,3,78,218,1,46,233,2,0,0,0,41, - 2,114,31,0,0,0,218,10,114,112,97,114,116,105,116,105, - 111,110,41,2,114,32,0,0,0,114,38,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,114,36,0, - 0,0,52,1,0,0,115,2,0,0,0,0,1,114,36,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,18,0,0,0, - 124,1,116,0,23,0,125,2,124,2,124,0,106,1,107,6, - 83,0,169,1,78,41,2,114,20,0,0,0,114,28,0,0, - 0,41,3,114,32,0,0,0,114,13,0,0,0,90,7,100, - 105,114,112,97,116,104,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,37,0,0,0,56,1,0,0,115,4, - 0,0,0,0,4,8,2,114,37,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,7,0,0,0,4,0,0, - 0,67,0,0,0,115,56,0,0,0,116,0,124,0,124,1, - 131,2,125,2,116,1,68,0,93,36,92,3,125,3,125,4, - 125,5,124,2,124,3,23,0,125,6,124,6,124,0,106,2, - 107,6,114,14,124,5,2,0,1,0,83,0,113,14,100,0, - 83,0,114,88,0,0,0,41,3,114,36,0,0,0,218,16, - 95,122,105,112,95,115,101,97,114,99,104,111,114,100,101,114, - 114,28,0,0,0,41,7,114,32,0,0,0,114,38,0,0, - 0,114,13,0,0,0,218,6,115,117,102,102,105,120,218,10, - 105,115,98,121,116,101,99,111,100,101,114,47,0,0,0,114, - 63,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,114,35,0,0,0,65,1,0,0,115,12,0,0, - 0,0,1,10,1,14,1,8,1,10,1,10,1,114,35,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,26, - 0,0,0,9,0,0,0,67,0,0,0,115,18,5,0,0, - 122,14,116,0,160,1,124,0,161,1,125,1,87,0,110,38, - 4,0,116,2,107,10,114,52,1,0,1,0,1,0,116,3, - 100,1,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 89,0,110,2,48,0,124,1,144,4,143,178,1,0,122,36, - 124,1,160,4,116,5,11,0,100,3,161,2,1,0,124,1, - 160,6,161,0,125,2,124,1,160,7,116,5,161,1,125,3, - 87,0,110,38,4,0,116,2,107,10,114,136,1,0,1,0, + 0,114,36,0,0,0,52,1,0,0,115,2,0,0,0,0, + 1,114,36,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 18,0,0,0,124,1,116,0,23,0,125,2,124,2,124,0, + 106,1,118,0,83,0,169,1,78,41,2,114,20,0,0,0, + 114,28,0,0,0,41,3,114,32,0,0,0,114,13,0,0, + 0,90,7,100,105,114,112,97,116,104,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,37,0,0,0,56,1, + 0,0,115,4,0,0,0,0,4,8,2,114,37,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,7,0,0, + 0,4,0,0,0,67,0,0,0,115,56,0,0,0,116,0, + 124,0,124,1,131,2,125,2,116,1,68,0,93,36,92,3, + 125,3,125,4,125,5,124,2,124,3,23,0,125,6,124,6, + 124,0,106,2,118,0,114,14,124,5,2,0,1,0,83,0, + 113,14,100,0,83,0,114,88,0,0,0,41,3,114,36,0, + 0,0,218,16,95,122,105,112,95,115,101,97,114,99,104,111, + 114,100,101,114,114,28,0,0,0,41,7,114,32,0,0,0, + 114,38,0,0,0,114,13,0,0,0,218,6,115,117,102,102, + 105,120,218,10,105,115,98,121,116,101,99,111,100,101,114,47, + 0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,35,0,0,0,65,1,0,0, + 115,12,0,0,0,0,1,10,1,14,1,8,1,10,1,10, + 1,114,35,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,26,0,0,0,9,0,0,0,67,0,0,0,115, + 2,5,0,0,122,14,116,0,160,1,124,0,161,1,125,1, + 87,0,110,36,4,0,116,2,121,50,1,0,1,0,1,0, + 116,3,100,1,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,89,0,110,2,48,0,124,1,144,4,143,164,1,0, + 122,36,124,1,160,4,116,5,11,0,100,3,161,2,1,0, + 124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1, + 125,3,87,0,110,36,4,0,116,2,121,132,1,0,1,0, 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, 141,2,130,1,89,0,110,2,48,0,116,8,124,3,131,1, - 116,5,107,3,114,168,116,3,100,4,124,0,155,2,157,2, + 116,5,107,3,114,164,116,3,100,4,124,0,155,2,157,2, 124,0,100,2,141,2,130,1,124,3,100,0,100,5,133,2, - 25,0,116,9,107,3,144,1,114,178,122,24,124,1,160,4, + 25,0,116,9,107,3,144,1,114,170,122,24,124,1,160,4, 100,6,100,3,161,2,1,0,124,1,160,6,161,0,125,4, - 87,0,110,38,4,0,116,2,107,10,114,248,1,0,1,0, - 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,89,0,110,2,48,0,116,10,124,4,116,11, - 24,0,116,5,24,0,100,6,131,2,125,5,122,22,124,1, - 160,4,124,5,161,1,1,0,124,1,160,7,161,0,125,6, - 87,0,110,40,4,0,116,2,107,10,144,1,114,74,1,0, + 87,0,110,36,4,0,116,2,121,242,1,0,1,0,1,0, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,89,0,110,2,48,0,116,10,124,4,116,11,24,0, + 116,5,24,0,100,6,131,2,125,5,122,22,124,1,160,4, + 124,5,161,1,1,0,124,1,160,7,161,0,125,6,87,0, + 110,38,4,0,116,2,144,1,121,66,1,0,1,0,1,0, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,89,0,110,2,48,0,124,6,160,12,116,9,161,1, + 125,7,124,7,100,6,107,0,144,1,114,106,116,3,100,7, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,6, + 124,7,124,7,116,5,23,0,133,2,25,0,125,3,116,8, + 124,3,131,1,116,5,107,3,144,1,114,154,116,3,100,8, + 124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,4, + 116,8,124,6,131,1,24,0,124,7,23,0,125,2,116,13, + 124,3,100,9,100,10,133,2,25,0,131,1,125,8,116,13, + 124,3,100,10,100,11,133,2,25,0,131,1,125,9,124,2, + 124,8,107,0,144,1,114,230,116,3,100,12,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,124,2,124,9,107,0, + 144,2,114,2,116,3,100,13,124,0,155,2,157,2,124,0, + 100,2,141,2,130,1,124,2,124,8,56,0,125,2,124,2, + 124,9,24,0,125,10,124,10,100,6,107,0,144,2,114,46, + 116,3,100,14,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,105,0,125,11,100,6,125,12,122,14,124,1,160,4, + 124,2,161,1,1,0,87,0,110,38,4,0,116,2,144,2, + 121,106,1,0,1,0,1,0,116,3,100,4,124,0,155,2, + 157,2,124,0,100,2,141,2,130,1,89,0,110,2,48,0, + 124,1,160,7,100,15,161,1,125,3,116,8,124,3,131,1, + 100,5,107,0,144,2,114,140,116,14,100,16,131,1,130,1, + 124,3,100,0,100,5,133,2,25,0,100,17,107,3,144,2, + 114,162,144,4,113,208,116,8,124,3,131,1,100,15,107,3, + 144,2,114,184,116,14,100,16,131,1,130,1,116,15,124,3, + 100,18,100,19,133,2,25,0,131,1,125,13,116,15,124,3, + 100,19,100,9,133,2,25,0,131,1,125,14,116,15,124,3, + 100,9,100,20,133,2,25,0,131,1,125,15,116,15,124,3, + 100,20,100,10,133,2,25,0,131,1,125,16,116,13,124,3, + 100,10,100,11,133,2,25,0,131,1,125,17,116,13,124,3, + 100,11,100,21,133,2,25,0,131,1,125,18,116,13,124,3, + 100,21,100,22,133,2,25,0,131,1,125,4,116,15,124,3, + 100,22,100,23,133,2,25,0,131,1,125,19,116,15,124,3, + 100,23,100,24,133,2,25,0,131,1,125,20,116,15,124,3, + 100,24,100,25,133,2,25,0,131,1,125,21,116,13,124,3, + 100,26,100,15,133,2,25,0,131,1,125,22,124,19,124,20, + 23,0,124,21,23,0,125,8,124,22,124,9,107,4,144,3, + 114,144,116,3,100,27,124,0,155,2,157,2,124,0,100,2, + 141,2,130,1,124,22,124,10,55,0,125,22,122,14,124,1, + 160,7,124,19,161,1,125,23,87,0,110,38,4,0,116,2, + 144,3,121,204,1,0,1,0,1,0,116,3,100,4,124,0, + 155,2,157,2,124,0,100,2,141,2,130,1,89,0,110,2, + 48,0,116,8,124,23,131,1,124,19,107,3,144,3,114,238, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,122,50,116,8,124,1,160,7,124,8,124,19,24,0, + 161,1,131,1,124,8,124,19,24,0,107,3,144,4,114,30, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,87,0,110,38,4,0,116,2,144,4,121,70,1,0, 1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,89,0,110,2,48,0,124,6,160,12, - 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,114, - 116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2, - 130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0, - 125,3,116,8,124,3,131,1,116,5,107,3,144,1,114,162, - 116,3,100,8,124,0,155,2,157,2,124,0,100,2,141,2, - 130,1,124,4,116,8,124,6,131,1,24,0,124,7,23,0, - 125,2,116,13,124,3,100,9,100,10,133,2,25,0,131,1, - 125,8,116,13,124,3,100,10,100,11,133,2,25,0,131,1, - 125,9,124,2,124,8,107,0,144,1,114,238,116,3,100,12, - 124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,2, - 124,9,107,0,144,2,114,10,116,3,100,13,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,124,2,124,8,56,0, - 125,2,124,2,124,9,24,0,125,10,124,10,100,6,107,0, - 144,2,114,54,116,3,100,14,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14, - 124,1,160,4,124,2,161,1,1,0,87,0,110,40,4,0, - 116,2,107,10,144,2,114,116,1,0,1,0,1,0,116,3, - 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 89,0,110,2,48,0,124,1,160,7,100,15,161,1,125,3, - 116,8,124,3,131,1,100,5,107,0,144,2,114,150,116,14, - 100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0, - 100,17,107,3,144,2,114,172,144,4,113,224,116,8,124,3, - 131,1,100,15,107,3,144,2,114,194,116,14,100,16,131,1, - 130,1,116,15,124,3,100,18,100,19,133,2,25,0,131,1, - 125,13,116,15,124,3,100,19,100,9,133,2,25,0,131,1, - 125,14,116,15,124,3,100,9,100,20,133,2,25,0,131,1, - 125,15,116,15,124,3,100,20,100,10,133,2,25,0,131,1, - 125,16,116,13,124,3,100,10,100,11,133,2,25,0,131,1, - 125,17,116,13,124,3,100,11,100,21,133,2,25,0,131,1, - 125,18,116,13,124,3,100,21,100,22,133,2,25,0,131,1, - 125,4,116,15,124,3,100,22,100,23,133,2,25,0,131,1, - 125,19,116,15,124,3,100,23,100,24,133,2,25,0,131,1, - 125,20,116,15,124,3,100,24,100,25,133,2,25,0,131,1, - 125,21,116,13,124,3,100,26,100,15,133,2,25,0,131,1, - 125,22,124,19,124,20,23,0,124,21,23,0,125,8,124,22, - 124,9,107,4,144,3,114,154,116,3,100,27,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,124,22,124,10,55,0, - 125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0, - 110,40,4,0,116,2,107,10,144,3,114,216,1,0,1,0, - 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,89,0,110,2,48,0,116,8,124,23,131,1, - 124,19,107,3,144,3,114,250,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,122,50,116,8,124,1, - 160,7,124,8,124,19,24,0,161,1,131,1,124,8,124,19, - 24,0,107,3,144,4,114,42,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,87,0,110,40,4,0, - 116,2,107,10,144,4,114,84,1,0,1,0,1,0,116,3, - 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 89,0,110,2,48,0,124,13,100,28,64,0,144,4,114,106, - 124,23,160,16,161,0,125,23,110,54,122,14,124,23,160,16, - 100,29,161,1,125,23,87,0,110,38,4,0,116,17,107,10, - 144,4,114,158,1,0,1,0,1,0,124,23,160,16,100,30, - 161,1,160,18,116,19,161,1,125,23,89,0,110,2,48,0, - 124,23,160,20,100,31,116,21,161,2,125,23,116,22,160,23, - 124,0,124,23,161,2,125,24,124,24,124,14,124,18,124,4, - 124,22,124,15,124,16,124,17,102,8,125,25,124,25,124,11, - 124,23,60,0,124,12,100,32,55,0,125,12,144,2,113,118, - 87,0,100,0,4,0,4,0,131,3,1,0,110,18,49,0, - 144,4,115,246,48,0,1,0,1,0,1,0,89,0,1,0, - 116,24,160,25,100,33,124,12,124,0,161,3,1,0,124,11, - 83,0,41,34,78,122,21,99,97,110,39,116,32,111,112,101, - 110,32,90,105,112,32,102,105,108,101,58,32,114,12,0,0, - 0,114,86,0,0,0,250,21,99,97,110,39,116,32,114,101, - 97,100,32,90,105,112,32,102,105,108,101,58,32,233,4,0, - 0,0,114,0,0,0,0,122,16,110,111,116,32,97,32,90, - 105,112,32,102,105,108,101,58,32,122,18,99,111,114,114,117, - 112,116,32,90,105,112,32,102,105,108,101,58,32,233,12,0, - 0,0,233,16,0,0,0,233,20,0,0,0,122,28,98,97, - 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, - 111,114,121,32,115,105,122,101,58,32,122,30,98,97,100,32, - 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, - 121,32,111,102,102,115,101,116,58,32,122,38,98,97,100,32, - 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, - 121,32,115,105,122,101,32,111,114,32,111,102,102,115,101,116, - 58,32,233,46,0,0,0,250,27,69,79,70,32,114,101,97, - 100,32,119,104,101,114,101,32,110,111,116,32,101,120,112,101, - 99,116,101,100,115,4,0,0,0,80,75,1,2,233,8,0, - 0,0,233,10,0,0,0,233,14,0,0,0,233,24,0,0, - 0,233,28,0,0,0,233,30,0,0,0,233,32,0,0,0, - 233,34,0,0,0,233,42,0,0,0,122,25,98,97,100,32, - 108,111,99,97,108,32,104,101,97,100,101,114,32,111,102,102, - 115,101,116,58,32,105,0,8,0,0,218,5,97,115,99,105, - 105,90,6,108,97,116,105,110,49,250,1,47,114,5,0,0, - 0,122,33,122,105,112,105,109,112,111,114,116,58,32,102,111, - 117,110,100,32,123,125,32,110,97,109,101,115,32,105,110,32, - 123,33,114,125,41,26,218,3,95,105,111,218,9,111,112,101, - 110,95,99,111,100,101,114,22,0,0,0,114,3,0,0,0, - 218,4,115,101,101,107,218,20,69,78,68,95,67,69,78,84, - 82,65,76,95,68,73,82,95,83,73,90,69,90,4,116,101, - 108,108,218,4,114,101,97,100,114,51,0,0,0,218,18,83, - 84,82,73,78,71,95,69,78,68,95,65,82,67,72,73,86, - 69,218,3,109,97,120,218,15,77,65,88,95,67,79,77,77, - 69,78,84,95,76,69,78,218,5,114,102,105,110,100,114,2, - 0,0,0,218,8,69,79,70,69,114,114,111,114,114,1,0, - 0,0,114,62,0,0,0,218,18,85,110,105,99,111,100,101, - 68,101,99,111,100,101,69,114,114,111,114,218,9,116,114,97, - 110,115,108,97,116,101,218,11,99,112,52,51,55,95,116,97, - 98,108,101,114,19,0,0,0,114,20,0,0,0,114,21,0, - 0,0,114,30,0,0,0,114,76,0,0,0,114,77,0,0, - 0,41,26,114,29,0,0,0,218,2,102,112,90,15,104,101, - 97,100,101,114,95,112,111,115,105,116,105,111,110,218,6,98, - 117,102,102,101,114,218,9,102,105,108,101,95,115,105,122,101, - 90,17,109,97,120,95,99,111,109,109,101,110,116,95,115,116, - 97,114,116,218,4,100,97,116,97,90,3,112,111,115,218,11, - 104,101,97,100,101,114,95,115,105,122,101,90,13,104,101,97, - 100,101,114,95,111,102,102,115,101,116,90,10,97,114,99,95, - 111,102,102,115,101,116,114,33,0,0,0,218,5,99,111,117, - 110,116,218,5,102,108,97,103,115,218,8,99,111,109,112,114, - 101,115,115,218,4,116,105,109,101,218,4,100,97,116,101,218, - 3,99,114,99,218,9,100,97,116,97,95,115,105,122,101,218, - 9,110,97,109,101,95,115,105,122,101,218,10,101,120,116,114, - 97,95,115,105,122,101,90,12,99,111,109,109,101,110,116,95, - 115,105,122,101,218,11,102,105,108,101,95,111,102,102,115,101, - 116,114,59,0,0,0,114,13,0,0,0,218,1,116,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,114,27,0, - 0,0,96,1,0,0,115,212,0,0,0,0,1,2,1,14, - 1,14,1,24,2,8,1,2,1,14,1,8,1,14,1,14, - 1,24,1,12,1,18,1,18,3,2,1,12,1,12,1,14, - 1,10,1,2,255,12,2,8,1,2,255,2,1,2,255,4, - 2,2,1,10,1,12,1,16,1,10,1,2,255,12,2,10, - 1,10,1,10,1,2,255,6,2,16,1,14,1,10,1,2, - 255,6,2,16,2,16,1,16,1,10,1,18,1,10,1,18, - 1,8,1,8,1,10,1,18,2,4,2,4,1,2,1,14, - 1,16,1,24,2,10,1,14,1,8,2,18,1,4,1,14, - 1,8,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,12,1,10,1,18,1,8, - 2,2,1,14,1,16,1,24,1,14,1,18,4,2,1,28, - 1,22,1,16,1,24,2,10,2,10,3,2,1,14,1,16, - 1,22,2,12,1,12,1,20,1,8,1,44,1,14,1,114, - 27,0,0,0,117,190,1,0,0,0,1,2,3,4,5,6, - 7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, - 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38, - 39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54, - 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70, - 71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86, - 87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102, - 103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, - 119,120,121,122,123,124,125,126,127,195,135,195,188,195,169,195, - 162,195,164,195,160,195,165,195,167,195,170,195,171,195,168,195, - 175,195,174,195,172,195,132,195,133,195,137,195,166,195,134,195, - 180,195,182,195,178,195,187,195,185,195,191,195,150,195,156,194, - 162,194,163,194,165,226,130,167,198,146,195,161,195,173,195,179, - 195,186,195,177,195,145,194,170,194,186,194,191,226,140,144,194, - 172,194,189,194,188,194,161,194,171,194,187,226,150,145,226,150, - 146,226,150,147,226,148,130,226,148,164,226,149,161,226,149,162, - 226,149,150,226,149,149,226,149,163,226,149,145,226,149,151,226, - 149,157,226,149,156,226,149,155,226,148,144,226,148,148,226,148, - 180,226,148,172,226,148,156,226,148,128,226,148,188,226,149,158, - 226,149,159,226,149,154,226,149,148,226,149,169,226,149,166,226, - 149,160,226,149,144,226,149,172,226,149,167,226,149,168,226,149, - 164,226,149,165,226,149,153,226,149,152,226,149,146,226,149,147, - 226,149,171,226,149,170,226,148,152,226,148,140,226,150,136,226, - 150,132,226,150,140,226,150,144,226,150,128,206,177,195,159,206, - 147,207,128,206,163,207,131,194,181,207,132,206,166,206,152,206, - 169,206,180,226,136,158,207,134,206,181,226,136,169,226,137,161, - 194,177,226,137,165,226,137,164,226,140,160,226,140,161,195,183, - 226,137,136,194,176,226,136,153,194,183,226,136,154,226,129,191, - 194,178,226,150,160,194,160,99,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,0, - 115,112,0,0,0,116,0,114,22,116,1,160,2,100,1,161, - 1,1,0,116,3,100,2,131,1,130,1,100,3,97,0,122, - 64,122,16,100,4,100,5,108,4,109,5,125,0,1,0,87, - 0,110,38,4,0,116,6,107,10,114,82,1,0,1,0,1, - 0,116,1,160,2,100,1,161,1,1,0,116,3,100,2,131, - 1,130,1,89,0,110,2,48,0,87,0,100,6,97,0,110, - 6,100,6,97,0,48,0,116,1,160,2,100,7,161,1,1, - 0,124,0,83,0,41,8,78,122,27,122,105,112,105,109,112, - 111,114,116,58,32,122,108,105,98,32,85,78,65,86,65,73, - 76,65,66,76,69,250,41,99,97,110,39,116,32,100,101,99, - 111,109,112,114,101,115,115,32,100,97,116,97,59,32,122,108, - 105,98,32,110,111,116,32,97,118,97,105,108,97,98,108,101, - 84,114,0,0,0,0,169,1,218,10,100,101,99,111,109,112, - 114,101,115,115,70,122,25,122,105,112,105,109,112,111,114,116, - 58,32,122,108,105,98,32,97,118,97,105,108,97,98,108,101, - 41,7,218,15,95,105,109,112,111,114,116,105,110,103,95,122, - 108,105,98,114,76,0,0,0,114,77,0,0,0,114,3,0, - 0,0,90,4,122,108,105,98,114,141,0,0,0,218,9,69, - 120,99,101,112,116,105,111,110,114,140,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,20,95,103, - 101,116,95,100,101,99,111,109,112,114,101,115,115,95,102,117, - 110,99,254,1,0,0,115,26,0,0,0,0,2,4,3,10, - 1,8,2,4,1,4,1,16,1,14,1,10,1,16,2,6, - 0,6,2,10,1,114,144,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,17,0,0,0,9,0,0,0,67, - 0,0,0,115,150,1,0,0,124,1,92,8,125,2,125,3, - 125,4,125,5,125,6,125,7,125,8,125,9,124,4,100,1, - 107,0,114,36,116,0,100,2,131,1,130,1,116,1,160,2, - 124,0,161,1,144,1,143,18,125,10,122,14,124,10,160,3, - 124,6,161,1,1,0,87,0,110,38,4,0,116,4,107,10, - 114,102,1,0,1,0,1,0,116,0,100,3,124,0,155,2, + 100,2,141,2,130,1,89,0,110,2,48,0,124,13,100,28, + 64,0,144,4,114,92,124,23,160,16,161,0,125,23,110,52, + 122,14,124,23,160,16,100,29,161,1,125,23,87,0,110,36, + 4,0,116,17,144,4,121,142,1,0,1,0,1,0,124,23, + 160,16,100,30,161,1,160,18,116,19,161,1,125,23,89,0, + 110,2,48,0,124,23,160,20,100,31,116,21,161,2,125,23, + 116,22,160,23,124,0,124,23,161,2,125,24,124,24,124,14, + 124,18,124,4,124,22,124,15,124,16,124,17,102,8,125,25, + 124,25,124,11,124,23,60,0,124,12,100,32,55,0,125,12, + 144,2,113,108,87,0,100,0,4,0,4,0,131,3,1,0, + 110,18,49,0,144,4,115,230,48,0,1,0,1,0,1,0, + 89,0,1,0,116,24,160,25,100,33,124,12,124,0,161,3, + 1,0,124,11,83,0,41,34,78,122,21,99,97,110,39,116, + 32,111,112,101,110,32,90,105,112,32,102,105,108,101,58,32, + 114,12,0,0,0,114,86,0,0,0,250,21,99,97,110,39, + 116,32,114,101,97,100,32,90,105,112,32,102,105,108,101,58, + 32,233,4,0,0,0,114,0,0,0,0,122,16,110,111,116, + 32,97,32,90,105,112,32,102,105,108,101,58,32,122,18,99, + 111,114,114,117,112,116,32,90,105,112,32,102,105,108,101,58, + 32,233,12,0,0,0,233,16,0,0,0,233,20,0,0,0, + 122,28,98,97,100,32,99,101,110,116,114,97,108,32,100,105, + 114,101,99,116,111,114,121,32,115,105,122,101,58,32,122,30, + 98,97,100,32,99,101,110,116,114,97,108,32,100,105,114,101, + 99,116,111,114,121,32,111,102,102,115,101,116,58,32,122,38, + 98,97,100,32,99,101,110,116,114,97,108,32,100,105,114,101, + 99,116,111,114,121,32,115,105,122,101,32,111,114,32,111,102, + 102,115,101,116,58,32,233,46,0,0,0,250,27,69,79,70, + 32,114,101,97,100,32,119,104,101,114,101,32,110,111,116,32, + 101,120,112,101,99,116,101,100,115,4,0,0,0,80,75,1, + 2,233,8,0,0,0,233,10,0,0,0,233,14,0,0,0, + 233,24,0,0,0,233,28,0,0,0,233,30,0,0,0,233, + 32,0,0,0,233,34,0,0,0,233,42,0,0,0,122,25, + 98,97,100,32,108,111,99,97,108,32,104,101,97,100,101,114, + 32,111,102,102,115,101,116,58,32,105,0,8,0,0,218,5, + 97,115,99,105,105,90,6,108,97,116,105,110,49,250,1,47, + 114,5,0,0,0,122,33,122,105,112,105,109,112,111,114,116, + 58,32,102,111,117,110,100,32,123,125,32,110,97,109,101,115, + 32,105,110,32,123,33,114,125,41,26,218,3,95,105,111,218, + 9,111,112,101,110,95,99,111,100,101,114,22,0,0,0,114, + 3,0,0,0,218,4,115,101,101,107,218,20,69,78,68,95, + 67,69,78,84,82,65,76,95,68,73,82,95,83,73,90,69, + 90,4,116,101,108,108,218,4,114,101,97,100,114,51,0,0, + 0,218,18,83,84,82,73,78,71,95,69,78,68,95,65,82, + 67,72,73,86,69,218,3,109,97,120,218,15,77,65,88,95, + 67,79,77,77,69,78,84,95,76,69,78,218,5,114,102,105, + 110,100,114,2,0,0,0,218,8,69,79,70,69,114,114,111, + 114,114,1,0,0,0,114,62,0,0,0,218,18,85,110,105, + 99,111,100,101,68,101,99,111,100,101,69,114,114,111,114,218, + 9,116,114,97,110,115,108,97,116,101,218,11,99,112,52,51, + 55,95,116,97,98,108,101,114,19,0,0,0,114,20,0,0, + 0,114,21,0,0,0,114,30,0,0,0,114,76,0,0,0, + 114,77,0,0,0,41,26,114,29,0,0,0,218,2,102,112, + 90,15,104,101,97,100,101,114,95,112,111,115,105,116,105,111, + 110,218,6,98,117,102,102,101,114,218,9,102,105,108,101,95, + 115,105,122,101,90,17,109,97,120,95,99,111,109,109,101,110, + 116,95,115,116,97,114,116,218,4,100,97,116,97,90,3,112, + 111,115,218,11,104,101,97,100,101,114,95,115,105,122,101,90, + 13,104,101,97,100,101,114,95,111,102,102,115,101,116,90,10, + 97,114,99,95,111,102,102,115,101,116,114,33,0,0,0,218, + 5,99,111,117,110,116,218,5,102,108,97,103,115,218,8,99, + 111,109,112,114,101,115,115,218,4,116,105,109,101,218,4,100, + 97,116,101,218,3,99,114,99,218,9,100,97,116,97,95,115, + 105,122,101,218,9,110,97,109,101,95,115,105,122,101,218,10, + 101,120,116,114,97,95,115,105,122,101,90,12,99,111,109,109, + 101,110,116,95,115,105,122,101,218,11,102,105,108,101,95,111, + 102,102,115,101,116,114,59,0,0,0,114,13,0,0,0,218, + 1,116,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,27,0,0,0,96,1,0,0,115,212,0,0,0,0, + 1,2,1,14,1,12,1,24,2,8,1,2,1,14,1,8, + 1,14,1,12,1,24,1,12,1,18,1,18,3,2,1,12, + 1,12,1,12,1,10,1,2,255,12,2,8,1,2,255,2, + 1,2,255,4,2,2,1,10,1,12,1,14,1,10,1,2, + 255,12,2,10,1,10,1,10,1,2,255,6,2,16,1,14, + 1,10,1,2,255,6,2,16,2,16,1,16,1,10,1,18, + 1,10,1,18,1,8,1,8,1,10,1,18,2,4,2,4, + 1,2,1,14,1,14,1,24,2,10,1,14,1,8,2,18, + 1,4,1,14,1,8,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,12,1,10, + 1,18,1,8,2,2,1,14,1,14,1,24,1,14,1,18, + 4,2,1,28,1,22,1,14,1,24,2,10,2,10,3,2, + 1,14,1,14,1,22,2,12,1,12,1,20,1,8,1,44, + 1,14,1,114,27,0,0,0,117,190,1,0,0,0,1,2, + 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, + 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, + 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50, + 51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82, + 83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98, + 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114, + 115,116,117,118,119,120,121,122,123,124,125,126,127,195,135,195, + 188,195,169,195,162,195,164,195,160,195,165,195,167,195,170,195, + 171,195,168,195,175,195,174,195,172,195,132,195,133,195,137,195, + 166,195,134,195,180,195,182,195,178,195,187,195,185,195,191,195, + 150,195,156,194,162,194,163,194,165,226,130,167,198,146,195,161, + 195,173,195,179,195,186,195,177,195,145,194,170,194,186,194,191, + 226,140,144,194,172,194,189,194,188,194,161,194,171,194,187,226, + 150,145,226,150,146,226,150,147,226,148,130,226,148,164,226,149, + 161,226,149,162,226,149,150,226,149,149,226,149,163,226,149,145, + 226,149,151,226,149,157,226,149,156,226,149,155,226,148,144,226, + 148,148,226,148,180,226,148,172,226,148,156,226,148,128,226,148, + 188,226,149,158,226,149,159,226,149,154,226,149,148,226,149,169, + 226,149,166,226,149,160,226,149,144,226,149,172,226,149,167,226, + 149,168,226,149,164,226,149,165,226,149,153,226,149,152,226,149, + 146,226,149,147,226,149,171,226,149,170,226,148,152,226,148,140, + 226,150,136,226,150,132,226,150,140,226,150,144,226,150,128,206, + 177,195,159,206,147,207,128,206,163,207,131,194,181,207,132,206, + 166,206,152,206,169,206,180,226,136,158,207,134,206,181,226,136, + 169,226,137,161,194,177,226,137,165,226,137,164,226,140,160,226, + 140,161,195,183,226,137,136,194,176,226,136,153,194,183,226,136, + 154,226,129,191,194,178,226,150,160,194,160,99,0,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0, + 67,0,0,0,115,110,0,0,0,116,0,114,22,116,1,160, + 2,100,1,161,1,1,0,116,3,100,2,131,1,130,1,100, + 3,97,0,122,62,122,16,100,4,100,5,108,4,109,5,125, + 0,1,0,87,0,110,36,4,0,116,6,121,80,1,0,1, + 0,1,0,116,1,160,2,100,1,161,1,1,0,116,3,100, + 2,131,1,130,1,89,0,110,2,48,0,87,0,100,6,97, + 0,110,6,100,6,97,0,48,0,116,1,160,2,100,7,161, + 1,1,0,124,0,83,0,41,8,78,122,27,122,105,112,105, + 109,112,111,114,116,58,32,122,108,105,98,32,85,78,65,86, + 65,73,76,65,66,76,69,250,41,99,97,110,39,116,32,100, + 101,99,111,109,112,114,101,115,115,32,100,97,116,97,59,32, + 122,108,105,98,32,110,111,116,32,97,118,97,105,108,97,98, + 108,101,84,114,0,0,0,0,169,1,218,10,100,101,99,111, + 109,112,114,101,115,115,70,122,25,122,105,112,105,109,112,111, + 114,116,58,32,122,108,105,98,32,97,118,97,105,108,97,98, + 108,101,41,7,218,15,95,105,109,112,111,114,116,105,110,103, + 95,122,108,105,98,114,76,0,0,0,114,77,0,0,0,114, + 3,0,0,0,90,4,122,108,105,98,114,141,0,0,0,218, + 9,69,120,99,101,112,116,105,111,110,114,140,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,20, + 95,103,101,116,95,100,101,99,111,109,112,114,101,115,115,95, + 102,117,110,99,254,1,0,0,115,26,0,0,0,0,2,4, + 3,10,1,8,2,4,1,4,1,16,1,12,1,10,1,16, + 2,6,0,6,2,10,1,114,144,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,17,0,0,0,9,0,0, + 0,67,0,0,0,115,144,1,0,0,124,1,92,8,125,2, + 125,3,125,4,125,5,125,6,125,7,125,8,125,9,124,4, + 100,1,107,0,114,36,116,0,100,2,131,1,130,1,116,1, + 160,2,124,0,161,1,144,1,143,14,125,10,122,14,124,10, + 160,3,124,6,161,1,1,0,87,0,110,36,4,0,116,4, + 121,100,1,0,1,0,1,0,116,0,100,3,124,0,155,2, 157,2,124,0,100,4,141,2,130,1,89,0,110,2,48,0, 124,10,160,5,100,5,161,1,125,11,116,6,124,11,131,1, - 100,5,107,3,114,134,116,7,100,6,131,1,130,1,124,11, - 100,0,100,7,133,2,25,0,100,8,107,3,114,168,116,0, + 100,5,107,3,114,132,116,7,100,6,131,1,130,1,124,11, + 100,0,100,7,133,2,25,0,100,8,107,3,114,166,116,0, 100,9,124,0,155,2,157,2,124,0,100,4,141,2,130,1, 116,8,124,11,100,10,100,11,133,2,25,0,131,1,125,12, 116,8,124,11,100,11,100,5,133,2,25,0,131,1,125,13, 100,5,124,12,23,0,124,13,23,0,125,14,124,6,124,14, 55,0,125,6,122,14,124,10,160,3,124,6,161,1,1,0, - 87,0,110,40,4,0,116,4,107,10,144,1,114,18,1,0, - 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, - 100,4,141,2,130,1,89,0,110,2,48,0,124,10,160,5, - 124,4,161,1,125,15,116,6,124,15,131,1,124,4,107,3, - 144,1,114,52,116,4,100,12,131,1,130,1,87,0,100,0, - 4,0,4,0,131,3,1,0,110,18,49,0,144,1,115,74, - 48,0,1,0,1,0,1,0,89,0,1,0,124,3,100,1, - 107,2,144,1,114,98,124,15,83,0,122,10,116,9,131,0, - 125,16,87,0,110,30,4,0,116,10,107,10,144,1,114,138, - 1,0,1,0,1,0,116,0,100,13,131,1,130,1,89,0, - 110,2,48,0,124,16,124,15,100,14,131,2,83,0,41,15, - 78,114,0,0,0,0,122,18,110,101,103,97,116,105,118,101, - 32,100,97,116,97,32,115,105,122,101,114,92,0,0,0,114, - 12,0,0,0,114,104,0,0,0,114,98,0,0,0,114,93, - 0,0,0,115,4,0,0,0,80,75,3,4,122,23,98,97, - 100,32,108,111,99,97,108,32,102,105,108,101,32,104,101,97, - 100,101,114,58,32,233,26,0,0,0,114,103,0,0,0,122, - 26,122,105,112,105,109,112,111,114,116,58,32,99,97,110,39, - 116,32,114,101,97,100,32,100,97,116,97,114,139,0,0,0, - 105,241,255,255,255,41,11,114,3,0,0,0,114,110,0,0, - 0,114,111,0,0,0,114,112,0,0,0,114,22,0,0,0, - 114,114,0,0,0,114,51,0,0,0,114,119,0,0,0,114, - 1,0,0,0,114,144,0,0,0,114,143,0,0,0,41,17, - 114,29,0,0,0,114,54,0,0,0,90,8,100,97,116,97, - 112,97,116,104,114,130,0,0,0,114,134,0,0,0,114,125, - 0,0,0,114,137,0,0,0,114,131,0,0,0,114,132,0, - 0,0,114,133,0,0,0,114,123,0,0,0,114,124,0,0, - 0,114,135,0,0,0,114,136,0,0,0,114,127,0,0,0, - 90,8,114,97,119,95,100,97,116,97,114,141,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,52, - 0,0,0,19,2,0,0,115,62,0,0,0,0,1,20,1, - 8,1,8,2,14,2,2,1,14,1,14,1,24,1,10,1, - 12,1,8,2,16,2,18,2,16,1,16,1,12,1,8,1, - 2,1,14,1,16,1,24,1,10,1,14,1,40,2,10,2, - 4,3,2,1,10,1,16,1,14,1,114,52,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,124, - 0,124,1,24,0,131,1,100,1,107,1,83,0,41,2,78, - 114,5,0,0,0,41,1,218,3,97,98,115,41,2,90,2, - 116,49,90,2,116,50,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,9,95,101,113,95,109,116,105,109,101, - 65,2,0,0,115,2,0,0,0,0,2,114,147,0,0,0, - 99,5,0,0,0,0,0,0,0,0,0,0,0,14,0,0, - 0,8,0,0,0,67,0,0,0,115,60,1,0,0,124,3, - 124,2,100,1,156,2,125,5,122,18,116,0,160,1,124,4, - 124,3,124,5,161,3,125,6,87,0,110,22,4,0,116,2, - 107,10,114,50,1,0,1,0,1,0,89,0,100,0,83,0, - 48,0,124,6,100,2,64,0,100,3,107,3,125,7,124,7, - 114,182,124,6,100,4,64,0,100,3,107,3,125,8,116,3, - 106,4,100,5,107,3,114,180,124,8,115,104,116,3,106,4, - 100,6,107,2,114,180,116,5,124,0,124,2,131,2,125,9, - 124,9,100,0,107,9,114,180,116,3,160,6,116,0,106,7, - 124,9,161,2,125,10,122,20,116,0,160,8,124,4,124,10, - 124,3,124,5,161,4,1,0,87,0,110,22,4,0,116,2, - 107,10,114,178,1,0,1,0,1,0,89,0,100,0,83,0, - 48,0,110,84,116,9,124,0,124,2,131,2,92,2,125,11, - 125,12,124,11,144,1,114,10,116,10,116,11,124,4,100,7, - 100,8,133,2,25,0,131,1,124,11,131,2,114,246,116,11, - 124,4,100,8,100,9,133,2,25,0,131,1,124,12,107,3, - 144,1,114,10,116,12,160,13,100,10,124,3,155,2,157,2, - 161,1,1,0,100,0,83,0,116,14,160,15,124,4,100,9, - 100,0,133,2,25,0,161,1,125,13,116,16,124,13,116,17, - 131,2,144,1,115,56,116,18,100,11,124,1,155,2,100,12, - 157,3,131,1,130,1,124,13,83,0,41,13,78,41,2,114, - 59,0,0,0,114,13,0,0,0,114,5,0,0,0,114,0, - 0,0,0,114,86,0,0,0,90,5,110,101,118,101,114,90, - 6,97,108,119,97,121,115,114,99,0,0,0,114,94,0,0, - 0,114,95,0,0,0,122,22,98,121,116,101,99,111,100,101, - 32,105,115,32,115,116,97,108,101,32,102,111,114,32,122,16, - 99,111,109,112,105,108,101,100,32,109,111,100,117,108,101,32, - 122,21,32,105,115,32,110,111,116,32,97,32,99,111,100,101, - 32,111,98,106,101,99,116,41,19,114,21,0,0,0,90,13, - 95,99,108,97,115,115,105,102,121,95,112,121,99,114,75,0, - 0,0,218,4,95,105,109,112,90,21,99,104,101,99,107,95, - 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,218, - 15,95,103,101,116,95,112,121,99,95,115,111,117,114,99,101, - 218,11,115,111,117,114,99,101,95,104,97,115,104,90,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 90,18,95,118,97,108,105,100,97,116,101,95,104,97,115,104, - 95,112,121,99,218,29,95,103,101,116,95,109,116,105,109,101, - 95,97,110,100,95,115,105,122,101,95,111,102,95,115,111,117, - 114,99,101,114,147,0,0,0,114,2,0,0,0,114,76,0, - 0,0,114,77,0,0,0,218,7,109,97,114,115,104,97,108, - 90,5,108,111,97,100,115,114,15,0,0,0,218,10,95,99, - 111,100,101,95,116,121,112,101,218,9,84,121,112,101,69,114, - 114,111,114,41,14,114,32,0,0,0,114,53,0,0,0,114, - 63,0,0,0,114,38,0,0,0,114,126,0,0,0,90,11, - 101,120,99,95,100,101,116,97,105,108,115,114,129,0,0,0, - 90,10,104,97,115,104,95,98,97,115,101,100,90,12,99,104, - 101,99,107,95,115,111,117,114,99,101,90,12,115,111,117,114, - 99,101,95,98,121,116,101,115,114,150,0,0,0,90,12,115, - 111,117,114,99,101,95,109,116,105,109,101,90,11,115,111,117, - 114,99,101,95,115,105,122,101,114,46,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,117, - 110,109,97,114,115,104,97,108,95,99,111,100,101,75,2,0, - 0,115,88,0,0,0,0,2,2,1,2,254,6,5,2,1, - 18,1,14,1,8,2,12,1,4,1,12,1,10,1,2,255, - 2,1,8,255,2,2,10,1,8,1,4,1,4,1,2,254, - 4,5,2,1,4,1,2,0,2,0,2,0,2,255,8,2, - 14,1,10,3,8,255,6,3,6,3,22,1,18,255,4,2, - 4,1,8,255,4,2,4,2,18,1,12,1,16,1,114,155, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,28,0,0, - 0,124,0,160,0,100,1,100,2,161,2,125,0,124,0,160, - 0,100,3,100,2,161,2,125,0,124,0,83,0,41,4,78, - 115,2,0,0,0,13,10,243,1,0,0,0,10,243,1,0, - 0,0,13,41,1,114,19,0,0,0,41,1,218,6,115,111, - 117,114,99,101,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,23,95,110,111,114,109,97,108,105,122,101,95, - 108,105,110,101,95,101,110,100,105,110,103,115,126,2,0,0, - 115,6,0,0,0,0,1,12,1,12,1,114,159,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,6,0,0,0,67,0,0,0,115,24,0,0,0,116,0, - 124,1,131,1,125,1,116,1,124,1,124,0,100,1,100,2, - 100,3,141,4,83,0,41,4,78,114,74,0,0,0,84,41, - 1,90,12,100,111,110,116,95,105,110,104,101,114,105,116,41, - 2,114,159,0,0,0,218,7,99,111,109,112,105,108,101,41, - 2,114,53,0,0,0,114,158,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,15,95,99,111,109, - 112,105,108,101,95,115,111,117,114,99,101,133,2,0,0,115, - 4,0,0,0,0,1,8,1,114,161,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,11,0, - 0,0,67,0,0,0,115,68,0,0,0,116,0,160,1,124, - 0,100,1,63,0,100,2,23,0,124,0,100,3,63,0,100, - 4,64,0,124,0,100,5,64,0,124,1,100,6,63,0,124, - 1,100,3,63,0,100,7,64,0,124,1,100,5,64,0,100, - 8,20,0,100,9,100,9,100,9,102,9,161,1,83,0,41, - 10,78,233,9,0,0,0,105,188,7,0,0,233,5,0,0, - 0,233,15,0,0,0,233,31,0,0,0,233,11,0,0,0, - 233,63,0,0,0,114,86,0,0,0,114,14,0,0,0,41, - 2,114,131,0,0,0,90,6,109,107,116,105,109,101,41,2, - 218,1,100,114,138,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,14,95,112,97,114,115,101,95, - 100,111,115,116,105,109,101,139,2,0,0,115,22,0,0,0, - 0,1,4,1,10,1,10,1,6,1,6,1,10,1,10,1, - 2,0,2,0,2,249,114,169,0,0,0,99,2,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,10,0,0,0, - 67,0,0,0,115,116,0,0,0,122,82,124,1,100,1,100, - 0,133,2,25,0,100,2,107,6,115,22,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,107,10,114,110,1,0,1,0,1, - 0,89,0,100,6,83,0,48,0,100,0,83,0,41,7,78, - 114,14,0,0,0,169,2,218,1,99,218,1,111,114,163,0, - 0,0,233,6,0,0,0,233,3,0,0,0,41,2,114,0, - 0,0,0,114,0,0,0,0,41,5,114,28,0,0,0,114, - 169,0,0,0,114,26,0,0,0,218,10,73,110,100,101,120, - 69,114,114,111,114,114,154,0,0,0,41,6,114,32,0,0, - 0,114,13,0,0,0,114,54,0,0,0,114,131,0,0,0, - 114,132,0,0,0,90,17,117,110,99,111,109,112,114,101,115, - 115,101,100,95,115,105,122,101,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,151,0,0,0,152,2,0,0, - 115,20,0,0,0,0,1,2,2,20,1,12,1,10,3,8, - 1,8,1,8,1,16,1,20,1,114,151,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, - 0,0,0,67,0,0,0,115,86,0,0,0,124,1,100,1, - 100,0,133,2,25,0,100,2,107,6,115,20,74,0,130,1, - 124,1,100,0,100,1,133,2,25,0,125,1,122,14,124,0, - 106,0,124,1,25,0,125,2,87,0,110,22,4,0,116,1, - 107,10,114,68,1,0,1,0,1,0,89,0,100,0,83,0, - 48,0,116,2,124,0,106,3,124,2,131,2,83,0,100,0, - 83,0,41,3,78,114,14,0,0,0,114,170,0,0,0,41, - 4,114,28,0,0,0,114,26,0,0,0,114,52,0,0,0, - 114,29,0,0,0,41,3,114,32,0,0,0,114,13,0,0, - 0,114,54,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,149,0,0,0,171,2,0,0,115,14, - 0,0,0,0,2,20,1,12,2,2,1,14,1,14,1,8, - 2,114,149,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,11,0,0,0,9,0,0,0,67,0,0,0,115, - 198,0,0,0,116,0,124,0,124,1,131,2,125,2,116,1, - 68,0,93,160,92,3,125,3,125,4,125,5,124,2,124,3, - 23,0,125,6,116,2,106,3,100,1,124,0,106,4,116,5, - 124,6,100,2,100,3,141,5,1,0,122,14,124,0,106,6, - 124,6,25,0,125,7,87,0,110,20,4,0,116,7,107,10, - 114,88,1,0,1,0,1,0,89,0,113,14,48,0,124,7, - 100,4,25,0,125,8,116,8,124,0,106,4,124,7,131,2, - 125,9,124,4,114,132,116,9,124,0,124,8,124,6,124,1, - 124,9,131,5,125,10,110,10,116,10,124,8,124,9,131,2, - 125,10,124,10,100,0,107,8,114,152,113,14,124,7,100,4, - 25,0,125,8,124,10,124,5,124,8,102,3,2,0,1,0, - 83,0,113,14,116,11,100,5,124,1,155,2,157,2,124,1, - 100,6,141,2,130,1,100,0,83,0,41,7,78,122,13,116, - 114,121,105,110,103,32,123,125,123,125,123,125,114,86,0,0, - 0,41,1,90,9,118,101,114,98,111,115,105,116,121,114,0, - 0,0,0,114,57,0,0,0,114,58,0,0,0,41,12,114, - 36,0,0,0,114,89,0,0,0,114,76,0,0,0,114,77, - 0,0,0,114,29,0,0,0,114,20,0,0,0,114,28,0, - 0,0,114,26,0,0,0,114,52,0,0,0,114,155,0,0, - 0,114,161,0,0,0,114,3,0,0,0,41,11,114,32,0, - 0,0,114,38,0,0,0,114,13,0,0,0,114,90,0,0, - 0,114,91,0,0,0,114,47,0,0,0,114,63,0,0,0, - 114,54,0,0,0,114,40,0,0,0,114,126,0,0,0,114, - 46,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,114,44,0,0,0,186,2,0,0,115,36,0,0, - 0,0,1,10,1,14,1,8,1,22,1,2,1,14,1,14, - 1,6,2,8,1,12,1,4,1,18,2,10,1,8,3,2, - 1,8,1,16,2,114,44,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,60,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,90,4,100,3,100,4,132,0,90,5, - 100,5,100,6,132,0,90,6,100,7,100,8,132,0,90,7, - 100,9,100,10,132,0,90,8,100,11,100,12,132,0,90,9, - 100,13,83,0,41,14,114,80,0,0,0,122,165,80,114,105, - 118,97,116,101,32,99,108,97,115,115,32,117,115,101,100,32, - 116,111,32,115,117,112,112,111,114,116,32,90,105,112,73,109, - 112,111,114,116,46,103,101,116,95,114,101,115,111,117,114,99, - 101,95,114,101,97,100,101,114,40,41,46,10,10,32,32,32, - 32,84,104,105,115,32,99,108,97,115,115,32,105,115,32,97, - 108,108,111,119,101,100,32,116,111,32,114,101,102,101,114,101, - 110,99,101,32,97,108,108,32,116,104,101,32,105,110,110,97, - 114,100,115,32,97,110,100,32,112,114,105,118,97,116,101,32, - 112,97,114,116,115,32,111,102,10,32,32,32,32,116,104,101, - 32,122,105,112,105,109,112,111,114,116,101,114,46,10,32,32, - 32,32,70,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,100,0,83, - 0,114,88,0,0,0,41,2,114,4,0,0,0,114,38,0, - 0,0,41,3,114,32,0,0,0,114,4,0,0,0,114,38, + 87,0,110,38,4,0,116,4,144,1,121,14,1,0,1,0, + 1,0,116,0,100,3,124,0,155,2,157,2,124,0,100,4, + 141,2,130,1,89,0,110,2,48,0,124,10,160,5,124,4, + 161,1,125,15,116,6,124,15,131,1,124,4,107,3,144,1, + 114,48,116,4,100,12,131,1,130,1,87,0,100,0,4,0, + 4,0,131,3,1,0,110,18,49,0,144,1,115,70,48,0, + 1,0,1,0,1,0,89,0,1,0,124,3,100,1,107,2, + 144,1,114,94,124,15,83,0,122,10,116,9,131,0,125,16, + 87,0,110,28,4,0,116,10,144,1,121,132,1,0,1,0, + 1,0,116,0,100,13,131,1,130,1,89,0,110,2,48,0, + 124,16,124,15,100,14,131,2,83,0,41,15,78,114,0,0, + 0,0,122,18,110,101,103,97,116,105,118,101,32,100,97,116, + 97,32,115,105,122,101,114,92,0,0,0,114,12,0,0,0, + 114,104,0,0,0,114,98,0,0,0,114,93,0,0,0,115, + 4,0,0,0,80,75,3,4,122,23,98,97,100,32,108,111, + 99,97,108,32,102,105,108,101,32,104,101,97,100,101,114,58, + 32,233,26,0,0,0,114,103,0,0,0,122,26,122,105,112, + 105,109,112,111,114,116,58,32,99,97,110,39,116,32,114,101, + 97,100,32,100,97,116,97,114,139,0,0,0,105,241,255,255, + 255,41,11,114,3,0,0,0,114,110,0,0,0,114,111,0, + 0,0,114,112,0,0,0,114,22,0,0,0,114,114,0,0, + 0,114,51,0,0,0,114,119,0,0,0,114,1,0,0,0, + 114,144,0,0,0,114,143,0,0,0,41,17,114,29,0,0, + 0,114,54,0,0,0,90,8,100,97,116,97,112,97,116,104, + 114,130,0,0,0,114,134,0,0,0,114,125,0,0,0,114, + 137,0,0,0,114,131,0,0,0,114,132,0,0,0,114,133, + 0,0,0,114,123,0,0,0,114,124,0,0,0,114,135,0, + 0,0,114,136,0,0,0,114,127,0,0,0,90,8,114,97, + 119,95,100,97,116,97,114,141,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,52,0,0,0,19, + 2,0,0,115,62,0,0,0,0,1,20,1,8,1,8,2, + 14,2,2,1,14,1,12,1,24,1,10,1,12,1,8,2, + 16,2,18,2,16,1,16,1,12,1,8,1,2,1,14,1, + 14,1,24,1,10,1,14,1,40,2,10,2,4,3,2,1, + 10,1,14,1,14,1,114,52,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,116,0,124,0,124,1,24, + 0,131,1,100,1,107,1,83,0,41,2,78,114,5,0,0, + 0,41,1,218,3,97,98,115,41,2,90,2,116,49,90,2, + 116,50,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,9,95,101,113,95,109,116,105,109,101,65,2,0,0, + 115,2,0,0,0,0,2,114,147,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,14,0,0,0,8,0,0, + 0,67,0,0,0,115,56,1,0,0,124,3,124,2,100,1, + 156,2,125,5,122,18,116,0,160,1,124,4,124,3,124,5, + 161,3,125,6,87,0,110,20,4,0,116,2,121,48,1,0, + 1,0,1,0,89,0,100,0,83,0,48,0,124,6,100,2, + 64,0,100,3,107,3,125,7,124,7,114,178,124,6,100,4, + 64,0,100,3,107,3,125,8,116,3,106,4,100,5,107,3, + 114,176,124,8,115,102,116,3,106,4,100,6,107,2,114,176, + 116,5,124,0,124,2,131,2,125,9,124,9,100,0,117,1, + 114,176,116,3,160,6,116,0,106,7,124,9,161,2,125,10, + 122,20,116,0,160,8,124,4,124,10,124,3,124,5,161,4, + 1,0,87,0,110,20,4,0,116,2,121,174,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,110,84,116,9,124,0, + 124,2,131,2,92,2,125,11,125,12,124,11,144,1,114,6, + 116,10,116,11,124,4,100,7,100,8,133,2,25,0,131,1, + 124,11,131,2,114,242,116,11,124,4,100,8,100,9,133,2, + 25,0,131,1,124,12,107,3,144,1,114,6,116,12,160,13, + 100,10,124,3,155,2,157,2,161,1,1,0,100,0,83,0, + 116,14,160,15,124,4,100,9,100,0,133,2,25,0,161,1, + 125,13,116,16,124,13,116,17,131,2,144,1,115,52,116,18, + 100,11,124,1,155,2,100,12,157,3,131,1,130,1,124,13, + 83,0,41,13,78,41,2,114,59,0,0,0,114,13,0,0, + 0,114,5,0,0,0,114,0,0,0,0,114,86,0,0,0, + 90,5,110,101,118,101,114,90,6,97,108,119,97,121,115,114, + 99,0,0,0,114,94,0,0,0,114,95,0,0,0,122,22, + 98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,108, + 101,32,102,111,114,32,122,16,99,111,109,112,105,108,101,100, + 32,109,111,100,117,108,101,32,122,21,32,105,115,32,110,111, + 116,32,97,32,99,111,100,101,32,111,98,106,101,99,116,41, + 19,114,21,0,0,0,90,13,95,99,108,97,115,115,105,102, + 121,95,112,121,99,114,75,0,0,0,218,4,95,105,109,112, + 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, + 101,100,95,112,121,99,115,218,15,95,103,101,116,95,112,121, + 99,95,115,111,117,114,99,101,218,11,115,111,117,114,99,101, + 95,104,97,115,104,90,17,95,82,65,87,95,77,65,71,73, + 67,95,78,85,77,66,69,82,90,18,95,118,97,108,105,100, + 97,116,101,95,104,97,115,104,95,112,121,99,218,29,95,103, + 101,116,95,109,116,105,109,101,95,97,110,100,95,115,105,122, + 101,95,111,102,95,115,111,117,114,99,101,114,147,0,0,0, + 114,2,0,0,0,114,76,0,0,0,114,77,0,0,0,218, + 7,109,97,114,115,104,97,108,90,5,108,111,97,100,115,114, + 15,0,0,0,218,10,95,99,111,100,101,95,116,121,112,101, + 218,9,84,121,112,101,69,114,114,111,114,41,14,114,32,0, + 0,0,114,53,0,0,0,114,63,0,0,0,114,38,0,0, + 0,114,126,0,0,0,90,11,101,120,99,95,100,101,116,97, + 105,108,115,114,129,0,0,0,90,10,104,97,115,104,95,98, + 97,115,101,100,90,12,99,104,101,99,107,95,115,111,117,114, + 99,101,90,12,115,111,117,114,99,101,95,98,121,116,101,115, + 114,150,0,0,0,90,12,115,111,117,114,99,101,95,109,116, + 105,109,101,90,11,115,111,117,114,99,101,95,115,105,122,101, + 114,46,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,15,95,117,110,109,97,114,115,104,97,108, + 95,99,111,100,101,75,2,0,0,115,88,0,0,0,0,2, + 2,1,2,254,6,5,2,1,18,1,12,1,8,2,12,1, + 4,1,12,1,10,1,2,255,2,1,8,255,2,2,10,1, + 8,1,4,1,4,1,2,254,4,5,2,1,4,1,2,0, + 2,0,2,0,2,255,8,2,12,1,10,3,8,255,6,3, + 6,3,22,1,18,255,4,2,4,1,8,255,4,2,4,2, + 18,1,12,1,16,1,114,155,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, + 67,0,0,0,115,28,0,0,0,124,0,160,0,100,1,100, + 2,161,2,125,0,124,0,160,0,100,3,100,2,161,2,125, + 0,124,0,83,0,41,4,78,115,2,0,0,0,13,10,243, + 1,0,0,0,10,243,1,0,0,0,13,41,1,114,19,0, + 0,0,41,1,218,6,115,111,117,114,99,101,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,23,95,110,111, + 114,109,97,108,105,122,101,95,108,105,110,101,95,101,110,100, + 105,110,103,115,126,2,0,0,115,6,0,0,0,0,1,12, + 1,12,1,114,159,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,6,0,0,0,67,0,0, + 0,115,24,0,0,0,116,0,124,1,131,1,125,1,116,1, + 124,1,124,0,100,1,100,2,100,3,141,4,83,0,41,4, + 78,114,74,0,0,0,84,41,1,90,12,100,111,110,116,95, + 105,110,104,101,114,105,116,41,2,114,159,0,0,0,218,7, + 99,111,109,112,105,108,101,41,2,114,53,0,0,0,114,158, 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,34,0,0,0,220,2,0,0,115,4,0,0,0, - 0,1,6,1,122,33,95,90,105,112,73,109,112,111,114,116, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,46,95, - 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,8,0,0,0,67,0,0,0, - 115,92,0,0,0,124,0,106,0,160,1,100,1,100,2,161, - 2,125,2,124,2,155,0,100,2,124,1,155,0,157,3,125, - 3,100,3,100,4,108,2,109,3,125,4,1,0,122,18,124, - 4,124,0,106,4,160,5,124,3,161,1,131,1,87,0,83, - 0,4,0,116,6,107,10,114,86,1,0,1,0,1,0,116, + 0,0,218,15,95,99,111,109,112,105,108,101,95,115,111,117, + 114,99,101,133,2,0,0,115,4,0,0,0,0,1,8,1, + 114,161,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,11,0,0,0,67,0,0,0,115,68, + 0,0,0,116,0,160,1,124,0,100,1,63,0,100,2,23, + 0,124,0,100,3,63,0,100,4,64,0,124,0,100,5,64, + 0,124,1,100,6,63,0,124,1,100,3,63,0,100,7,64, + 0,124,1,100,5,64,0,100,8,20,0,100,9,100,9,100, + 9,102,9,161,1,83,0,41,10,78,233,9,0,0,0,105, + 188,7,0,0,233,5,0,0,0,233,15,0,0,0,233,31, + 0,0,0,233,11,0,0,0,233,63,0,0,0,114,86,0, + 0,0,114,14,0,0,0,41,2,114,131,0,0,0,90,6, + 109,107,116,105,109,101,41,2,218,1,100,114,138,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 14,95,112,97,114,115,101,95,100,111,115,116,105,109,101,139, + 2,0,0,115,22,0,0,0,0,1,4,1,10,1,10,1, + 6,1,6,1,10,1,10,1,2,0,2,0,2,249,114,169, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,10,0,0,0,67,0,0,0,115,114,0,0, + 0,122,82,124,1,100,1,100,0,133,2,25,0,100,2,118, + 0,115,22,74,0,130,1,124,1,100,0,100,1,133,2,25, + 0,125,1,124,0,106,0,124,1,25,0,125,2,124,2,100, + 3,25,0,125,3,124,2,100,4,25,0,125,4,124,2,100, + 5,25,0,125,5,116,1,124,4,124,3,131,2,124,5,102, + 2,87,0,83,0,4,0,116,2,116,3,116,4,102,3,121, + 108,1,0,1,0,1,0,89,0,100,6,83,0,48,0,100, + 0,83,0,41,7,78,114,14,0,0,0,169,2,218,1,99, + 218,1,111,114,163,0,0,0,233,6,0,0,0,233,3,0, + 0,0,41,2,114,0,0,0,0,114,0,0,0,0,41,5, + 114,28,0,0,0,114,169,0,0,0,114,26,0,0,0,218, + 10,73,110,100,101,120,69,114,114,111,114,114,154,0,0,0, + 41,6,114,32,0,0,0,114,13,0,0,0,114,54,0,0, + 0,114,131,0,0,0,114,132,0,0,0,90,17,117,110,99, + 111,109,112,114,101,115,115,101,100,95,115,105,122,101,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,151,0, + 0,0,152,2,0,0,115,20,0,0,0,0,1,2,2,20, + 1,12,1,10,3,8,1,8,1,8,1,16,1,18,1,114, + 151,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,8,0,0,0,67,0,0,0,115,84,0, + 0,0,124,1,100,1,100,0,133,2,25,0,100,2,118,0, + 115,20,74,0,130,1,124,1,100,0,100,1,133,2,25,0, + 125,1,122,14,124,0,106,0,124,1,25,0,125,2,87,0, + 110,20,4,0,116,1,121,66,1,0,1,0,1,0,89,0, + 100,0,83,0,48,0,116,2,124,0,106,3,124,2,131,2, + 83,0,100,0,83,0,41,3,78,114,14,0,0,0,114,170, + 0,0,0,41,4,114,28,0,0,0,114,26,0,0,0,114, + 52,0,0,0,114,29,0,0,0,41,3,114,32,0,0,0, + 114,13,0,0,0,114,54,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,149,0,0,0,171,2, + 0,0,115,14,0,0,0,0,2,20,1,12,2,2,1,14, + 1,12,1,8,2,114,149,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,11,0,0,0,9,0,0,0,67, + 0,0,0,115,196,0,0,0,116,0,124,0,124,1,131,2, + 125,2,116,1,68,0,93,158,92,3,125,3,125,4,125,5, + 124,2,124,3,23,0,125,6,116,2,106,3,100,1,124,0, + 106,4,116,5,124,6,100,2,100,3,141,5,1,0,122,14, + 124,0,106,6,124,6,25,0,125,7,87,0,110,18,4,0, + 116,7,121,86,1,0,1,0,1,0,89,0,113,14,48,0, + 124,7,100,4,25,0,125,8,116,8,124,0,106,4,124,7, + 131,2,125,9,124,4,114,130,116,9,124,0,124,8,124,6, + 124,1,124,9,131,5,125,10,110,10,116,10,124,8,124,9, + 131,2,125,10,124,10,100,0,117,0,114,150,113,14,124,7, + 100,4,25,0,125,8,124,10,124,5,124,8,102,3,2,0, + 1,0,83,0,113,14,116,11,100,5,124,1,155,2,157,2, + 124,1,100,6,141,2,130,1,100,0,83,0,41,7,78,122, + 13,116,114,121,105,110,103,32,123,125,123,125,123,125,114,86, + 0,0,0,41,1,90,9,118,101,114,98,111,115,105,116,121, + 114,0,0,0,0,114,57,0,0,0,114,58,0,0,0,41, + 12,114,36,0,0,0,114,89,0,0,0,114,76,0,0,0, + 114,77,0,0,0,114,29,0,0,0,114,20,0,0,0,114, + 28,0,0,0,114,26,0,0,0,114,52,0,0,0,114,155, + 0,0,0,114,161,0,0,0,114,3,0,0,0,41,11,114, + 32,0,0,0,114,38,0,0,0,114,13,0,0,0,114,90, + 0,0,0,114,91,0,0,0,114,47,0,0,0,114,63,0, + 0,0,114,54,0,0,0,114,40,0,0,0,114,126,0,0, + 0,114,46,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,44,0,0,0,186,2,0,0,115,36, + 0,0,0,0,1,10,1,14,1,8,1,22,1,2,1,14, + 1,12,1,6,2,8,1,12,1,4,1,18,2,10,1,8, + 3,2,1,8,1,16,2,114,44,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,60,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,90,4,100,3,100,4,132,0, + 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, + 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, + 90,9,100,13,83,0,41,14,114,80,0,0,0,122,165,80, + 114,105,118,97,116,101,32,99,108,97,115,115,32,117,115,101, + 100,32,116,111,32,115,117,112,112,111,114,116,32,90,105,112, + 73,109,112,111,114,116,46,103,101,116,95,114,101,115,111,117, + 114,99,101,95,114,101,97,100,101,114,40,41,46,10,10,32, + 32,32,32,84,104,105,115,32,99,108,97,115,115,32,105,115, + 32,97,108,108,111,119,101,100,32,116,111,32,114,101,102,101, + 114,101,110,99,101,32,97,108,108,32,116,104,101,32,105,110, + 110,97,114,100,115,32,97,110,100,32,112,114,105,118,97,116, + 101,32,112,97,114,116,115,32,111,102,10,32,32,32,32,116, + 104,101,32,122,105,112,105,109,112,111,114,116,101,114,46,10, + 32,32,32,32,70,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,16, + 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,100, + 0,83,0,114,88,0,0,0,41,2,114,4,0,0,0,114, + 38,0,0,0,41,3,114,32,0,0,0,114,4,0,0,0, + 114,38,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,34,0,0,0,220,2,0,0,115,4,0, + 0,0,0,1,6,1,122,33,95,90,105,112,73,109,112,111, + 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,8,0,0,0,67,0, + 0,0,115,90,0,0,0,124,0,106,0,160,1,100,1,100, + 2,161,2,125,2,124,2,155,0,100,2,124,1,155,0,157, + 3,125,3,100,3,100,4,108,2,109,3,125,4,1,0,122, + 18,124,4,124,0,106,4,160,5,124,3,161,1,131,1,87, + 0,83,0,4,0,116,6,121,84,1,0,1,0,1,0,116, 7,124,3,131,1,130,1,89,0,110,2,48,0,100,0,83, 0,41,5,78,114,85,0,0,0,114,109,0,0,0,114,0, 0,0,0,41,1,218,7,66,121,116,101,115,73,79,41,8, @@ -986,7 +983,7 @@ const unsigned char _Py_M__zipimport[] = { 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, 0,218,13,111,112,101,110,95,114,101,115,111,117,114,99,101, 224,2,0,0,115,14,0,0,0,0,1,14,1,14,1,12, - 1,2,1,18,1,14,1,122,38,95,90,105,112,73,109,112, + 1,2,1,18,1,12,1,122,38,95,90,105,112,73,109,112, 111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,101, 114,46,111,112,101,110,95,114,101,115,111,117,114,99,101,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, @@ -999,85 +996,85 @@ const unsigned char _Py_M__zipimport[] = { 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, 46,114,101,115,111,117,114,99,101,95,112,97,116,104,99,2, 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,8, - 0,0,0,67,0,0,0,115,72,0,0,0,124,0,106,0, + 0,0,0,67,0,0,0,115,70,0,0,0,124,0,106,0, 160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2, 124,1,155,0,157,3,125,3,122,16,124,0,106,2,160,3, - 124,3,161,1,1,0,87,0,110,22,4,0,116,4,107,10, - 114,66,1,0,1,0,1,0,89,0,100,3,83,0,48,0, - 100,4,83,0,41,5,78,114,85,0,0,0,114,109,0,0, - 0,70,84,41,5,114,38,0,0,0,114,19,0,0,0,114, - 4,0,0,0,114,55,0,0,0,114,22,0,0,0,41,4, - 114,32,0,0,0,114,59,0,0,0,114,179,0,0,0,114, - 13,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,11,105,115,95,114,101,115,111,117,114,99,101, - 239,2,0,0,115,14,0,0,0,0,3,14,1,14,1,2, - 1,16,1,14,1,8,1,122,36,95,90,105,112,73,109,112, - 111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,101, - 114,46,105,115,95,114,101,115,111,117,114,99,101,99,1,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,9,0, - 0,0,99,0,0,0,115,186,0,0,0,100,1,100,2,108, - 0,109,1,125,1,1,0,124,1,124,0,106,2,160,3,124, - 0,106,4,161,1,131,1,125,2,124,2,160,5,124,0,106, - 2,106,6,161,1,125,3,124,3,106,7,100,3,107,2,115, - 58,74,0,130,1,124,3,106,8,125,4,116,9,131,0,125, - 5,124,0,106,2,106,10,68,0,93,102,125,6,122,18,124, - 1,124,6,131,1,160,5,124,4,161,1,125,7,87,0,110, - 24,4,0,116,11,107,10,114,124,1,0,1,0,1,0,89, - 0,113,78,89,0,110,2,48,0,124,7,106,8,106,7,125, - 8,116,12,124,8,131,1,100,1,107,2,114,156,124,7,106, - 7,86,0,1,0,113,78,124,8,124,5,107,7,114,78,124, - 5,160,13,124,8,161,1,1,0,124,8,86,0,1,0,113, - 78,100,0,83,0,41,4,78,114,0,0,0,0,41,1,218, - 4,80,97,116,104,114,60,0,0,0,41,14,90,7,112,97, - 116,104,108,105,98,114,183,0,0,0,114,4,0,0,0,114, - 56,0,0,0,114,38,0,0,0,90,11,114,101,108,97,116, - 105,118,101,95,116,111,114,29,0,0,0,114,59,0,0,0, - 90,6,112,97,114,101,110,116,218,3,115,101,116,114,28,0, - 0,0,114,23,0,0,0,114,51,0,0,0,218,3,97,100, - 100,41,9,114,32,0,0,0,114,183,0,0,0,90,13,102, - 117,108,108,110,97,109,101,95,112,97,116,104,90,13,114,101, - 108,97,116,105,118,101,95,112,97,116,104,90,12,112,97,99, - 107,97,103,101,95,112,97,116,104,90,12,115,117,98,100,105, - 114,115,95,115,101,101,110,218,8,102,105,108,101,110,97,109, - 101,90,8,114,101,108,97,116,105,118,101,90,11,112,97,114, - 101,110,116,95,110,97,109,101,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,99,111,110,116,101,110,116, - 115,250,2,0,0,115,34,0,0,0,0,8,12,1,18,1, - 14,3,14,1,6,1,6,1,12,1,2,1,18,1,14,1, - 10,5,8,1,12,1,10,1,8,1,10,1,122,33,95,90, - 105,112,73,109,112,111,114,116,82,101,115,111,117,114,99,101, - 82,101,97,100,101,114,46,99,111,110,116,101,110,116,115,78, - 41,10,114,6,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,84,0,0,0,114,81,0,0,0,114,34,0,0,0, - 114,180,0,0,0,114,181,0,0,0,114,182,0,0,0,114, - 187,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,80,0,0,0,212,2,0, - 0,115,14,0,0,0,8,1,4,5,4,2,8,4,8,9, - 8,6,8,11,114,80,0,0,0,41,45,114,84,0,0,0, - 90,26,95,102,114,111,122,101,110,95,105,109,112,111,114,116, - 108,105,98,95,101,120,116,101,114,110,97,108,114,21,0,0, - 0,114,1,0,0,0,114,2,0,0,0,90,17,95,102,114, - 111,122,101,110,95,105,109,112,111,114,116,108,105,98,114,76, - 0,0,0,114,148,0,0,0,114,110,0,0,0,114,152,0, - 0,0,114,67,0,0,0,114,131,0,0,0,90,7,95,95, - 97,108,108,95,95,114,20,0,0,0,90,15,112,97,116,104, - 95,115,101,112,97,114,97,116,111,114,115,114,18,0,0,0, - 114,75,0,0,0,114,3,0,0,0,114,25,0,0,0,218, - 4,116,121,112,101,114,70,0,0,0,114,113,0,0,0,114, - 115,0,0,0,114,117,0,0,0,114,4,0,0,0,114,89, - 0,0,0,114,36,0,0,0,114,37,0,0,0,114,35,0, - 0,0,114,27,0,0,0,114,122,0,0,0,114,142,0,0, - 0,114,144,0,0,0,114,52,0,0,0,114,147,0,0,0, - 114,155,0,0,0,218,8,95,95,99,111,100,101,95,95,114, - 153,0,0,0,114,159,0,0,0,114,161,0,0,0,114,169, - 0,0,0,114,151,0,0,0,114,149,0,0,0,114,44,0, - 0,0,114,80,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,8,60,109,111, - 100,117,108,101,62,1,0,0,0,115,88,0,0,0,4,16, - 8,1,16,1,8,1,8,1,8,1,8,1,8,1,8,2, - 8,3,6,1,14,3,16,4,4,2,8,2,4,1,4,1, - 4,2,14,127,0,127,0,1,12,1,12,1,2,1,2,252, - 4,9,8,4,8,9,8,31,8,126,2,254,2,29,4,5, - 8,21,8,46,8,10,8,46,10,5,8,7,8,6,8,13, - 8,19,8,15,8,26, + 124,3,161,1,1,0,87,0,110,20,4,0,116,4,121,64, + 1,0,1,0,1,0,89,0,100,3,83,0,48,0,100,4, + 83,0,41,5,78,114,85,0,0,0,114,109,0,0,0,70, + 84,41,5,114,38,0,0,0,114,19,0,0,0,114,4,0, + 0,0,114,55,0,0,0,114,22,0,0,0,41,4,114,32, + 0,0,0,114,59,0,0,0,114,179,0,0,0,114,13,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,11,105,115,95,114,101,115,111,117,114,99,101,239,2, + 0,0,115,14,0,0,0,0,3,14,1,14,1,2,1,16, + 1,12,1,8,1,122,36,95,90,105,112,73,109,112,111,114, + 116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46, + 105,115,95,114,101,115,111,117,114,99,101,99,1,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,9,0,0,0, + 99,0,0,0,115,184,0,0,0,100,1,100,2,108,0,109, + 1,125,1,1,0,124,1,124,0,106,2,160,3,124,0,106, + 4,161,1,131,1,125,2,124,2,160,5,124,0,106,2,106, + 6,161,1,125,3,124,3,106,7,100,3,107,2,115,58,74, + 0,130,1,124,3,106,8,125,4,116,9,131,0,125,5,124, + 0,106,2,106,10,68,0,93,100,125,6,122,18,124,1,124, + 6,131,1,160,5,124,4,161,1,125,7,87,0,110,22,4, + 0,116,11,121,122,1,0,1,0,1,0,89,0,113,78,89, + 0,110,2,48,0,124,7,106,8,106,7,125,8,116,12,124, + 8,131,1,100,1,107,2,114,154,124,7,106,7,86,0,1, + 0,113,78,124,8,124,5,118,1,114,78,124,5,160,13,124, + 8,161,1,1,0,124,8,86,0,1,0,113,78,100,0,83, + 0,41,4,78,114,0,0,0,0,41,1,218,4,80,97,116, + 104,114,60,0,0,0,41,14,90,7,112,97,116,104,108,105, + 98,114,183,0,0,0,114,4,0,0,0,114,56,0,0,0, + 114,38,0,0,0,90,11,114,101,108,97,116,105,118,101,95, + 116,111,114,29,0,0,0,114,59,0,0,0,90,6,112,97, + 114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23, + 0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114, + 32,0,0,0,114,183,0,0,0,90,13,102,117,108,108,110, + 97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105, + 118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101, + 95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115, + 101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114, + 101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95, + 110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0, + 0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1, + 6,1,6,1,12,1,2,1,18,1,12,1,10,5,8,1, + 12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109, + 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0, + 0,0,114,81,0,0,0,114,34,0,0,0,114,180,0,0, + 0,114,181,0,0,0,114,182,0,0,0,114,187,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0, + 0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11, + 114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, + 101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0, + 0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114, + 148,0,0,0,114,110,0,0,0,114,152,0,0,0,114,67, + 0,0,0,114,131,0,0,0,90,7,95,95,97,108,108,95, + 95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112, + 97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0, + 0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112, + 101,114,70,0,0,0,114,113,0,0,0,114,115,0,0,0, + 114,117,0,0,0,114,4,0,0,0,114,89,0,0,0,114, + 36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27, + 0,0,0,114,122,0,0,0,114,142,0,0,0,114,144,0, + 0,0,114,52,0,0,0,114,147,0,0,0,114,155,0,0, + 0,218,8,95,95,99,111,100,101,95,95,114,153,0,0,0, + 114,159,0,0,0,114,161,0,0,0,114,169,0,0,0,114, + 151,0,0,0,114,149,0,0,0,114,44,0,0,0,114,80, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101, + 62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1, + 8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1, + 14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127, + 0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4, + 8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46, + 8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15, + 8,26, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index e4f4a8c779114..c0a0bf51de399 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -116,11 +116,11 @@ static void *opcode_targets[256] = { &&TARGET_POP_JUMP_IF_FALSE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_LOAD_GLOBAL, + &&TARGET_IS_OP, + &&TARGET_CONTAINS_OP, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_JUMP_IF_NOT_EXC_MATCH, &&TARGET_SETUP_FINALLY, &&_unknown_opcode, &&TARGET_LOAD_FAST, diff --git a/Python/peephole.c b/Python/peephole.c index 714a4520ba8db..baa217ad02d1d 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -12,10 +12,10 @@ #define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD) #define CONDITIONAL_JUMP(op) (op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE \ || op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP) #define GETJUMPTGT(arr, i) (get_arg(arr, i) / sizeof(_Py_CODEUNIT) + \ (ABSOLUTE_JUMP(_Py_OPCODE(arr[i])) ? 0 : i+1)) @@ -194,6 +194,7 @@ markblocks(_Py_CODEUNIT *code, Py_ssize_t len) case JUMP_IF_TRUE_OR_POP: case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: + case JUMP_IF_NOT_EXC_MATCH: case JUMP_ABSOLUTE: case SETUP_FINALLY: case SETUP_WITH: @@ -493,6 +494,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case POP_JUMP_IF_TRUE: case JUMP_IF_FALSE_OR_POP: case JUMP_IF_TRUE_OR_POP: + case JUMP_IF_NOT_EXC_MATCH: j = blocks[j / sizeof(_Py_CODEUNIT)] * sizeof(_Py_CODEUNIT); break; diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py index b184ffa170934..873f82156e217 100644 --- a/Tools/scripts/generate_opcode_h.py +++ b/Tools/scripts/generate_opcode_h.py @@ -22,11 +22,6 @@ remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus From webhook-mailer at python.org Tue Jan 14 06:39:24 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 Jan 2020 11:39:24 -0000 Subject: [Python-checkins] [3.8] bpo-39033: Fix NameError in zipimport during hash validation (GH-17588) (GH-17642) Message-ID: https://github.com/python/cpython/commit/9955f33cdbf27de270038dfbad37d15b160ecca2 commit: 9955f33cdbf27de270038dfbad37d15b160ecca2 branch: 3.8 author: Karthikeyan Singaravelan committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-14T03:39:19-08:00 summary: [3.8] bpo-39033: Fix NameError in zipimport during hash validation (GH-17588) (GH-17642) Fix `NameError` in `zipimport` during hash validation and add a regression test. (cherry picked from commit 79f02fee1a542c440fd906fd54154c73fc0f8235) https://bugs.python.org/issue39033 files: A Misc/NEWS.d/next/Library/2019-12-13-18-54-49.bpo-39033.cepuyD.rst M Lib/test/test_zipimport.py M Lib/zipimport.py M Python/importlib_zipimport.h diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index d4f619e9acdb9..2af8689c1d2cb 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -6,6 +6,7 @@ import struct import time import unittest +import unittest.mock from test import support @@ -204,6 +205,21 @@ def check(mod): self.assertEqual(mod.state, 'old') self.doTest(None, files, TESTMOD, call=check) + @unittest.mock.patch('_imp.check_hash_based_pycs', 'always') + def test_checked_hash_based_change_pyc(self): + source = b"state = 'old'" + source_hash = importlib.util.source_hash(source) + bytecode = importlib._bootstrap_external._code_to_hash_pyc( + compile(source, "???", "exec"), + source_hash, + False, + ) + files = {TESTMOD + ".py": (NOW, "state = 'new'"), + TESTMOD + ".pyc": (NOW - 20, bytecode)} + def check(mod): + self.assertEqual(mod.state, 'new') + self.doTest(None, files, TESTMOD, call=check) + def testEmptyPy(self): files = {TESTMOD + ".py": (NOW, "")} self.doTest(None, files, TESTMOD) diff --git a/Lib/zipimport.py b/Lib/zipimport.py index fd917c16b0153..5ef0a17c2a5ed 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -608,7 +608,7 @@ def _unmarshal_code(self, pathname, fullpath, fullname, data): ) try: - _boostrap_external._validate_hash_pyc( + _bootstrap_external._validate_hash_pyc( data, source_hash, fullname, exc_details) except ImportError: return None diff --git a/Misc/NEWS.d/next/Library/2019-12-13-18-54-49.bpo-39033.cepuyD.rst b/Misc/NEWS.d/next/Library/2019-12-13-18-54-49.bpo-39033.cepuyD.rst new file mode 100644 index 0000000000000..3dee3c08cc5be --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-13-18-54-49.bpo-39033.cepuyD.rst @@ -0,0 +1 @@ +Fix :exc:`NameError` in :mod:`zipimport`. Patch by Karthikeyan Singaravelan. diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 6c9c4e8465523..f013b41457fd4 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -792,17 +792,17 @@ const unsigned char _Py_M__zipimport[] = { 100,5,107,3,114,180,124,8,115,104,116,3,106,4,100,6, 107,2,114,180,116,5,124,0,124,2,131,2,125,9,124,9, 100,0,107,9,114,180,116,3,160,6,116,0,106,7,124,9, - 161,2,125,10,122,20,116,8,160,9,124,4,124,10,124,3, + 161,2,125,10,122,20,116,0,160,8,124,4,124,10,124,3, 124,5,161,4,1,0,87,0,110,22,4,0,116,2,107,10, 114,178,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12, - 124,11,144,1,114,10,116,11,116,12,124,4,100,7,100,8, - 133,2,25,0,131,1,124,11,131,2,114,246,116,12,124,4, + 110,84,116,9,124,0,124,2,131,2,92,2,125,11,125,12, + 124,11,144,1,114,10,116,10,116,11,124,4,100,7,100,8, + 133,2,25,0,131,1,124,11,131,2,114,246,116,11,124,4, 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, - 114,10,116,13,160,14,100,10,124,3,155,2,157,2,161,1, - 1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0, - 133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2, - 144,1,115,56,116,19,100,11,124,1,155,2,100,12,157,3, + 114,10,116,12,160,13,100,10,124,3,155,2,157,2,161,1, + 1,0,100,0,83,0,116,14,160,15,124,4,100,9,100,0, + 133,2,25,0,161,1,125,13,116,16,124,13,116,17,131,2, + 144,1,115,56,116,18,100,11,124,1,155,2,100,12,157,3, 131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0, 0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0, 0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97, @@ -811,273 +811,271 @@ const unsigned char _Py_M__zipimport[] = { 115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111, 109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21, 32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111, - 98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99, + 98,106,101,99,116,41,19,114,21,0,0,0,90,13,95,99, 108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0, 218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97, 115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95, 103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11, 115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65, 87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18, - 95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97, - 115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105, - 109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115, - 111,117,114,99,101,114,147,0,0,0,114,2,0,0,0,114, - 76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104, - 97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10, - 95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101, - 69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0, - 0,114,63,0,0,0,114,38,0,0,0,114,126,0,0,0, - 90,11,101,120,99,95,100,101,116,97,105,108,115,114,129,0, - 0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12, - 99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111, - 117,114,99,101,95,98,121,116,101,115,114,150,0,0,0,90, - 12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115, - 111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15, - 95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75, - 2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5, - 2,1,18,1,14,1,8,2,12,1,4,1,12,1,10,1, - 2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1, - 2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255, - 8,2,14,1,10,3,8,255,6,3,6,3,22,1,18,255, - 4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1, - 114,155,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28, - 0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124, - 0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41, - 4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243, - 1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6, - 115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122, - 101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2, - 0,0,115,6,0,0,0,0,1,12,1,12,1,114,159,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0, - 116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1, - 100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0, - 84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105, - 116,41,2,114,159,0,0,0,218,7,99,111,109,112,105,108, - 101,41,2,114,53,0,0,0,114,158,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99, - 111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0, - 0,115,4,0,0,0,0,1,8,1,114,161,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160, - 1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63, - 0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63, - 0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64, - 0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83, - 0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5, - 0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0, - 0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0, - 0,41,2,114,131,0,0,0,90,6,109,107,116,105,109,101, - 41,2,218,1,100,114,138,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115, - 101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0, - 0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1, - 10,1,2,0,2,0,2,249,114,169,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0, - 0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100, - 1,100,0,133,2,25,0,100,2,107,6,115,22,116,0,130, - 1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106, - 1,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124, - 2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116, - 2,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4, - 0,116,3,116,4,116,5,102,3,107,10,114,110,1,0,1, - 0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41, - 7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114, - 163,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2, - 114,0,0,0,0,114,0,0,0,0,41,6,218,14,65,115, - 115,101,114,116,105,111,110,69,114,114,111,114,114,28,0,0, - 0,114,169,0,0,0,114,26,0,0,0,218,10,73,110,100, - 101,120,69,114,114,111,114,114,154,0,0,0,41,6,114,32, - 0,0,0,114,13,0,0,0,114,54,0,0,0,114,131,0, - 0,0,114,132,0,0,0,90,17,117,110,99,111,109,112,114, - 101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,151,0,0,0,152,2, - 0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10, - 3,8,1,8,1,8,1,16,1,20,1,114,151,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1, - 100,1,100,0,133,2,25,0,100,2,107,6,115,20,116,0, - 130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14, - 124,0,106,1,124,1,25,0,125,2,87,0,110,22,4,0, - 116,2,107,10,114,68,1,0,1,0,1,0,89,0,100,0, - 83,0,88,0,116,3,124,0,106,4,124,2,131,2,83,0, - 100,0,83,0,41,3,78,114,14,0,0,0,114,170,0,0, - 0,41,5,114,175,0,0,0,114,28,0,0,0,114,26,0, - 0,0,114,52,0,0,0,114,29,0,0,0,41,3,114,32, - 0,0,0,114,13,0,0,0,114,54,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,149,0,0, - 0,171,2,0,0,115,14,0,0,0,0,2,20,1,12,2, - 2,1,14,1,14,1,8,2,114,149,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0, - 0,0,67,0,0,0,115,198,0,0,0,116,0,124,0,124, - 1,131,2,125,2,116,1,68,0,93,160,92,3,125,3,125, - 4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100, - 1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1, - 0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110, - 20,4,0,116,7,107,10,114,88,1,0,1,0,1,0,89, - 0,113,14,88,0,124,7,100,4,25,0,125,8,116,8,124, - 0,106,4,124,7,131,2,125,9,124,4,114,132,116,9,124, - 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, - 10,124,8,124,9,131,2,125,10,124,10,100,0,107,8,114, - 152,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, - 8,102,3,2,0,1,0,83,0,113,14,116,11,100,5,124, - 1,155,2,157,2,124,1,100,6,141,2,130,1,100,0,83, - 0,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123, - 125,123,125,114,86,0,0,0,41,1,90,9,118,101,114,98, - 111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114, - 58,0,0,0,41,12,114,36,0,0,0,114,89,0,0,0, - 114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114, - 20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, - 0,0,0,114,155,0,0,0,114,161,0,0,0,114,3,0, - 0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13, - 0,0,0,114,90,0,0,0,114,91,0,0,0,114,47,0, - 0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0, - 0,114,126,0,0,0,114,46,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,186, - 2,0,0,115,36,0,0,0,0,1,10,1,14,1,8,1, - 22,1,2,1,14,1,14,1,6,2,8,1,12,1,4,1, - 18,2,10,1,8,3,2,1,8,1,16,2,114,44,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,64,0,0,0,115,60,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, - 3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,100, - 7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,100, - 11,100,12,132,0,90,9,100,13,83,0,41,14,114,80,0, - 0,0,122,165,80,114,105,118,97,116,101,32,99,108,97,115, - 115,32,117,115,101,100,32,116,111,32,115,117,112,112,111,114, - 116,32,90,105,112,73,109,112,111,114,116,46,103,101,116,95, - 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,40, - 41,46,10,10,32,32,32,32,84,104,105,115,32,99,108,97, - 115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111, - 32,114,101,102,101,114,101,110,99,101,32,97,108,108,32,116, - 104,101,32,105,110,110,97,114,100,115,32,97,110,100,32,112, - 114,105,118,97,116,101,32,112,97,114,116,115,32,111,102,10, - 32,32,32,32,116,104,101,32,122,105,112,105,109,112,111,114, - 116,101,114,46,10,32,32,32,32,70,99,3,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, - 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, - 124,0,95,1,100,0,83,0,114,88,0,0,0,41,2,114, - 4,0,0,0,114,38,0,0,0,41,3,114,32,0,0,0, - 114,4,0,0,0,114,38,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,34,0,0,0,220,2, - 0,0,115,4,0,0,0,0,1,6,1,122,33,95,90,105, - 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8, - 0,0,0,67,0,0,0,115,92,0,0,0,124,0,106,0, - 160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2, - 124,1,155,0,157,3,125,3,100,3,100,4,108,2,109,3, - 125,4,1,0,122,18,124,4,124,0,106,4,160,5,124,3, - 161,1,131,1,87,0,83,0,4,0,116,6,107,10,114,86, - 1,0,1,0,1,0,116,7,124,3,131,1,130,1,89,0, - 110,2,88,0,100,0,83,0,41,5,78,114,85,0,0,0, - 114,109,0,0,0,114,0,0,0,0,41,1,218,7,66,121, - 116,101,115,73,79,41,8,114,38,0,0,0,114,19,0,0, - 0,90,2,105,111,114,177,0,0,0,114,4,0,0,0,114, - 55,0,0,0,114,22,0,0,0,218,17,70,105,108,101,78, - 111,116,70,111,117,110,100,69,114,114,111,114,41,5,114,32, - 0,0,0,218,8,114,101,115,111,117,114,99,101,218,16,102, - 117,108,108,110,97,109,101,95,97,115,95,112,97,116,104,114, - 13,0,0,0,114,177,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,13,111,112,101,110,95,114, - 101,115,111,117,114,99,101,224,2,0,0,115,14,0,0,0, - 0,1,14,1,14,1,12,1,2,1,18,1,14,1,122,38, - 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, - 99,101,82,101,97,100,101,114,46,111,112,101,110,95,114,101, - 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 8,0,0,0,116,0,130,1,100,0,83,0,114,88,0,0, - 0,41,1,114,178,0,0,0,41,2,114,32,0,0,0,114, - 179,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, - 116,104,233,2,0,0,115,2,0,0,0,0,4,122,38,95, - 90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,99, - 101,82,101,97,100,101,114,46,114,101,115,111,117,114,99,101, - 95,112,97,116,104,99,2,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,72, - 0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,125, - 2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,122, - 16,124,0,106,2,160,3,124,3,161,1,1,0,87,0,110, - 22,4,0,116,4,107,10,114,66,1,0,1,0,1,0,89, - 0,100,3,83,0,88,0,100,4,83,0,41,5,78,114,85, - 0,0,0,114,109,0,0,0,70,84,41,5,114,38,0,0, - 0,114,19,0,0,0,114,4,0,0,0,114,55,0,0,0, - 114,22,0,0,0,41,4,114,32,0,0,0,114,59,0,0, - 0,114,180,0,0,0,114,13,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,218,11,105,115,95,114, - 101,115,111,117,114,99,101,239,2,0,0,115,14,0,0,0, - 0,3,14,1,14,1,2,1,16,1,14,1,8,1,122,36, - 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, - 99,101,82,101,97,100,101,114,46,105,115,95,114,101,115,111, - 117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0, - 0,9,0,0,0,9,0,0,0,99,0,0,0,115,186,0, - 0,0,100,1,100,2,108,0,109,1,125,1,1,0,124,1, - 124,0,106,2,160,3,124,0,106,4,161,1,131,1,125,2, - 124,2,160,5,124,0,106,2,106,6,161,1,125,3,124,3, - 106,7,100,3,107,2,115,58,116,8,130,1,124,3,106,9, - 125,4,116,10,131,0,125,5,124,0,106,2,106,11,68,0, - 93,102,125,6,122,18,124,1,124,6,131,1,160,5,124,4, - 161,1,125,7,87,0,110,24,4,0,116,12,107,10,114,124, - 1,0,1,0,1,0,89,0,113,78,89,0,110,2,88,0, - 124,7,106,9,106,7,125,8,116,13,124,8,131,1,100,1, - 107,2,114,156,124,7,106,7,86,0,1,0,113,78,124,8, - 124,5,107,7,114,78,124,5,160,14,124,8,161,1,1,0, - 124,8,86,0,1,0,113,78,100,0,83,0,41,4,78,114, - 0,0,0,0,41,1,218,4,80,97,116,104,114,60,0,0, - 0,41,15,90,7,112,97,116,104,108,105,98,114,184,0,0, - 0,114,4,0,0,0,114,56,0,0,0,114,38,0,0,0, - 90,11,114,101,108,97,116,105,118,101,95,116,111,114,29,0, - 0,0,114,59,0,0,0,114,175,0,0,0,90,6,112,97, - 114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23, - 0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114, - 32,0,0,0,114,184,0,0,0,90,13,102,117,108,108,110, - 97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105, - 118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101, - 95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115, - 101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114, - 101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95, - 110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0, - 0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1, - 6,1,6,1,12,1,2,1,18,1,14,1,10,5,8,1, - 12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109, - 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, - 101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0, - 0,0,114,81,0,0,0,114,34,0,0,0,114,181,0,0, - 0,114,182,0,0,0,114,183,0,0,0,114,188,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0, - 0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11, - 114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102, - 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, - 101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0, - 0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110, - 95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114, - 148,0,0,0,114,110,0,0,0,114,152,0,0,0,114,67, - 0,0,0,114,131,0,0,0,90,7,95,95,97,108,108,95, - 95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112, - 97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0, - 0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112, - 101,114,70,0,0,0,114,113,0,0,0,114,115,0,0,0, - 114,117,0,0,0,114,4,0,0,0,114,89,0,0,0,114, - 36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27, - 0,0,0,114,122,0,0,0,114,142,0,0,0,114,144,0, - 0,0,114,52,0,0,0,114,147,0,0,0,114,155,0,0, - 0,218,8,95,95,99,111,100,101,95,95,114,153,0,0,0, - 114,159,0,0,0,114,161,0,0,0,114,169,0,0,0,114, - 151,0,0,0,114,149,0,0,0,114,44,0,0,0,114,80, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101, - 62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1, - 8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1, - 14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127, - 0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4, - 8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46, - 8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15, - 8,26, + 95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112, + 121,99,218,29,95,103,101,116,95,109,116,105,109,101,95,97, + 110,100,95,115,105,122,101,95,111,102,95,115,111,117,114,99, + 101,114,147,0,0,0,114,2,0,0,0,114,76,0,0,0, + 114,77,0,0,0,218,7,109,97,114,115,104,97,108,90,5, + 108,111,97,100,115,114,15,0,0,0,218,10,95,99,111,100, + 101,95,116,121,112,101,218,9,84,121,112,101,69,114,114,111, + 114,41,14,114,32,0,0,0,114,53,0,0,0,114,63,0, + 0,0,114,38,0,0,0,114,126,0,0,0,90,11,101,120, + 99,95,100,101,116,97,105,108,115,114,129,0,0,0,90,10, + 104,97,115,104,95,98,97,115,101,100,90,12,99,104,101,99, + 107,95,115,111,117,114,99,101,90,12,115,111,117,114,99,101, + 95,98,121,116,101,115,114,150,0,0,0,90,12,115,111,117, + 114,99,101,95,109,116,105,109,101,90,11,115,111,117,114,99, + 101,95,115,105,122,101,114,46,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,15,95,117,110,109, + 97,114,115,104,97,108,95,99,111,100,101,75,2,0,0,115, + 88,0,0,0,0,2,2,1,2,254,6,5,2,1,18,1, + 14,1,8,2,12,1,4,1,12,1,10,1,2,255,2,1, + 8,255,2,2,10,1,8,1,4,1,4,1,2,254,4,5, + 2,1,4,1,2,0,2,0,2,0,2,255,8,2,14,1, + 10,3,8,255,6,3,6,3,22,1,18,255,4,2,4,1, + 8,255,4,2,4,2,18,1,12,1,16,1,114,155,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,67,0,0,0,115,28,0,0,0,124, + 0,160,0,100,1,100,2,161,2,125,0,124,0,160,0,100, + 3,100,2,161,2,125,0,124,0,83,0,41,4,78,115,2, + 0,0,0,13,10,243,1,0,0,0,10,243,1,0,0,0, + 13,41,1,114,19,0,0,0,41,1,218,6,115,111,117,114, + 99,101,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,23,95,110,111,114,109,97,108,105,122,101,95,108,105, + 110,101,95,101,110,100,105,110,103,115,126,2,0,0,115,6, + 0,0,0,0,1,12,1,12,1,114,159,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6, + 0,0,0,67,0,0,0,115,24,0,0,0,116,0,124,1, + 131,1,125,1,116,1,124,1,124,0,100,1,100,2,100,3, + 141,4,83,0,41,4,78,114,74,0,0,0,84,41,1,90, + 12,100,111,110,116,95,105,110,104,101,114,105,116,41,2,114, + 159,0,0,0,218,7,99,111,109,112,105,108,101,41,2,114, + 53,0,0,0,114,158,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,15,95,99,111,109,112,105, + 108,101,95,115,111,117,114,99,101,133,2,0,0,115,4,0, + 0,0,0,1,8,1,114,161,0,0,0,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,11,0,0,0, + 67,0,0,0,115,68,0,0,0,116,0,160,1,124,0,100, + 1,63,0,100,2,23,0,124,0,100,3,63,0,100,4,64, + 0,124,0,100,5,64,0,124,1,100,6,63,0,124,1,100, + 3,63,0,100,7,64,0,124,1,100,5,64,0,100,8,20, + 0,100,9,100,9,100,9,102,9,161,1,83,0,41,10,78, + 233,9,0,0,0,105,188,7,0,0,233,5,0,0,0,233, + 15,0,0,0,233,31,0,0,0,233,11,0,0,0,233,63, + 0,0,0,114,86,0,0,0,114,14,0,0,0,41,2,114, + 131,0,0,0,90,6,109,107,116,105,109,101,41,2,218,1, + 100,114,138,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,14,95,112,97,114,115,101,95,100,111, + 115,116,105,109,101,139,2,0,0,115,22,0,0,0,0,1, + 4,1,10,1,10,1,6,1,6,1,10,1,10,1,2,0, + 2,0,2,249,114,169,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,10,0,0,0,67,0, + 0,0,115,116,0,0,0,122,82,124,1,100,1,100,0,133, + 2,25,0,100,2,107,6,115,22,116,0,130,1,124,1,100, + 0,100,1,133,2,25,0,125,1,124,0,106,1,124,1,25, + 0,125,2,124,2,100,3,25,0,125,3,124,2,100,4,25, + 0,125,4,124,2,100,5,25,0,125,5,116,2,124,4,124, + 3,131,2,124,5,102,2,87,0,83,0,4,0,116,3,116, + 4,116,5,102,3,107,10,114,110,1,0,1,0,1,0,89, + 0,100,6,83,0,88,0,100,0,83,0,41,7,78,114,14, + 0,0,0,169,2,218,1,99,218,1,111,114,163,0,0,0, + 233,6,0,0,0,233,3,0,0,0,41,2,114,0,0,0, + 0,114,0,0,0,0,41,6,218,14,65,115,115,101,114,116, + 105,111,110,69,114,114,111,114,114,28,0,0,0,114,169,0, + 0,0,114,26,0,0,0,218,10,73,110,100,101,120,69,114, + 114,111,114,114,154,0,0,0,41,6,114,32,0,0,0,114, + 13,0,0,0,114,54,0,0,0,114,131,0,0,0,114,132, + 0,0,0,90,17,117,110,99,111,109,112,114,101,115,115,101, + 100,95,115,105,122,101,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,151,0,0,0,152,2,0,0,115,20, + 0,0,0,0,1,2,2,20,1,12,1,10,3,8,1,8, + 1,8,1,16,1,20,1,114,151,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, + 0,67,0,0,0,115,86,0,0,0,124,1,100,1,100,0, + 133,2,25,0,100,2,107,6,115,20,116,0,130,1,124,1, + 100,0,100,1,133,2,25,0,125,1,122,14,124,0,106,1, + 124,1,25,0,125,2,87,0,110,22,4,0,116,2,107,10, + 114,68,1,0,1,0,1,0,89,0,100,0,83,0,88,0, + 116,3,124,0,106,4,124,2,131,2,83,0,100,0,83,0, + 41,3,78,114,14,0,0,0,114,170,0,0,0,41,5,114, + 175,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, + 0,0,0,114,29,0,0,0,41,3,114,32,0,0,0,114, + 13,0,0,0,114,54,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,149,0,0,0,171,2,0, + 0,115,14,0,0,0,0,2,20,1,12,2,2,1,14,1, + 14,1,8,2,114,149,0,0,0,99,2,0,0,0,0,0, + 0,0,0,0,0,0,11,0,0,0,9,0,0,0,67,0, + 0,0,115,198,0,0,0,116,0,124,0,124,1,131,2,125, + 2,116,1,68,0,93,160,92,3,125,3,125,4,125,5,124, + 2,124,3,23,0,125,6,116,2,106,3,100,1,124,0,106, + 4,116,5,124,6,100,2,100,3,141,5,1,0,122,14,124, + 0,106,6,124,6,25,0,125,7,87,0,110,20,4,0,116, + 7,107,10,114,88,1,0,1,0,1,0,89,0,113,14,88, + 0,124,7,100,4,25,0,125,8,116,8,124,0,106,4,124, + 7,131,2,125,9,124,4,114,132,116,9,124,0,124,8,124, + 6,124,1,124,9,131,5,125,10,110,10,116,10,124,8,124, + 9,131,2,125,10,124,10,100,0,107,8,114,152,113,14,124, + 7,100,4,25,0,125,8,124,10,124,5,124,8,102,3,2, + 0,1,0,83,0,113,14,116,11,100,5,124,1,155,2,157, + 2,124,1,100,6,141,2,130,1,100,0,83,0,41,7,78, + 122,13,116,114,121,105,110,103,32,123,125,123,125,123,125,114, + 86,0,0,0,41,1,90,9,118,101,114,98,111,115,105,116, + 121,114,0,0,0,0,114,57,0,0,0,114,58,0,0,0, + 41,12,114,36,0,0,0,114,89,0,0,0,114,76,0,0, + 0,114,77,0,0,0,114,29,0,0,0,114,20,0,0,0, + 114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114, + 155,0,0,0,114,161,0,0,0,114,3,0,0,0,41,11, + 114,32,0,0,0,114,38,0,0,0,114,13,0,0,0,114, + 90,0,0,0,114,91,0,0,0,114,47,0,0,0,114,63, + 0,0,0,114,54,0,0,0,114,40,0,0,0,114,126,0, + 0,0,114,46,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,44,0,0,0,186,2,0,0,115, + 36,0,0,0,0,1,10,1,14,1,8,1,22,1,2,1, + 14,1,14,1,6,2,8,1,12,1,4,1,18,2,10,1, + 8,3,2,1,8,1,16,2,114,44,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,60,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,90,4,100,3,100,4,132, + 0,90,5,100,5,100,6,132,0,90,6,100,7,100,8,132, + 0,90,7,100,9,100,10,132,0,90,8,100,11,100,12,132, + 0,90,9,100,13,83,0,41,14,114,80,0,0,0,122,165, + 80,114,105,118,97,116,101,32,99,108,97,115,115,32,117,115, + 101,100,32,116,111,32,115,117,112,112,111,114,116,32,90,105, + 112,73,109,112,111,114,116,46,103,101,116,95,114,101,115,111, + 117,114,99,101,95,114,101,97,100,101,114,40,41,46,10,10, + 32,32,32,32,84,104,105,115,32,99,108,97,115,115,32,105, + 115,32,97,108,108,111,119,101,100,32,116,111,32,114,101,102, + 101,114,101,110,99,101,32,97,108,108,32,116,104,101,32,105, + 110,110,97,114,100,115,32,97,110,100,32,112,114,105,118,97, + 116,101,32,112,97,114,116,115,32,111,102,10,32,32,32,32, + 116,104,101,32,122,105,112,105,109,112,111,114,116,101,114,46, + 10,32,32,32,32,70,99,3,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, + 100,0,83,0,114,88,0,0,0,41,2,114,4,0,0,0, + 114,38,0,0,0,41,3,114,32,0,0,0,114,4,0,0, + 0,114,38,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,34,0,0,0,220,2,0,0,115,4, + 0,0,0,0,1,6,1,122,33,95,90,105,112,73,109,112, + 111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,101, + 114,46,95,95,105,110,105,116,95,95,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,67, + 0,0,0,115,92,0,0,0,124,0,106,0,160,1,100,1, + 100,2,161,2,125,2,124,2,155,0,100,2,124,1,155,0, + 157,3,125,3,100,3,100,4,108,2,109,3,125,4,1,0, + 122,18,124,4,124,0,106,4,160,5,124,3,161,1,131,1, + 87,0,83,0,4,0,116,6,107,10,114,86,1,0,1,0, + 1,0,116,7,124,3,131,1,130,1,89,0,110,2,88,0, + 100,0,83,0,41,5,78,114,85,0,0,0,114,109,0,0, + 0,114,0,0,0,0,41,1,218,7,66,121,116,101,115,73, + 79,41,8,114,38,0,0,0,114,19,0,0,0,90,2,105, + 111,114,177,0,0,0,114,4,0,0,0,114,55,0,0,0, + 114,22,0,0,0,218,17,70,105,108,101,78,111,116,70,111, + 117,110,100,69,114,114,111,114,41,5,114,32,0,0,0,218, + 8,114,101,115,111,117,114,99,101,218,16,102,117,108,108,110, + 97,109,101,95,97,115,95,112,97,116,104,114,13,0,0,0, + 114,177,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,13,111,112,101,110,95,114,101,115,111,117, + 114,99,101,224,2,0,0,115,14,0,0,0,0,1,14,1, + 14,1,12,1,2,1,18,1,14,1,122,38,95,90,105,112, + 73,109,112,111,114,116,82,101,115,111,117,114,99,101,82,101, + 97,100,101,114,46,111,112,101,110,95,114,101,115,111,117,114, + 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,8,0,0,0, + 116,0,130,1,100,0,83,0,114,88,0,0,0,41,1,114, + 178,0,0,0,41,2,114,32,0,0,0,114,179,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 13,114,101,115,111,117,114,99,101,95,112,97,116,104,233,2, + 0,0,115,2,0,0,0,0,4,122,38,95,90,105,112,73, + 109,112,111,114,116,82,101,115,111,117,114,99,101,82,101,97, + 100,101,114,46,114,101,115,111,117,114,99,101,95,112,97,116, + 104,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,8,0,0,0,67,0,0,0,115,72,0,0,0,124, + 0,106,0,160,1,100,1,100,2,161,2,125,2,124,2,155, + 0,100,2,124,1,155,0,157,3,125,3,122,16,124,0,106, + 2,160,3,124,3,161,1,1,0,87,0,110,22,4,0,116, + 4,107,10,114,66,1,0,1,0,1,0,89,0,100,3,83, + 0,88,0,100,4,83,0,41,5,78,114,85,0,0,0,114, + 109,0,0,0,70,84,41,5,114,38,0,0,0,114,19,0, + 0,0,114,4,0,0,0,114,55,0,0,0,114,22,0,0, + 0,41,4,114,32,0,0,0,114,59,0,0,0,114,180,0, + 0,0,114,13,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,11,105,115,95,114,101,115,111,117, + 114,99,101,239,2,0,0,115,14,0,0,0,0,3,14,1, + 14,1,2,1,16,1,14,1,8,1,122,36,95,90,105,112, + 73,109,112,111,114,116,82,101,115,111,117,114,99,101,82,101, + 97,100,101,114,46,105,115,95,114,101,115,111,117,114,99,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,9,0,0, + 0,9,0,0,0,99,0,0,0,115,186,0,0,0,100,1, + 100,2,108,0,109,1,125,1,1,0,124,1,124,0,106,2, + 160,3,124,0,106,4,161,1,131,1,125,2,124,2,160,5, + 124,0,106,2,106,6,161,1,125,3,124,3,106,7,100,3, + 107,2,115,58,116,8,130,1,124,3,106,9,125,4,116,10, + 131,0,125,5,124,0,106,2,106,11,68,0,93,102,125,6, + 122,18,124,1,124,6,131,1,160,5,124,4,161,1,125,7, + 87,0,110,24,4,0,116,12,107,10,114,124,1,0,1,0, + 1,0,89,0,113,78,89,0,110,2,88,0,124,7,106,9, + 106,7,125,8,116,13,124,8,131,1,100,1,107,2,114,156, + 124,7,106,7,86,0,1,0,113,78,124,8,124,5,107,7, + 114,78,124,5,160,14,124,8,161,1,1,0,124,8,86,0, + 1,0,113,78,100,0,83,0,41,4,78,114,0,0,0,0, + 41,1,218,4,80,97,116,104,114,60,0,0,0,41,15,90, + 7,112,97,116,104,108,105,98,114,184,0,0,0,114,4,0, + 0,0,114,56,0,0,0,114,38,0,0,0,90,11,114,101, + 108,97,116,105,118,101,95,116,111,114,29,0,0,0,114,59, + 0,0,0,114,175,0,0,0,90,6,112,97,114,101,110,116, + 218,3,115,101,116,114,28,0,0,0,114,23,0,0,0,114, + 51,0,0,0,218,3,97,100,100,41,9,114,32,0,0,0, + 114,184,0,0,0,90,13,102,117,108,108,110,97,109,101,95, + 112,97,116,104,90,13,114,101,108,97,116,105,118,101,95,112, + 97,116,104,90,12,112,97,99,107,97,103,101,95,112,97,116, + 104,90,12,115,117,98,100,105,114,115,95,115,101,101,110,218, + 8,102,105,108,101,110,97,109,101,90,8,114,101,108,97,116, + 105,118,101,90,11,112,97,114,101,110,116,95,110,97,109,101, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,99,111,110,116,101,110,116,115,250,2,0,0,115,34,0, + 0,0,0,8,12,1,18,1,14,3,14,1,6,1,6,1, + 12,1,2,1,18,1,14,1,10,5,8,1,12,1,10,1, + 8,1,10,1,122,33,95,90,105,112,73,109,112,111,114,116, + 82,101,115,111,117,114,99,101,82,101,97,100,101,114,46,99, + 111,110,116,101,110,116,115,78,41,10,114,6,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,84,0,0,0,114,81, + 0,0,0,114,34,0,0,0,114,181,0,0,0,114,182,0, + 0,0,114,183,0,0,0,114,188,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,80,0,0,0,212,2,0,0,115,14,0,0,0,8,1, + 4,5,4,2,8,4,8,9,8,6,8,11,114,80,0,0, + 0,41,45,114,84,0,0,0,90,26,95,102,114,111,122,101, + 110,95,105,109,112,111,114,116,108,105,98,95,101,120,116,101, + 114,110,97,108,114,21,0,0,0,114,1,0,0,0,114,2, + 0,0,0,90,17,95,102,114,111,122,101,110,95,105,109,112, + 111,114,116,108,105,98,114,76,0,0,0,114,148,0,0,0, + 114,110,0,0,0,114,152,0,0,0,114,67,0,0,0,114, + 131,0,0,0,90,7,95,95,97,108,108,95,95,114,20,0, + 0,0,90,15,112,97,116,104,95,115,101,112,97,114,97,116, + 111,114,115,114,18,0,0,0,114,75,0,0,0,114,3,0, + 0,0,114,25,0,0,0,218,4,116,121,112,101,114,70,0, + 0,0,114,113,0,0,0,114,115,0,0,0,114,117,0,0, + 0,114,4,0,0,0,114,89,0,0,0,114,36,0,0,0, + 114,37,0,0,0,114,35,0,0,0,114,27,0,0,0,114, + 122,0,0,0,114,142,0,0,0,114,144,0,0,0,114,52, + 0,0,0,114,147,0,0,0,114,155,0,0,0,218,8,95, + 95,99,111,100,101,95,95,114,153,0,0,0,114,159,0,0, + 0,114,161,0,0,0,114,169,0,0,0,114,151,0,0,0, + 114,149,0,0,0,114,44,0,0,0,114,80,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,88,0,0,0,4,16,8,1,16,1,8,1,8,1, + 8,1,8,1,8,1,8,2,8,3,6,1,14,3,16,4, + 4,2,8,2,4,1,4,1,4,2,14,127,0,127,0,1, + 12,1,12,1,2,1,2,252,4,9,8,4,8,9,8,31, + 8,126,2,254,2,29,4,5,8,21,8,46,8,10,8,46, + 10,5,8,7,8,6,8,13,8,19,8,15,8,26, }; From webhook-mailer at python.org Tue Jan 14 06:58:39 2020 From: webhook-mailer at python.org (Nick Coghlan) Date: Tue, 14 Jan 2020 11:58:39 -0000 Subject: [Python-checkins] bpo-39048: Look up __aenter__ before __aexit__ in async with (GH-17609) Message-ID: https://github.com/python/cpython/commit/1d1b97ae643dd8b22d87785ed7bd2599c6c8dc8d commit: 1d1b97ae643dd8b22d87785ed7bd2599c6c8dc8d branch: master author: G?ry Ogam committer: Nick Coghlan date: 2020-01-14T21:58:29+10:00 summary: bpo-39048: Look up __aenter__ before __aexit__ in async with (GH-17609) * Reorder the __aenter__ and __aexit__ checks for async with * Add assertions for async with body being skipped * Swap __aexit__ and __aenter__ loading in the documentation files: A Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst M Doc/reference/compound_stmts.rst M Lib/test/test_coroutines.py M Misc/ACKS M Python/ceval.c diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 564d6cc42136d..e2f44a55b180b 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -844,8 +844,8 @@ The following code:: is semantically equivalent to:: manager = (EXPRESSION) - aexit = type(manager).__aexit__ aenter = type(manager).__aenter__ + aexit = type(manager).__aexit__ value = await aenter(manager) hit_except = False diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 208b5c2ccf5cd..8d1e0692a2422 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1203,39 +1203,41 @@ class CM: def __aenter__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aexit__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_3(self): class CM: def __aexit__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_4(self): class CM: - def __enter__(self): - pass - - def __exit__(self): - pass + pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True - with self.assertRaisesRegex(AttributeError, '__aexit__'): + with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_5(self): # While this test doesn't make a lot of sense, diff --git a/Misc/ACKS b/Misc/ACKS index d3e683d4a085f..3e45d5d0f7f29 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1219,6 +1219,7 @@ Elena Oat Jon Oberheide Milan Oberkirch Pascal Oberndoerfer +G?ry Ogam Jeffrey Ollie Adam Olsen Bryan Olson diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst new file mode 100644 index 0000000000000..1179ef49651bd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst @@ -0,0 +1,4 @@ +Improve the displayed error message when incorrect types are passed to ``async +with`` statements by looking up the :meth:`__aenter__` special method before +the :meth:`__aexit__` special method when entering an asynchronous context +manager. Patch by G?ry Ogam. diff --git a/Python/ceval.c b/Python/ceval.c index 096645aeebfb9..5e586589e9618 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3230,20 +3230,21 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(BEFORE_ASYNC_WITH): { - _Py_IDENTIFIER(__aexit__); _Py_IDENTIFIER(__aenter__); - + _Py_IDENTIFIER(__aexit__); PyObject *mgr = TOP(); - PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__), - *enter; + PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__); PyObject *res; - if (exit == NULL) + if (enter == NULL) { + goto error; + } + PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__); + if (exit == NULL) { + Py_DECREF(enter); goto error; + } SET_TOP(exit); - enter = special_lookup(tstate, mgr, &PyId___aenter__); Py_DECREF(mgr); - if (enter == NULL) - goto error; res = _PyObject_CallNoArg(enter); Py_DECREF(enter); if (res == NULL) @@ -3264,8 +3265,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(SETUP_WITH): { - _Py_IDENTIFIER(__exit__); _Py_IDENTIFIER(__enter__); + _Py_IDENTIFIER(__exit__); PyObject *mgr = TOP(); PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__); PyObject *res; From webhook-mailer at python.org Tue Jan 14 07:06:49 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Tue, 14 Jan 2020 12:06:49 -0000 Subject: [Python-checkins] bpo-39322: Add gc.is_finalized to check if an object has been finalised by the gc (GH-17989) Message-ID: https://github.com/python/cpython/commit/a2ec3f07f7f028ff6229d6be2a7cfbda1f4efaeb commit: a2ec3f07f7f028ff6229d6be2a7cfbda1f4efaeb branch: master author: Pablo Galindo committer: GitHub date: 2020-01-14T12:06:45Z summary: bpo-39322: Add gc.is_finalized to check if an object has been finalised by the gc (GH-17989) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst M Doc/library/gc.rst M Doc/whatsnew/3.9.rst M Lib/test/test_gc.py M Modules/clinic/gcmodule.c.h M Modules/gcmodule.c diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 13eda917b9a80..0c33c86530459 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -177,6 +177,27 @@ The :mod:`gc` module provides the following functions: .. versionadded:: 3.1 +.. function:: is_finalized(obj) + + Returns ``True`` if the given object has been finalized by the + garbage collector, ``False`` otherwise. :: + + >>> x = None + >>> class Lazarus: + ... def __del__(self): + ... global x + ... x = self + ... + >>> lazarus = Lazarus() + >>> gc.is_finalized(lazarus) + False + >>> del lazarus + >>> gc.is_finalized(x) + True + + .. versionadded:: 3.9 + + .. function:: freeze() Freeze all the objects tracked by gc - move them to a permanent generation diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 00409af4387d8..c94999999208d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -174,6 +174,10 @@ When the garbage collector makes a collection in which some objects resurrect been executed), do not block the collection of all objects that are still unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. (Contributed by Pablo Galindo in +:issue:`39322`.) + imaplib ------- diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index c0d4a7507ae0d..18f8d10c5ba6a 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -586,6 +586,24 @@ class UserIntSlots(int): self.assertFalse(gc.is_tracked(UserFloatSlots())) self.assertFalse(gc.is_tracked(UserIntSlots())) + def test_is_finalized(self): + # Objects not tracked by the always gc return false + self.assertFalse(gc.is_finalized(3)) + + storage = [] + class Lazarus: + def __del__(self): + storage.append(self) + + lazarus = Lazarus() + self.assertFalse(gc.is_finalized(lazarus)) + + del lazarus + gc.collect() + + lazarus = storage.pop() + self.assertTrue(gc.is_finalized(lazarus)) + def test_bug1055820b(self): # Corresponds to temp2b.py in the bug report. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst new file mode 100644 index 0000000000000..60df44cc67219 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst @@ -0,0 +1,2 @@ +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. Patch by Pablo Galindo. diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h index 22d2aa4a87bcd..72795c66bf728 100644 --- a/Modules/clinic/gcmodule.c.h +++ b/Modules/clinic/gcmodule.c.h @@ -304,6 +304,15 @@ PyDoc_STRVAR(gc_is_tracked__doc__, #define GC_IS_TRACKED_METHODDEF \ {"is_tracked", (PyCFunction)gc_is_tracked, METH_O, gc_is_tracked__doc__}, +PyDoc_STRVAR(gc_is_finalized__doc__, +"is_finalized($module, obj, /)\n" +"--\n" +"\n" +"Returns true if the object has been already finalized by the GC."); + +#define GC_IS_FINALIZED_METHODDEF \ + {"is_finalized", (PyCFunction)gc_is_finalized, METH_O, gc_is_finalized__doc__}, + PyDoc_STRVAR(gc_freeze__doc__, "freeze($module, /)\n" "--\n" @@ -373,4 +382,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=e40d384b1f0d513c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bd6a8056989e2e69 input=a9049054013a1b77]*/ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 5fef114d73ed1..4ad9d228f5acc 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1869,6 +1869,25 @@ gc_is_tracked(PyObject *module, PyObject *obj) return result; } +/*[clinic input] +gc.is_finalized + + obj: object + / + +Returns true if the object has been already finalized by the GC. +[clinic start generated code]*/ + +static PyObject * +gc_is_finalized(PyObject *module, PyObject *obj) +/*[clinic end generated code: output=e1516ac119a918ed input=201d0c58f69ae390]*/ +{ + if (PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + /*[clinic input] gc.freeze @@ -1961,6 +1980,7 @@ static PyMethodDef GcMethods[] = { GC_GET_OBJECTS_METHODDEF GC_GET_STATS_METHODDEF GC_IS_TRACKED_METHODDEF + GC_IS_FINALIZED_METHODDEF {"get_referrers", gc_get_referrers, METH_VARARGS, gc_get_referrers__doc__}, {"get_referents", gc_get_referents, METH_VARARGS, From webhook-mailer at python.org Tue Jan 14 12:38:22 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Tue, 14 Jan 2020 17:38:22 -0000 Subject: [Python-checkins] bpo-39322: Add gc.is_finalized to the gc module docstring (GH-18000) Message-ID: https://github.com/python/cpython/commit/b6791375b2ff86ea07f068fb53d9575c337eaa5b commit: b6791375b2ff86ea07f068fb53d9575c337eaa5b branch: master author: Pablo Galindo committer: GitHub date: 2020-01-14T17:38:15Z summary: bpo-39322: Add gc.is_finalized to the gc module docstring (GH-18000) files: M Modules/gcmodule.c diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 4ad9d228f5acc..aacdb3f45a179 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1961,6 +1961,7 @@ PyDoc_STRVAR(gc__doc__, "get_threshold() -- Return the current the collection thresholds.\n" "get_objects() -- Return a list of all objects tracked by the collector.\n" "is_tracked() -- Returns true if a given object is tracked.\n" +"is_finalized() -- Returns true if a given object has been already finalized.\n" "get_referrers() -- Return the list of objects that refer to an object.\n" "get_referents() -- Return the list of objects that an object refers to.\n" "freeze() -- Freeze all tracked objects and ignore them for future collections.\n" From webhook-mailer at python.org Tue Jan 14 12:57:09 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 Jan 2020 17:57:09 -0000 Subject: [Python-checkins] bpo-38361: syslog: fixed making default "ident" from sys.argv[0] (GH-16557) Message-ID: https://github.com/python/cpython/commit/f04750bb7af45cb6efab8d92d1ff063f0bf2833d commit: f04750bb7af45cb6efab8d92d1ff063f0bf2833d branch: master author: V?clav Barto? committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-14T09:57:04-08:00 summary: bpo-38361: syslog: fixed making default "ident" from sys.argv[0] (GH-16557) The default value of "ident" parameter should be sys.argv[0] with leading path components stripped, but it contained the last slash, i.e. '/program' instead of 'program'. BPO issue: https://bugs.python.org/issue38361 https://bugs.python.org/issue38361 files: A Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst M Modules/syslogmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst b/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst new file mode 100644 index 0000000000000..65186db60b455 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst @@ -0,0 +1 @@ +Fixed an issue where ``ident`` could include a leading path separator when :func:`syslog.openlog` was called without arguments. \ No newline at end of file diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index b2ea73baa1be4..539224f2c5b67 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -99,7 +99,7 @@ syslog_get_argv(void) if (slash == -2) return NULL; if (slash != -1) { - return PyUnicode_Substring(scriptobj, slash, scriptlen); + return PyUnicode_Substring(scriptobj, slash + 1, scriptlen); } else { Py_INCREF(scriptobj); return(scriptobj); From webhook-mailer at python.org Tue Jan 14 14:47:34 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Tue, 14 Jan 2020 19:47:34 -0000 Subject: [Python-checkins] Fix documentation in code.py (GH-17988) Message-ID: https://github.com/python/cpython/commit/b4cdb3f60e71888d7f3d4e0d40cb31e968ea160c commit: b4cdb3f60e71888d7f3d4e0d40cb31e968ea160c branch: master author: Kyle Pollina committer: Karthikeyan Singaravelan date: 2020-01-15T01:17:25+05:30 summary: Fix documentation in code.py (GH-17988) files: M Doc/library/code.rst M Lib/code.py diff --git a/Doc/library/code.rst b/Doc/library/code.rst index e2c47bab5a0b9..6708079f778c1 100644 --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -76,7 +76,7 @@ Interactive Interpreter Objects Compile and run some source in the interpreter. Arguments are the same as for :func:`compile_command`; the default for *filename* is ``''``, and for - *symbol* is ``'single'``. One several things can happen: + *symbol* is ``'single'``. One of several things can happen: * The input is incorrect; :func:`compile_command` raised an exception (:exc:`SyntaxError` or :exc:`OverflowError`). A syntax traceback will be diff --git a/Lib/code.py b/Lib/code.py index d8106ae612c4b..76000f8c8b2c1 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -40,7 +40,7 @@ def runsource(self, source, filename="", symbol="single"): Arguments are as for compile_command(). - One several things can happen: + One of several things can happen: 1) The input is incorrect; compile_command() raised an exception (SyntaxError or OverflowError). A syntax traceback From webhook-mailer at python.org Tue Jan 14 15:14:04 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 Jan 2020 20:14:04 -0000 Subject: [Python-checkins] Fix documentation in code.py (GH-17988) Message-ID: https://github.com/python/cpython/commit/9f220e4968cf73fa60440120ee46881e7974e47d commit: 9f220e4968cf73fa60440120ee46881e7974e47d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-14T12:13:59-08:00 summary: Fix documentation in code.py (GH-17988) (cherry picked from commit b4cdb3f60e71888d7f3d4e0d40cb31e968ea160c) Co-authored-by: Kyle Pollina files: M Doc/library/code.rst M Lib/code.py diff --git a/Doc/library/code.rst b/Doc/library/code.rst index e2c47bab5a0b9..6708079f778c1 100644 --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -76,7 +76,7 @@ Interactive Interpreter Objects Compile and run some source in the interpreter. Arguments are the same as for :func:`compile_command`; the default for *filename* is ``''``, and for - *symbol* is ``'single'``. One several things can happen: + *symbol* is ``'single'``. One of several things can happen: * The input is incorrect; :func:`compile_command` raised an exception (:exc:`SyntaxError` or :exc:`OverflowError`). A syntax traceback will be diff --git a/Lib/code.py b/Lib/code.py index d8106ae612c4b..76000f8c8b2c1 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -40,7 +40,7 @@ def runsource(self, source, filename="", symbol="single"): Arguments are as for compile_command(). - One several things can happen: + One of several things can happen: 1) The input is incorrect; compile_command() raised an exception (SyntaxError or OverflowError). A syntax traceback From webhook-mailer at python.org Tue Jan 14 15:15:01 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 14 Jan 2020 20:15:01 -0000 Subject: [Python-checkins] Fix documentation in code.py (GH-17988) Message-ID: https://github.com/python/cpython/commit/5c08bfe8671a9c8830a4301a7ed2f2468174a131 commit: 5c08bfe8671a9c8830a4301a7ed2f2468174a131 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-14T12:14:56-08:00 summary: Fix documentation in code.py (GH-17988) (cherry picked from commit b4cdb3f60e71888d7f3d4e0d40cb31e968ea160c) Co-authored-by: Kyle Pollina files: M Doc/library/code.rst M Lib/code.py diff --git a/Doc/library/code.rst b/Doc/library/code.rst index e2c47bab5a0b9..6708079f778c1 100644 --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -76,7 +76,7 @@ Interactive Interpreter Objects Compile and run some source in the interpreter. Arguments are the same as for :func:`compile_command`; the default for *filename* is ``''``, and for - *symbol* is ``'single'``. One several things can happen: + *symbol* is ``'single'``. One of several things can happen: * The input is incorrect; :func:`compile_command` raised an exception (:exc:`SyntaxError` or :exc:`OverflowError`). A syntax traceback will be diff --git a/Lib/code.py b/Lib/code.py index d8106ae612c4b..76000f8c8b2c1 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -40,7 +40,7 @@ def runsource(self, source, filename="", symbol="single"): Arguments are as for compile_command(). - One several things can happen: + One of several things can happen: 1) The input is incorrect; compile_command() raised an exception (SyntaxError or OverflowError). A syntax traceback From webhook-mailer at python.org Tue Jan 14 15:48:07 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 14 Jan 2020 20:48:07 -0000 Subject: [Python-checkins] venv: Suppress warning message when bash hashing is disabled. (GH-17966) Message-ID: https://github.com/python/cpython/commit/4b0d91aab4cfba30a2a9728e9eaea15dbc0ba9bd commit: 4b0d91aab4cfba30a2a9728e9eaea15dbc0ba9bd branch: master author: Dima <43349662+d-goldin at users.noreply.github.com> committer: Vinay Sajip date: 2020-01-14T20:47:59Z summary: venv: Suppress warning message when bash hashing is disabled. (GH-17966) When using python's built-in venv activaton script warnings are printed when hashing is disabled in bash or zsh, like; `bash: hash: hashing disabled` This output is not really useful to the end-user and has been disabled in `virtualenv` for long. This commit is based on: https://github.com/pypa/virtualenv/commit/28e85bcd80d04b2a7ebce0e1d0b02d432b7e5593 files: M Lib/venv/scripts/common/activate diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index b1b4625fdddc3..45af3536aa191 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -18,7 +18,7 @@ deactivate () { # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then @@ -62,5 +62,5 @@ fi # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi From webhook-mailer at python.org Tue Jan 14 15:49:38 2020 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 14 Jan 2020 20:49:38 -0000 Subject: [Python-checkins] bpo-38901: Allow setting a venv's prompt to the basename of the current directory. (GH-17946) Message-ID: https://github.com/python/cpython/commit/7d6378051feeadf45b4ce45b4b406b65df255648 commit: 7d6378051feeadf45b4ce45b4b406b65df255648 branch: master author: Vinay Sajip committer: GitHub date: 2020-01-14T20:49:30Z summary: bpo-38901: Allow setting a venv's prompt to the basename of the current directory. (GH-17946) When a prompt value of '.' is specified, os.path.basename(os.getcwd()) is used to configure the prompt for the created venv. files: A Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst M Doc/library/venv.rst M Lib/test/test_venv.py M Lib/venv/__init__.py diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 5494c0c878bc5..d778486b0a5d9 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -122,7 +122,8 @@ creation according to their needs, the :class:`EnvBuilder` class. * ``prompt`` -- a String to be used after virtual environment is activated (defaults to ``None`` which means directory name of the environment would - be used). + be used). If the special string ``"."`` is provided, the basename of the + current directory is used as the prompt. * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 741ac109bbc8c..a3b78c4e44e52 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -138,6 +138,15 @@ def test_prompt(self): self.assertEqual(context.prompt, '(My prompt) ') self.assertIn("prompt = 'My prompt'\n", data) + rmtree(self.env_dir) + builder = venv.EnvBuilder(prompt='.') + cwd = os.path.basename(os.getcwd()) + self.run_with_capture(builder.create, self.env_dir) + context = builder.ensure_directories(self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + self.assertEqual(context.prompt, '(%s) ' % cwd) + self.assertIn("prompt = '%s'\n" % cwd, data) + def test_upgrade_dependencies(self): builder = venv.EnvBuilder() bin_path = 'Scripts' if sys.platform == 'win32' else 'bin' diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 81cb1d13e2163..a220ef784c134 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -51,6 +51,8 @@ def __init__(self, system_site_packages=False, clear=False, self.symlinks = symlinks self.upgrade = upgrade self.with_pip = with_pip + if prompt == '.': # see bpo-38901 + prompt = os.path.basename(os.getcwd()) self.prompt = prompt self.upgrade_deps = upgrade_deps diff --git a/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst b/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst new file mode 100644 index 0000000000000..304d53289e0ef --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst @@ -0,0 +1,3 @@ +When you specify prompt='.' or equivalently python -m venv --prompt . ... +the basename of the current directory is used to set the created venv's +prompt when it's activated. From webhook-mailer at python.org Tue Jan 14 16:42:17 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 14 Jan 2020 21:42:17 -0000 Subject: [Python-checkins] bpo-39329: Add timeout parameter for smtplib.LMTP constructor (GH-17998) Message-ID: https://github.com/python/cpython/commit/65a5ce247f177c4c52cfd104d9df0c2f3b1c91f0 commit: 65a5ce247f177c4c52cfd104d9df0c2f3b1c91f0 branch: master author: Dong-hee Na committer: Victor Stinner date: 2020-01-14T22:42:09+01:00 summary: bpo-39329: Add timeout parameter for smtplib.LMTP constructor (GH-17998) files: A Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst M Doc/library/smtplib.rst M Doc/whatsnew/3.9.rst M Lib/smtplib.py M Lib/test/test_smtplib.py diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index f6ac123823b69..a88e358eae5fd 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -115,7 +115,8 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). If the *timeout* parameter is set to be zero, it will raise a :class:`ValueError` to prevent the creation of a non-blocking socket -.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None) +.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, + source_address=None[, timeout]) The LMTP protocol, which is very similar to ESMTP, is heavily based on the standard SMTP client. It's common to use Unix sockets for LMTP, so our @@ -128,6 +129,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). Unix socket, LMTP generally don't support or require any authentication, but your mileage might vary. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + A nice selection of exceptions is defined as well: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index c94999999208d..451902ab1dbd5 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -270,6 +270,9 @@ smtplib if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +(Contributed by Dong-hee Na in :issue:`39329`.) + signal ------ diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 4d5cdb5ac0ad9..7808ba01cba88 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -1066,19 +1066,23 @@ class LMTP(SMTP): ehlo_msg = "lhlo" def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): + source_address=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Initialize a new instance.""" super().__init__(host, port, local_hostname=local_hostname, - source_address=source_address) + source_address=source_address, timeout=timeout) def connect(self, host='localhost', port=0, source_address=None): """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" if host[0] != '/': return super().connect(host, port, source_address=source_address) + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') + # Handle Unix-domain sockets. try: self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.settimeout(self.timeout) self.file = None self.sock.connect(host) except OSError: diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index cc5c4b1346488..067c01c10c1b3 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -56,7 +56,7 @@ def server(evt, buf, serv): serv.close() evt.set() -class GeneralTests(unittest.TestCase): +class GeneralTests: def setUp(self): smtplib.socket = mock_socket @@ -75,29 +75,29 @@ def testQuoteData(self): def testBasic1(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port) - smtp.close() + client = self.client(HOST, self.port) + client.close() def testSourceAddress(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port, - source_address=('127.0.0.1',19876)) - self.assertEqual(smtp.source_address, ('127.0.0.1', 19876)) - smtp.close() + client = self.client(HOST, self.port, + source_address=('127.0.0.1',19876)) + self.assertEqual(client.source_address, ('127.0.0.1', 19876)) + client.close() def testBasic2(self): mock_socket.reply_with(b"220 Hola mundo") # connects, include port in host name - smtp = smtplib.SMTP("%s:%s" % (HOST, self.port)) - smtp.close() + client = self.client("%s:%s" % (HOST, self.port)) + client.close() def testLocalHostName(self): mock_socket.reply_with(b"220 Hola mundo") # check that supplied local_hostname is used - smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost") - self.assertEqual(smtp.local_hostname, "testhost") - smtp.close() + client = self.client(HOST, self.port, local_hostname="testhost") + self.assertEqual(client.local_hostname, "testhost") + client.close() def testTimeoutDefault(self): mock_socket.reply_with(b"220 Hola mundo") @@ -105,56 +105,71 @@ def testTimeoutDefault(self): mock_socket.setdefaulttimeout(30) self.assertEqual(mock_socket.getdefaulttimeout(), 30) try: - smtp = smtplib.SMTP(HOST, self.port) + client = self.client(HOST, self.port) finally: mock_socket.setdefaulttimeout(None) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def testTimeoutNone(self): mock_socket.reply_with(b"220 Hola mundo") self.assertIsNone(socket.getdefaulttimeout()) socket.setdefaulttimeout(30) try: - smtp = smtplib.SMTP(HOST, self.port, timeout=None) + client = self.client(HOST, self.port, timeout=None) finally: socket.setdefaulttimeout(None) - self.assertIsNone(smtp.sock.gettimeout()) - smtp.close() + self.assertIsNone(client.sock.gettimeout()) + client.close() def testTimeoutZero(self): mock_socket.reply_with(b"220 Hola mundo") with self.assertRaises(ValueError): - smtplib.SMTP(HOST, self.port, timeout=0) + self.client(HOST, self.port, timeout=0) def testTimeoutValue(self): mock_socket.reply_with(b"220 Hola mundo") - smtp = smtplib.SMTP(HOST, self.port, timeout=30) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + client = self.client(HOST, self.port, timeout=30) + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def test_debuglevel(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(1) + client = self.client() + client.set_debuglevel(1) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^connect:", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) def test_debuglevel_2(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(2) + client = self.client() + client.set_debuglevel(2) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^\d{2}:\d{2}:\d{2}\.\d{6} connect: ", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) +class SMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.SMTP + + +class LMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.LMTP + + def testTimeoutZero(self): + super().testTimeoutZero() + local_host = '/some/local/lmtp/delivery/program' + with self.assertRaises(ValueError): + self.client(local_host, timeout=0) + # Test server thread using the specified SMTP server class def debugging_server(serv, serv_evt, client_evt): serv_evt.set() diff --git a/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst b/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst new file mode 100644 index 0000000000000..1e3da4618b41c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst @@ -0,0 +1,2 @@ +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +Patch by Dong-hee Na. From webhook-mailer at python.org Tue Jan 14 17:32:59 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Tue, 14 Jan 2020 22:32:59 -0000 Subject: [Python-checkins] Allow pgen to produce a DOT format dump of the grammar (GH-18005) Message-ID: https://github.com/python/cpython/commit/45cf5db587d77606e12f4fdc98c7b87964a2f2be commit: 45cf5db587d77606e12f4fdc98c7b87964a2f2be branch: master author: Pablo Galindo committer: GitHub date: 2020-01-14T22:32:55Z summary: Allow pgen to produce a DOT format dump of the grammar (GH-18005) Originally suggested by Anthony Shaw. files: M Parser/pgen/__main__.py M Parser/pgen/automata.py M Parser/pgen/pgen.py diff --git a/Parser/pgen/__main__.py b/Parser/pgen/__main__.py index bb96e75beea5e..d3780a7b77de8 100644 --- a/Parser/pgen/__main__.py +++ b/Parser/pgen/__main__.py @@ -21,9 +21,19 @@ def main(): ) parser.add_argument("--verbose", "-v", action="count") + parser.add_argument( + "--graph", + type=argparse.FileType("w"), + action="store", + metavar="GRAPH_OUTPUT_FILE", + help="Dumps a DOT representation of the generated automata in a file", + ) + args = parser.parse_args() - p = ParserGenerator(args.grammar, args.tokens, verbose=args.verbose) + p = ParserGenerator( + args.grammar, args.tokens, verbose=args.verbose, graph_file=args.graph + ) grammar = p.make_grammar() grammar.produce_graminit_h(args.graminit_h.write) grammar.produce_graminit_c(args.graminit_c.write) diff --git a/Parser/pgen/automata.py b/Parser/pgen/automata.py index 545a7370f7ee9..d04ca7c6e80b5 100644 --- a/Parser/pgen/automata.py +++ b/Parser/pgen/automata.py @@ -48,6 +48,26 @@ def dump(self, writer=print): else: writer(" %s -> %d" % (label, j)) + def dump_graph(self, writer): + """Dump a DOT representation of the NFA""" + writer('digraph %s_nfa {\n' % self.name) + todo = [self.start] + for i, state in enumerate(todo): + writer(' %d [label="State %d %s"];\n' % (i, i, state is self.end and "(final)" or "")) + for arc in state.arcs: + label = arc.label + next = arc.target + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + writer(" %d -> %d [style=dotted label=?];\n" % (i, j)) + else: + writer(" %d -> %d [label=%s];\n" % (i, j, label.replace("'", '"'))) + writer('}\n') + class NFAArc: """An arc representing a transition between two NFA states. @@ -301,6 +321,15 @@ def dump(self, writer=print): for label, next in sorted(state.arcs.items()): writer(" %s -> %d" % (label, self.states.index(next))) + def dump_graph(self, writer): + """Dump a DOT representation of the DFA""" + writer('digraph %s_dfa {\n' % self.name) + for i, state in enumerate(self.states): + writer(' %d [label="State %d %s"];\n' % (i, i, state.is_final and "(final)" or "")) + for label, next in sorted(state.arcs.items()): + writer(" %d -> %d [label=%s];\n" % (i, self.states.index(next), label.replace("'", '"'))) + writer('}\n') + class DFAState(object): """A state of a DFA diff --git a/Parser/pgen/pgen.py b/Parser/pgen/pgen.py index 2f444eb8c86ff..03032d4ed8ccf 100644 --- a/Parser/pgen/pgen.py +++ b/Parser/pgen/pgen.py @@ -130,7 +130,7 @@ def __repr__(self): class ParserGenerator(object): - def __init__(self, grammar_file, token_file, verbose=False): + def __init__(self, grammar_file, token_file, verbose=False, graph_file=None): with open(grammar_file) as f: self.grammar = f.read() with open(token_file) as tok_file: @@ -141,6 +141,7 @@ def __init__(self, grammar_file, token_file, verbose=False): self.opmap["<>"] = "NOTEQUAL" self.verbose = verbose self.filename = grammar_file + self.graph_file = graph_file self.dfas, self.startsymbol = self.create_dfas() self.first = {} # map from symbol name to set of tokens self.calculate_first_sets() @@ -152,11 +153,15 @@ def create_dfas(self): if self.verbose: print("Dump of NFA for", nfa.name) nfa.dump() + if self.graph_file is not None: + nfa.dump_graph(self.graph_file.write) dfa = DFA.from_nfa(nfa) if self.verbose: print("Dump of DFA for", dfa.name) dfa.dump() dfa.simplify() + if self.graph_file is not None: + dfa.dump_graph(self.graph_file.write) rule_to_dfas[dfa.name] = dfa if start_nonterminal is None: From webhook-mailer at python.org Wed Jan 15 04:50:01 2020 From: webhook-mailer at python.org (Chris Withers) Date: Wed, 15 Jan 2020 09:50:01 -0000 Subject: [Python-checkins] Improve test coverage for AsyncMock. (GH-17906) Message-ID: https://github.com/python/cpython/commit/54f743eb315f00b0ff45e115dde7a5d506034153 commit: 54f743eb315f00b0ff45e115dde7a5d506034153 branch: master author: Karthikeyan Singaravelan committer: Chris Withers date: 2020-01-15T09:49:49Z summary: Improve test coverage for AsyncMock. (GH-17906) * Add test for nested async decorator patch. * Add test for side_effect and wraps with a function. * Add test for side_effect with an exception in the iterable. files: M Lib/unittest/test/testmock/testasync.py diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 149fd4deff102..73d31a2966882 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -72,9 +72,17 @@ def test_async(mock_method): test_async() def test_async_def_patch(self): - @patch(f"{__name__}.async_func", AsyncMock()) - async def test_async(): + @patch(f"{__name__}.async_func", return_value=1) + @patch(f"{__name__}.async_func_args", return_value=2) + async def test_async(func_args_mock, func_mock): + self.assertEqual(func_args_mock._mock_name, "async_func_args") + self.assertEqual(func_mock._mock_name, "async_func") + self.assertIsInstance(async_func, AsyncMock) + self.assertIsInstance(async_func_args, AsyncMock) + + self.assertEqual(await async_func(), 1) + self.assertEqual(await async_func_args(1, 2, c=3), 2) asyncio.run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -375,22 +383,40 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): with self.assertRaises(Exception): await mock(5) - async def test_add_side_effect_function(self): + async def test_add_side_effect_coroutine(self): async def addition(var): return var + 1 mock = AsyncMock(side_effect=addition) result = await mock(5) self.assertEqual(result, 6) + async def test_add_side_effect_normal_function(self): + def addition(var): + return var + 1 + mock = AsyncMock(side_effect=addition) + result = await mock(5) + self.assertEqual(result, 6) + async def test_add_side_effect_iterable(self): vals = [1, 2, 3] mock = AsyncMock(side_effect=vals) for item in vals: - self.assertEqual(item, await mock()) + self.assertEqual(await mock(), item) with self.assertRaises(StopAsyncIteration) as e: await mock() + async def test_add_side_effect_exception_iterable(self): + class SampleException(Exception): + pass + + vals = [1, SampleException("foo")] + mock = AsyncMock(side_effect=vals) + self.assertEqual(await mock(), 1) + + with self.assertRaises(SampleException) as e: + await mock() + async def test_return_value_AsyncMock(self): value = AsyncMock(return_value=10) mock = AsyncMock(return_value=value) @@ -437,6 +463,21 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): mock.assert_awaited() self.assertTrue(ran) + async def test_wraps_normal_function(self): + value = 1 + + ran = False + def inner(): + nonlocal ran + ran = True + return value + + mock = AsyncMock(wraps=inner) + result = await mock() + self.assertEqual(result, value) + mock.assert_awaited() + self.assertTrue(ran) + class AsyncMagicMethods(unittest.TestCase): def test_async_magic_methods_return_async_mocks(self): m_mock = MagicMock() @@ -860,6 +901,10 @@ def test_assert_awaited_once(self): self.mock.assert_awaited_once() def test_assert_awaited_with(self): + msg = 'Not awaited' + with self.assertRaisesRegex(AssertionError, msg): + self.mock.assert_awaited_with('foo') + asyncio.run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): From webhook-mailer at python.org Wed Jan 15 04:51:05 2020 From: webhook-mailer at python.org (Chris Withers) Date: Wed, 15 Jan 2020 09:51:05 -0000 Subject: [Python-checkins] Fix AsyncMock base class in the docs (GH-18008) Message-ID: https://github.com/python/cpython/commit/cf288b53e418d8e93626e3d87c9926067d3b3147 commit: cf288b53e418d8e93626e3d87c9926067d3b3147 branch: master author: Elena Oat committer: Chris Withers date: 2020-01-15T09:50:57Z summary: Fix AsyncMock base class in the docs (GH-18008) files: M Doc/library/unittest.mock.rst diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index e92f5545d3eb0..8394304cfdd9a 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -854,7 +854,7 @@ object:: .. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) - An asynchronous version of :class:`Mock`. The :class:`AsyncMock` object will + An asynchronous version of :class:`MagicMock`. The :class:`AsyncMock` object will behave so the object is recognized as an async function, and the result of a call is an awaitable. From webhook-mailer at python.org Wed Jan 15 05:23:42 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 15 Jan 2020 10:23:42 -0000 Subject: [Python-checkins] bpo-39164: Fix compiler warning in PyErr_GetExcInfo() (GH-18010) Message-ID: https://github.com/python/cpython/commit/3f12ac18a407983a23d43ae785e805e773571477 commit: 3f12ac18a407983a23d43ae785e805e773571477 branch: master author: Victor Stinner committer: GitHub date: 2020-01-15T11:23:25+01:00 summary: bpo-39164: Fix compiler warning in PyErr_GetExcInfo() (GH-18010) The function has no return value. files: M Python/errors.c diff --git a/Python/errors.c b/Python/errors.c index cdb44605056a5..18ea9c5652a46 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -451,7 +451,7 @@ void PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { PyThreadState *tstate = _PyThreadState_GET(); - return _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); + _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); } void From webhook-mailer at python.org Wed Jan 15 11:32:56 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 15 Jan 2020 16:32:56 -0000 Subject: [Python-checkins] bpo-1635741: Port _json extension module to multiphase initialization (PEP 489) (GH-17835) Message-ID: https://github.com/python/cpython/commit/ed154c387efc5f978ec97900ec9e0ec6631d5498 commit: ed154c387efc5f978ec97900ec9e0ec6631d5498 branch: master author: Hai Shi committer: Victor Stinner date: 2020-01-15T17:32:51+01:00 summary: bpo-1635741: Port _json extension module to multiphase initialization (PEP 489) (GH-17835) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst M Modules/_json.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst new file mode 100644 index 0000000000000..9b856c9e1ba24 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst @@ -0,0 +1 @@ +Port _json extension module to multiphase initialization (:pep:`489`). diff --git a/Modules/_json.c b/Modules/_json.c index 439414fd59e62..3e4fe795a0573 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1863,13 +1863,40 @@ static PyMethodDef speedups_methods[] = { PyDoc_STRVAR(module_doc, "json speedups\n"); +static int +_json_exec(PyObject *module) +{ + if (PyType_Ready(&PyScannerType) < 0) { + return -1; + } + if (PyType_Ready(&PyEncoderType) < 0) { + return -1; + } + Py_INCREF((PyObject*)&PyScannerType); + if (PyModule_AddObject(module, "make_scanner", (PyObject*)&PyScannerType) < 0) { + Py_DECREF((PyObject*)&PyScannerType); + return -1; + } + Py_INCREF((PyObject*)&PyEncoderType); + if (PyModule_AddObject(module, "make_encoder", (PyObject*)&PyEncoderType) < 0) { + Py_DECREF((PyObject*)&PyEncoderType); + return -1; + } + return 0; +} + +static PyModuleDef_Slot _json_slots[] = { + {Py_mod_exec, _json_exec}, + {0, NULL} +}; + static struct PyModuleDef jsonmodule = { PyModuleDef_HEAD_INIT, "_json", module_doc, - -1, + 0, speedups_methods, - NULL, + _json_slots, NULL, NULL, NULL @@ -1878,25 +1905,5 @@ static struct PyModuleDef jsonmodule = { PyMODINIT_FUNC PyInit__json(void) { - PyObject *m = PyModule_Create(&jsonmodule); - if (!m) - return NULL; - if (PyType_Ready(&PyScannerType) < 0) - goto fail; - if (PyType_Ready(&PyEncoderType) < 0) - goto fail; - Py_INCREF((PyObject*)&PyScannerType); - if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) { - Py_DECREF((PyObject*)&PyScannerType); - goto fail; - } - Py_INCREF((PyObject*)&PyEncoderType); - if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) { - Py_DECREF((PyObject*)&PyEncoderType); - goto fail; - } - return m; - fail: - Py_DECREF(m); - return NULL; + return PyModuleDef_Init(&jsonmodule); } From webhook-mailer at python.org Wed Jan 15 11:39:00 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 15 Jan 2020 16:39:00 -0000 Subject: [Python-checkins] bpo-38630: Fix subprocess.Popen.send_signal() race condition (GH-16984) Message-ID: https://github.com/python/cpython/commit/e85a305503bf83c5a8ffb3a988dfe7b67461cbee commit: e85a305503bf83c5a8ffb3a988dfe7b67461cbee branch: master author: Victor Stinner committer: GitHub date: 2020-01-15T17:38:55+01:00 summary: bpo-38630: Fix subprocess.Popen.send_signal() race condition (GH-16984) On Unix, subprocess.Popen.send_signal() now polls the process status. Polling reduces the risk of sending a signal to the wrong process if the process completed, the Popen.returncode attribute is still None, and the pid has been reassigned (recycled) to a new different process. files: A Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst M Doc/library/subprocess.rst M Lib/subprocess.py M Lib/test/test_subprocess.py diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index f2e5463d755bb..74857480360dc 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -774,6 +774,8 @@ Instances of the :class:`Popen` class have the following methods: Sends the signal *signal* to the child. + Do nothing if the process completed. + .. note:: On Windows, SIGTERM is an alias for :meth:`terminate`. CTRL_C_EVENT and diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 30f0d1be154c4..79dffd349a30e 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -2061,9 +2061,31 @@ def _save_input(self, input): def send_signal(self, sig): """Send a signal to the process.""" - # Skip signalling a process that we know has already died. - if self.returncode is None: - os.kill(self.pid, sig) + # bpo-38630: Polling reduces the risk of sending a signal to the + # wrong process if the process completed, the Popen.returncode + # attribute is still None, and the pid has been reassigned + # (recycled) to a new different process. This race condition can + # happens in two cases. + # + # Case 1. Thread A calls Popen.poll(), thread B calls + # Popen.send_signal(). In thread A, waitpid() succeed and returns + # the exit status. Thread B calls kill() because poll() in thread A + # did not set returncode yet. Calling poll() in thread B prevents + # the race condition thanks to Popen._waitpid_lock. + # + # Case 2. waitpid(pid, 0) has been called directly, without + # using Popen methods: returncode is still None is this case. + # Calling Popen.poll() will set returncode to a default value, + # since waitpid() fails with ProcessLookupError. + self.poll() + if self.returncode is not None: + # Skip signalling a process that we know has already died. + return + + # The race condition can still happen if the race condition + # described above happens between the returncode test + # and the kill() call. + os.kill(self.pid, sig) def terminate(self): """Terminate the process with SIGTERM diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 2073fd146177a..f1fb93455dd7d 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -3120,6 +3120,31 @@ def test_stopped(self): self.assertEqual(returncode, -3) + def test_send_signal_race(self): + # bpo-38630: send_signal() must poll the process exit status to reduce + # the risk of sending the signal to the wrong process. + proc = subprocess.Popen(ZERO_RETURN_CMD) + + # wait until the process completes without using the Popen APIs. + pid, status = os.waitpid(proc.pid, 0) + self.assertEqual(pid, proc.pid) + self.assertTrue(os.WIFEXITED(status), status) + self.assertEqual(os.WEXITSTATUS(status), 0) + + # returncode is still None but the process completed. + self.assertIsNone(proc.returncode) + + with mock.patch("os.kill") as mock_kill: + proc.send_signal(signal.SIGTERM) + + # send_signal() didn't call os.kill() since the process already + # completed. + mock_kill.assert_not_called() + + # Don't check the returncode value: the test reads the exit status, + # so Popen failed to read it and uses a default returncode instead. + self.assertIsNotNone(proc.returncode) + @unittest.skipUnless(mswindows, "Windows specific tests") class Win32ProcessTestCase(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst b/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst new file mode 100644 index 0000000000000..1a4d59205ab18 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst @@ -0,0 +1,5 @@ +On Unix, :meth:`subprocess.Popen.send_signal` now polls the process status. +Polling reduces the risk of sending a signal to the wrong process if the +process completed, the :attr:`subprocess.Popen.returncode` attribute is still +``None``, and the pid has been reassigned (recycled) to a new different +process. From webhook-mailer at python.org Wed Jan 15 11:48:48 2020 From: webhook-mailer at python.org (Zachary Ware) Date: Wed, 15 Jan 2020 16:48:48 -0000 Subject: [Python-checkins] Fix compiler warning on Windows (GH-18012) Message-ID: https://github.com/python/cpython/commit/e92d39303feb1d3b4194c6a8275b1fc63b2153b2 commit: e92d39303feb1d3b4194c6a8275b1fc63b2153b2 branch: master author: Ammar Askar committer: Zachary Ware date: 2020-01-15T10:48:40-06:00 summary: Fix compiler warning on Windows (GH-18012) Python-ast.h contains a macro named Yield that conflicts with the Yield macro in Windows system headers. While Python-ast.h has an "undef Yield" directive to prevent this, it means that Python-ast.h must be included before Windows header files or we run into a re-declaration warning. In commit c96be811fa7d an include for pycore_pystate.h was added which indirectly includes Windows header files. In this commit we re-order the includes to fix this warning. files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index 3138a3f50dd1c..1d16e69a08556 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -23,8 +23,8 @@ #include "Python.h" -#include "Python-ast.h" #include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ +#include "Python-ast.h" #include "ast.h" #include "code.h" #include "symtable.h" From webhook-mailer at python.org Wed Jan 15 12:07:16 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 Jan 2020 17:07:16 -0000 Subject: [Python-checkins] Fix compiler warning on Windows (GH-18012) Message-ID: https://github.com/python/cpython/commit/92135775ce12fd71f0878c0a8a0652c197fcc60b commit: 92135775ce12fd71f0878c0a8a0652c197fcc60b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-15T09:07:09-08:00 summary: Fix compiler warning on Windows (GH-18012) Python-ast.h contains a macro named Yield that conflicts with the Yield macro in Windows system headers. While Python-ast.h has an "undef Yield" directive to prevent this, it means that Python-ast.h must be included before Windows header files or we run into a re-declaration warning. In commit c96be811fa7d an include for pycore_pystate.h was added which indirectly includes Windows header files. In this commit we re-order the includes to fix this warning. (cherry picked from commit e92d39303feb1d3b4194c6a8275b1fc63b2153b2) Co-authored-by: Ammar Askar files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index f09e99fd4a43d..11974c3509a32 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -23,8 +23,8 @@ #include "Python.h" -#include "Python-ast.h" #include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ +#include "Python-ast.h" #include "ast.h" #include "code.h" #include "symtable.h" From webhook-mailer at python.org Wed Jan 15 15:12:49 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 Jan 2020 20:12:49 -0000 Subject: [Python-checkins] Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) Message-ID: https://github.com/python/cpython/commit/dc0284ee8f7a270b6005467f26d8e5773d76e959 commit: dc0284ee8f7a270b6005467f26d8e5773d76e959 branch: master author: Antoine <43954001+awecx at users.noreply.github.com> committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-15T12:12:41-08:00 summary: Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) Since 3.7 `successful` raises a `ValueError` as explained in the next text block from the documentation: _Changed in version 3.7: If the result is not ready, ValueError is raised instead of AssertionError._ No issue associated with this PR. Should be backported in 3.7 and 3.8. files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 3c7b5cc126209..492f94c30017f 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2279,7 +2279,7 @@ with the :class:`Pool` class. .. method:: successful() Return whether the call completed without raising an exception. Will - raise :exc:`AssertionError` if the result is not ready. + raise :exc:`ValueError` if the result is not ready. .. versionchanged:: 3.7 If the result is not ready, :exc:`ValueError` is raised instead of From webhook-mailer at python.org Wed Jan 15 15:19:28 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 Jan 2020 20:19:28 -0000 Subject: [Python-checkins] [3.8] Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) (GH-18015) Message-ID: https://github.com/python/cpython/commit/54abd28b2c4fab37f38e9d6c5e4120c9428a759e commit: 54abd28b2c4fab37f38e9d6c5e4120c9428a759e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-15T12:19:21-08:00 summary: [3.8] Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) (GH-18015) Since 3.7 `successful` raises a `ValueError` as explained in the next text block from the documentation: _Changed in version 3.7: If the result is not ready, ValueError is raised instead of AssertionError._ No issue associated with this PR. Should be backported in 3.7 and 3.8. (cherry picked from commit dc0284ee8f7a270b6005467f26d8e5773d76e959) Co-authored-by: Antoine <43954001+awecx at users.noreply.github.com> Automerge-Triggered-By: @pitrou files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 3c7b5cc126209..492f94c30017f 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2279,7 +2279,7 @@ with the :class:`Pool` class. .. method:: successful() Return whether the call completed without raising an exception. Will - raise :exc:`AssertionError` if the result is not ready. + raise :exc:`ValueError` if the result is not ready. .. versionchanged:: 3.7 If the result is not ready, :exc:`ValueError` is raised instead of From webhook-mailer at python.org Wed Jan 15 15:19:43 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 Jan 2020 20:19:43 -0000 Subject: [Python-checkins] [3.7] Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) (GH-18016) Message-ID: https://github.com/python/cpython/commit/74b95b6b320a739b75776c275d70deaa6330f5c1 commit: 74b95b6b320a739b75776c275d70deaa6330f5c1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-15T12:19:39-08:00 summary: [3.7] Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) (GH-18016) Since 3.7 `successful` raises a `ValueError` as explained in the next text block from the documentation: _Changed in version 3.7: If the result is not ready, ValueError is raised instead of AssertionError._ No issue associated with this PR. Should be backported in 3.7 and 3.8. (cherry picked from commit dc0284ee8f7a270b6005467f26d8e5773d76e959) Co-authored-by: Antoine <43954001+awecx at users.noreply.github.com> Automerge-Triggered-By: @pitrou files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 9bed380117edd..6fd509a00caf7 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2252,7 +2252,7 @@ with the :class:`Pool` class. .. method:: successful() Return whether the call completed without raising an exception. Will - raise :exc:`AssertionError` if the result is not ready. + raise :exc:`ValueError` if the result is not ready. The following example demonstrates the use of a pool:: From webhook-mailer at python.org Wed Jan 15 17:52:01 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 Jan 2020 22:52:01 -0000 Subject: [Python-checkins] bpo-37958: Adding get_profile_dict to pstats (GH-15495) Message-ID: https://github.com/python/cpython/commit/01602ae40321ecdb375ee6d44eaeac3255857879 commit: 01602ae40321ecdb375ee6d44eaeac3255857879 branch: master author: Daniel Olshansky committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-15T14:51:54-08:00 summary: bpo-37958: Adding get_profile_dict to pstats (GH-15495) pstats is really useful or profiling and printing the output of the execution of some block of code, but I've found on multiple occasions when I'd like to access this output directly in an easily usable dictionary on which I can further analyze or manipulate. The proposal is to add a function called get_profile_dict inside of pstats that'll automatically return this data the data in an easily accessible dict. The output of the following script: ``` import cProfile, pstats import pprint from pstats import func_std_string, f8 def fib(n): if n == 0: return 0 if n == 1: return 1 return fib(n-1) + fib(n-2) pr = cProfile.Profile() pr.enable() fib(5) pr.create_stats() ps = pstats.Stats(pr).sort_stats('tottime', 'cumtime') def get_profile_dict(self, keys_filter=None): """ Returns a dict where the key is a function name and the value is a dict with the following keys: - ncalls - tottime - percall_tottime - cumtime - percall_cumtime - file_name - line_number keys_filter can be optionally set to limit the key-value pairs in the retrieved dict. """ pstats_dict = {} func_list = self.fcn_list[:] if self.fcn_list else list(self.stats.keys()) if not func_list: return pstats_dict pstats_dict["total_tt"] = float(f8(self.total_tt)) for func in func_list: cc, nc, tt, ct, callers = self.stats[func] file, line, func_name = func ncalls = str(nc) if nc == cc else (str(nc) + '/' + str(cc)) tottime = float(f8(tt)) percall_tottime = -1 if nc == 0 else float(f8(tt/nc)) cumtime = float(f8(ct)) percall_cumtime = -1 if cc == 0 else float(f8(ct/cc)) func_dict = { "ncalls": ncalls, "tottime": tottime, # time spent in this function alone "percall_tottime": percall_tottime, "cumtime": cumtime, # time spent in the function plus all functions that this function called, "percall_cumtime": percall_cumtime, "file_name": file, "line_number": line } func_dict_filtered = func_dict if not keys_filter else { key: func_dict[key] for key in keys_filter } pstats_dict[func_name] = func_dict_filtered return pstats_dict pp = pprint.PrettyPrinter(depth=6) pp.pprint(get_profile_dict(ps)) ``` will produce: ``` {"": {'cumtime': 0.0, 'file_name': '~', 'line_number': 0, 'ncalls': '1', 'percall_cumtime': 0.0, 'percall_tottime': 0.0, 'tottime': 0.0}, 'create_stats': {'cumtime': 0.0, 'file_name': '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/cProfile.py', 'line_number': 50, 'ncalls': '1', 'percall_cumtime': 0.0, 'percall_tottime': 0.0, 'tottime': 0.0}, 'fib': {'cumtime': 0.0, 'file_name': 'get_profile_dict.py', 'line_number': 5, 'ncalls': '15/1', 'percall_cumtime': 0.0, 'percall_tottime': 0.0, 'tottime': 0.0}, 'total_tt': 0.0} ``` As an example, this can be used to generate a stacked column chart using various visualization tools which will assist in easily identifying program bottlenecks. https://bugs.python.org/issue37958 Automerge-Triggered-By: @gpshead files: A Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst M Doc/library/profile.rst M Lib/pstats.py M Lib/test/test_pstats.py diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 8d589d247b774..34525a96f55c4 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -525,6 +525,17 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. ordering are identical to the :meth:`~pstats.Stats.print_callers` method. + .. method:: get_stats_profile() + + This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + instance holds information related to the function's profile such as how + long the function took to run, how many times it was called, etc... + + .. versionadded:: 3.9 + Added the following dataclasses: StatsProfile, FunctionProfile. + Added the following function: get_stats_profile. + .. _deterministic-profiling: What Is Deterministic Profiling? diff --git a/Lib/pstats.py b/Lib/pstats.py index 4b419a8ecdb6c..e781b91c6052c 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -25,11 +25,13 @@ import time import marshal import re + from enum import Enum from functools import cmp_to_key +from dataclasses import dataclass +from typing import Dict -__all__ = ["Stats", "SortKey"] - +__all__ = ["Stats", "SortKey", "FunctionProfile", "StatsProfile"] class SortKey(str, Enum): CALLS = 'calls', 'ncalls' @@ -52,6 +54,22 @@ def __new__(cls, *values): return obj + at dataclass(unsafe_hash=True) +class FunctionProfile: + ncalls: int + tottime: float + percall_tottime: float + cumtime: float + percall_cumtime: float + file_name: str + line_number: int + + at dataclass(unsafe_hash=True) +class StatsProfile: + '''Class for keeping track of an item in inventory.''' + total_tt: float + func_profiles: Dict[str, FunctionProfile] + class Stats: """This class is used for creating reports from data generated by the Profile class. It is a "friend" of that class, and imports data either @@ -333,6 +351,41 @@ def eval_print_amount(self, sel, list, msg): return new_list, msg + def get_stats_profile(self): + """This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + instance holds information related to the function's profile such as how + long the function took to run, how many times it was called, etc... + """ + func_list = self.fcn_list[:] if self.fcn_list else list(self.stats.keys()) + if not func_list: + return StatsProfile(0, {}) + + total_tt = float(f8(self.total_tt)) + func_profiles = {} + stats_profile = StatsProfile(total_tt, func_profiles) + + for func in func_list: + cc, nc, tt, ct, callers = self.stats[func] + file_name, line_number, func_name = func + ncalls = str(nc) if nc == cc else (str(nc) + '/' + str(cc)) + tottime = float(f8(tt)) + percall_tottime = -1 if nc == 0 else float(f8(tt/nc)) + cumtime = float(f8(ct)) + percall_cumtime = -1 if cc == 0 else float(f8(ct/cc)) + func_profile = FunctionProfile( + ncalls, + tottime, # time spent in this function alone + percall_tottime, + cumtime, # time spent in the function plus all functions that this function called, + percall_cumtime, + file_name, + line_number + ) + func_profiles[func_name] = func_profile + + return stats_profile + def get_print_list(self, sel_list): width = self.max_name_len if self.fcn_list: diff --git a/Lib/test/test_pstats.py b/Lib/test/test_pstats.py index f835ce309a60e..f3a6e586c3bcc 100644 --- a/Lib/test/test_pstats.py +++ b/Lib/test/test_pstats.py @@ -1,10 +1,12 @@ import unittest + from test import support from io import StringIO -import pstats from pstats import SortKey - +import pstats +import time +import cProfile class AddCallersTestCase(unittest.TestCase): """Tests for pstats.add_callers helper.""" @@ -75,6 +77,24 @@ def test_sort_starts_mix(self): SortKey.TIME, 'calls') + def test_get_stats_profile(self): + def pass1(): pass + def pass2(): pass + def pass3(): pass + + pr = cProfile.Profile() + pr.enable() + pass1() + pass2() + pass3() + pr.create_stats() + ps = pstats.Stats(pr) + + stats_profile = ps.get_stats_profile() + funcs_called = set(stats_profile.func_profiles.keys()) + self.assertIn('pass1', funcs_called) + self.assertIn('pass2', funcs_called) + self.assertIn('pass3', funcs_called) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst b/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst new file mode 100644 index 0000000000000..d0b4d6adca4b9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst @@ -0,0 +1,2 @@ +Added the pstats.Stats.get_profile_dict() method to return the profile +data as a StatsProfile instance. From webhook-mailer at python.org Wed Jan 15 18:55:19 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 15 Jan 2020 23:55:19 -0000 Subject: [Python-checkins] bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) Message-ID: https://github.com/python/cpython/commit/fad8b5674c66d9e00bb788e30adddb0c256c787b commit: fad8b5674c66d9e00bb788e30adddb0c256c787b branch: master author: Oz N Tiram committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-15T15:55:13-08:00 summary: bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) The previous double colon was wrongly place directly after Therefore. Which produced a block without syntax highlighting. This fixes it by separating the double colon from the text. As a result, sphinx now properly highlights the python code. https://bugs.python.org/issue39348 files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 2d7ca33f2927d..2cc946c519d40 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -565,7 +565,9 @@ The following functions all create :ref:`socket objects `. When :const:`SOCK_NONBLOCK` or :const:`SOCK_CLOEXEC` bit flags are applied to *type* they are cleared, and :attr:`socket.type` will not reflect them. They are still passed - to the underlying system `socket()` call. Therefore:: + to the underlying system `socket()` call. Therefore, + + :: sock = socket.socket( socket.AF_INET, From webhook-mailer at python.org Wed Jan 15 19:00:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 16 Jan 2020 00:00:40 -0000 Subject: [Python-checkins] bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) Message-ID: https://github.com/python/cpython/commit/970188c2d792133e2273924a987e0542659a676f commit: 970188c2d792133e2273924a987e0542659a676f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-15T16:00:32-08:00 summary: bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) The previous double colon was wrongly place directly after Therefore. Which produced a block without syntax highlighting. This fixes it by separating the double colon from the text. As a result, sphinx now properly highlights the python code. https://bugs.python.org/issue39348 (cherry picked from commit fad8b5674c66d9e00bb788e30adddb0c256c787b) Co-authored-by: Oz N Tiram files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 178d7da2e5f09..7e8075ebf36b8 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -529,7 +529,9 @@ The following functions all create :ref:`socket objects `. When :const:`SOCK_NONBLOCK` or :const:`SOCK_CLOEXEC` bit flags are applied to *type* they are cleared, and :attr:`socket.type` will not reflect them. They are still passed - to the underlying system `socket()` call. Therefore:: + to the underlying system `socket()` call. Therefore, + + :: sock = socket.socket( socket.AF_INET, From webhook-mailer at python.org Wed Jan 15 19:01:29 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 16 Jan 2020 00:01:29 -0000 Subject: [Python-checkins] bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) Message-ID: https://github.com/python/cpython/commit/19bd3a18626b504dc92abb44019cad600c7ef221 commit: 19bd3a18626b504dc92abb44019cad600c7ef221 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-15T16:01:21-08:00 summary: bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) The previous double colon was wrongly place directly after Therefore. Which produced a block without syntax highlighting. This fixes it by separating the double colon from the text. As a result, sphinx now properly highlights the python code. https://bugs.python.org/issue39348 (cherry picked from commit fad8b5674c66d9e00bb788e30adddb0c256c787b) Co-authored-by: Oz N Tiram files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index ae82e43e00ff0..c72f22b5f6699 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -548,7 +548,9 @@ The following functions all create :ref:`socket objects `. When :const:`SOCK_NONBLOCK` or :const:`SOCK_CLOEXEC` bit flags are applied to *type* they are cleared, and :attr:`socket.type` will not reflect them. They are still passed - to the underlying system `socket()` call. Therefore:: + to the underlying system `socket()` call. Therefore, + + :: sock = socket.socket( socket.AF_INET, From webhook-mailer at python.org Thu Jan 16 04:24:21 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 Jan 2020 09:24:21 -0000 Subject: [Python-checkins] bpo-39351: Remove base64.encodestring() (GH-18022) Message-ID: https://github.com/python/cpython/commit/210c19e3c5b86535a73487fa737752de8eb1d866 commit: 210c19e3c5b86535a73487fa737752de8eb1d866 branch: master author: Victor Stinner committer: GitHub date: 2020-01-16T10:24:16+01:00 summary: bpo-39351: Remove base64.encodestring() (GH-18022) Remove base64.encodestring() and base64.decodestring(), aliases deprecated since Python 3.1: use base64.encodebytes() and base64.decodebytes() instead. files: A Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst M Doc/library/base64.rst M Doc/whatsnew/3.9.rst M Lib/base64.py M Lib/test/test_base64.py diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index ad9f5f58bee2a..1ff22a00d6199 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -235,12 +235,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: decodestring(s) - - Deprecated alias of :func:`decodebytes`. - - .. deprecated:: 3.1 - .. function:: encode(input, output) @@ -261,12 +255,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: encodestring(s) - - Deprecated alias of :func:`encodebytes`. - - .. deprecated:: 3.1 - An example usage of the module: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 451902ab1dbd5..47e8a37e56c32 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -411,6 +411,11 @@ Removed of :pep:`442`. Patch by Joannah Nanjekye. (Contributed by Joannah Nanjekye in :issue:`15088`) +* ``base64.encodestring()`` and ``base64.decodestring()``, aliases deprecated + since Python 3.1, have been removed: use :func:`base64.encodebytes` and + :func:`base64.decodebytes` instead. + (Contributed by Victor Stinner in :issue:`39351`.) + Porting to Python 3.9 ===================== diff --git a/Lib/base64.py b/Lib/base64.py index 2e70223dfe782..a28109f8a7f9c 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -531,28 +531,12 @@ def encodebytes(s): pieces.append(binascii.b2a_base64(chunk)) return b"".join(pieces) -def encodestring(s): - """Legacy alias of encodebytes().""" - import warnings - warnings.warn("encodestring() is a deprecated alias since 3.1, " - "use encodebytes()", - DeprecationWarning, 2) - return encodebytes(s) - def decodebytes(s): """Decode a bytestring of base-64 data into a bytes object.""" _input_type_check(s) return binascii.a2b_base64(s) -def decodestring(s): - """Legacy alias of decodebytes().""" - import warnings - warnings.warn("decodestring() is a deprecated alias since Python 3.1, " - "use decodebytes()", - DeprecationWarning, 2) - return decodebytes(s) - # Usable as a script... def main(): diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 7dba6635d4eae..1dbeac41dc0dd 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -18,14 +18,6 @@ def check_type_errors(self, f): int_data = memoryview(b"1234").cast('I') self.assertRaises(TypeError, f, int_data) - def test_encodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.encodestring(b"www.python.org") - - def test_decodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.decodestring(b"d3d3LnB5dGhvbi5vcmc=\n") - def test_encodebytes(self): eq = self.assertEqual eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n") diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst new file mode 100644 index 0000000000000..b89bec97bfa4f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst @@ -0,0 +1,3 @@ +Remove ``base64.encodestring()`` and ``base64.decodestring()``, aliases +deprecated since Python 3.1: use :func:`base64.encodebytes` and +:func:`base64.decodebytes` instead. From webhook-mailer at python.org Thu Jan 16 05:02:59 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 Jan 2020 10:02:59 -0000 Subject: [Python-checkins] bpo-39350: Remove deprecated fractions.gcd() (GH-18021) Message-ID: https://github.com/python/cpython/commit/4691a2f2a2b8174a6c958ce6976ed5f3354c9504 commit: 4691a2f2a2b8174a6c958ce6976ed5f3354c9504 branch: master author: Victor Stinner committer: GitHub date: 2020-01-16T11:02:51+01:00 summary: bpo-39350: Remove deprecated fractions.gcd() (GH-18021) Remove fractions.gcd() function, deprecated since Python 3.5 (bpo-22486): use math.gcd() instead. files: A Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst M Doc/library/fractions.rst M Doc/whatsnew/3.9.rst M Lib/fractions.py M Lib/test/test_fractions.py diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 58e7126b0bf21..d3a42762e3ff8 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -172,18 +172,6 @@ another rational number, or from a string. method can also be accessed through the :func:`round` function. -.. function:: gcd(a, b) - - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the absolute value of ``gcd(a, b)`` is the - largest integer that divides both *a* and *b*. ``gcd(a,b)`` has the same - sign as *b* if *b* is nonzero; otherwise it takes the sign of *a*. ``gcd(0, - 0)`` returns ``0``. - - .. deprecated:: 3.5 - Use :func:`math.gcd` instead. - - .. seealso:: Module :mod:`numbers` diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 47e8a37e56c32..8ca755645d66f 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -416,6 +416,10 @@ Removed :func:`base64.decodebytes` instead. (Contributed by Victor Stinner in :issue:`39351`.) +* ``fractions.gcd()`` function has been removed, it was deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. + (Contributed by Victor Stinner in :issue:`39350`.) + Porting to Python 3.9 ===================== diff --git a/Lib/fractions.py b/Lib/fractions.py index 2e7047a81844d..501f4b74a0b7a 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -10,31 +10,9 @@ import re import sys -__all__ = ['Fraction', 'gcd'] +__all__ = ['Fraction'] - -def gcd(a, b): - """Calculate the Greatest Common Divisor of a and b. - - Unless b==0, the result will have the same sign as b (so that when - b is divided by it, the result comes out positive). - """ - import warnings - warnings.warn('fractions.gcd() is deprecated. Use math.gcd() instead.', - DeprecationWarning, 2) - if type(a) is int is type(b): - if (b or a) < 0: - return -math.gcd(a, b) - return math.gcd(a, b) - return _gcd(a, b) - -def _gcd(a, b): - # Supports non-integers for backward compatibility. - while b: - a, b = b, a%b - return a - # Constants related to the hash implementation; hash(x) is based # on the reduction of x modulo the prime _PyHASH_MODULUS. _PyHASH_MODULUS = sys.hash_info.modulus diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 18ab28cfebe0c..7cf7899932b34 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -12,7 +12,7 @@ from copy import copy, deepcopy from pickle import dumps, loads F = fractions.Fraction -gcd = fractions.gcd + class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" @@ -81,30 +81,6 @@ def __float__(self): class DummyFraction(fractions.Fraction): """Dummy Fraction subclass for copy and deepcopy testing.""" -class GcdTest(unittest.TestCase): - - def testMisc(self): - # fractions.gcd() is deprecated - with self.assertWarnsRegex(DeprecationWarning, r'fractions\.gcd'): - gcd(1, 1) - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', r'fractions\.gcd', - DeprecationWarning) - self.assertEqual(0, gcd(0, 0)) - self.assertEqual(1, gcd(1, 0)) - self.assertEqual(-1, gcd(-1, 0)) - self.assertEqual(1, gcd(0, 1)) - self.assertEqual(-1, gcd(0, -1)) - self.assertEqual(1, gcd(7, 1)) - self.assertEqual(-1, gcd(7, -1)) - self.assertEqual(1, gcd(-23, 15)) - self.assertEqual(12, gcd(120, 84)) - self.assertEqual(-12, gcd(84, -120)) - self.assertEqual(gcd(120.0, 84), 12.0) - self.assertEqual(gcd(120, 84.0), 12.0) - self.assertEqual(gcd(F(120), F(84)), F(12)) - self.assertEqual(gcd(F(120, 77), F(84, 55)), F(12, 385)) - def _components(r): return (r.numerator, r.denominator) @@ -690,5 +666,6 @@ def test_slots(self): r = F(13, 7) self.assertRaises(AttributeError, setattr, r, 'a', 10) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst new file mode 100644 index 0000000000000..264e52fdc518b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst @@ -0,0 +1,2 @@ +Remove ``fractions.gcd()`` function, deprecated since Python 3.5 +(:issue:`22486`): use :func:`math.gcd` instead. From webhook-mailer at python.org Thu Jan 16 09:09:25 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 Jan 2020 14:09:25 -0000 Subject: [Python-checkins] bpo-31031: Unify duplicate bits_in_digit and bit_length (GH-2866) Message-ID: https://github.com/python/cpython/commit/c5b79003f5fe6aa28a2a028680367839ba8677db commit: c5b79003f5fe6aa28a2a028680367839ba8677db branch: master author: Niklas Fiekas committer: Victor Stinner date: 2020-01-16T15:09:19+01:00 summary: bpo-31031: Unify duplicate bits_in_digit and bit_length (GH-2866) Add _Py_bit_length() to unify duplicate bits_in_digit() and bit_length(). files: M Include/pymath.h M Modules/mathmodule.c M Objects/longobject.c M Python/pymath.c diff --git a/Include/pymath.h b/Include/pymath.h index f869724334a4c..63ca972784e31 100644 --- a/Include/pymath.h +++ b/Include/pymath.h @@ -227,4 +227,12 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); * behavior. */ #define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) +/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. + * Equivalent to floor(log2(x))+1. Also equivalent to: bitwidth_of_type - + * count_leading_zero_bits(x) + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(unsigned int) _Py_bit_length(unsigned long d); +#endif + #endif /* Py_PYMATH_H */ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 5e8e485afd41b..81d871786f139 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1441,28 +1441,6 @@ math_fsum(PyObject *module, PyObject *seq) #undef NUM_PARTIALS -/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. - * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type - - * count_leading_zero_bits(x) - */ - -/* XXX: This routine does more or less the same thing as - * bits_in_digit() in Objects/longobject.c. Someday it would be nice to - * consolidate them. On BSD, there's a library function called fls() - * that we could use, and GCC provides __builtin_clz(). - */ - -static unsigned long -bit_length(unsigned long n) -{ - unsigned long len = 0; - while (n != 0) { - ++len; - n >>= 1; - } - return len; -} - static unsigned long count_set_bits(unsigned long n) { @@ -1877,7 +1855,7 @@ factorial_partial_product(unsigned long start, unsigned long stop, /* find midpoint of range(start, stop), rounded up to next odd number. */ midpoint = (start + num_operands) | 1; left = factorial_partial_product(start, midpoint, - bit_length(midpoint - 2)); + _Py_bit_length(midpoint - 2)); if (left == NULL) goto error; right = factorial_partial_product(midpoint, stop, max_bits); @@ -1907,7 +1885,7 @@ factorial_odd_part(unsigned long n) Py_INCREF(outer); upper = 3; - for (i = bit_length(n) - 2; i >= 0; i--) { + for (i = _Py_bit_length(n) - 2; i >= 0; i--) { v = n >> i; if (v <= 2) continue; @@ -1917,7 +1895,7 @@ factorial_odd_part(unsigned long n) /* Here inner is the product of all odd integers j in the range (0, n/2**(i+1)]. The factorial_partial_product call below gives the product of all odd integers j in the range (n/2**(i+1), n/2**i]. */ - partial = factorial_partial_product(lower, upper, bit_length(upper-2)); + partial = factorial_partial_product(lower, upper, _Py_bit_length(upper-2)); /* inner *= partial */ if (partial == NULL) goto error; diff --git a/Objects/longobject.c b/Objects/longobject.c index be9301f85162c..b672ae4201891 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -803,26 +803,6 @@ _PyLong_Sign(PyObject *vv) return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1); } -/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d < - 2**k if d is nonzero, else 0. */ - -static const unsigned char BitLengthTable[32] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 -}; - -static int -bits_in_digit(digit d) -{ - int d_bits = 0; - while (d >= 32) { - d_bits += 6; - d >>= 6; - } - d_bits += (int)BitLengthTable[d]; - return d_bits; -} - size_t _PyLong_NumBits(PyObject *vv) { @@ -840,7 +820,7 @@ _PyLong_NumBits(PyObject *vv) if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT) goto Overflow; result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (SIZE_MAX - msd_bits < result) goto Overflow; result += msd_bits; @@ -1950,7 +1930,7 @@ long_format_binary(PyObject *aa, int base, int alternate, return -1; } size_a_in_bits = (size_a - 1) * PyLong_SHIFT + - bits_in_digit(a->ob_digit[size_a - 1]); + _Py_bit_length(a->ob_digit[size_a - 1]); /* Allow 1 character for a '-' sign. */ sz = negative + (size_a_in_bits + (bits - 1)) / bits; } @@ -2770,7 +2750,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem) /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2. shift v1 left by the same amount. Results go into w and v. */ - d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]); + d = PyLong_SHIFT - _Py_bit_length(w1->ob_digit[size_w-1]); carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d); assert(carry == 0); carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d); @@ -2891,7 +2871,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) *e = 0; return 0.0; } - a_bits = bits_in_digit(a->ob_digit[a_size-1]); + a_bits = _Py_bit_length(a->ob_digit[a_size-1]); /* The following is an overflow-free version of the check "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */ if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 && @@ -3986,8 +3966,8 @@ long_true_divide(PyObject *v, PyObject *w) /* Extreme underflow */ goto underflow_or_zero; /* Next line is now safe from overflowing a Py_ssize_t */ - diff = diff * PyLong_SHIFT + bits_in_digit(a->ob_digit[a_size - 1]) - - bits_in_digit(b->ob_digit[b_size - 1]); + diff = diff * PyLong_SHIFT + _Py_bit_length(a->ob_digit[a_size - 1]) - + _Py_bit_length(b->ob_digit[b_size - 1]); /* Now diff = a_bits - b_bits. */ if (diff > DBL_MAX_EXP) goto overflow; @@ -4063,7 +4043,7 @@ long_true_divide(PyObject *v, PyObject *w) } x_size = Py_ABS(Py_SIZE(x)); assert(x_size > 0); /* result of division is never zero */ - x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]); + x_bits = (x_size-1)*PyLong_SHIFT+_Py_bit_length(x->ob_digit[x_size-1]); /* The number of extra bits that have to be rounded away. */ extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG; @@ -4877,7 +4857,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) alloc_b = Py_SIZE(b); /* reduce until a fits into 2 digits */ while ((size_a = Py_SIZE(a)) > 2) { - nbits = bits_in_digit(a->ob_digit[size_a-1]); + nbits = _Py_bit_length(a->ob_digit[size_a-1]); /* extract top 2*PyLong_SHIFT bits of a into x, along with corresponding bits of b into y */ size_b = Py_SIZE(b); @@ -5395,7 +5375,7 @@ int_bit_length_impl(PyObject *self) return PyLong_FromLong(0); msd = ((PyLongObject *)self)->ob_digit[ndigits-1]; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT) return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits); diff --git a/Python/pymath.c b/Python/pymath.c index 24b804223eef1..a08a0e796156f 100644 --- a/Python/pymath.c +++ b/Python/pymath.c @@ -79,3 +79,18 @@ round(double x) return copysign(y, x); } #endif /* HAVE_ROUND */ + +static const unsigned int BitLengthTable[32] = { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +unsigned int _Py_bit_length(unsigned long d) { + unsigned int d_bits = 0; + while (d >= 32) { + d_bits += 6; + d >>= 6; + } + d_bits += BitLengthTable[d]; + return d_bits; +} From webhook-mailer at python.org Thu Jan 16 09:33:35 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 16 Jan 2020 14:33:35 -0000 Subject: [Python-checkins] bpo-39357: Remove buffering parameter of bz2.BZ2File (GH-18028) Message-ID: https://github.com/python/cpython/commit/9baf242fc733ab8a52a0b6201d95c6fdb8251745 commit: 9baf242fc733ab8a52a0b6201d95c6fdb8251745 branch: master author: Victor Stinner committer: GitHub date: 2020-01-16T15:33:30+01:00 summary: bpo-39357: Remove buffering parameter of bz2.BZ2File (GH-18028) Remove the buffering parameter of bz2.BZ2File. Since Python 3.0, it was ignored and using it was emitting a DeprecationWarning. Pass an open file object to control how the file is opened. The compresslevel parameter becomes keyword-only. files: A Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst M Doc/library/bz2.rst M Doc/whatsnew/3.9.rst M Lib/bz2.py M Lib/test/test_bz2.py diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index aa836af2b257f..85cdc16a7d78d 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -65,7 +65,7 @@ All of the classes in this module may safely be accessed from multiple threads. Accepts a :term:`path-like object`. -.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9) +.. class:: BZ2File(filename, mode='r', *, compresslevel=9) Open a bzip2-compressed file in binary mode. @@ -81,8 +81,6 @@ All of the classes in this module may safely be accessed from multiple threads. If *filename* is a file object (rather than an actual file name), a mode of ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``. - The *buffering* argument is ignored. Its use is deprecated since Python 3.0. - If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between ``1`` and ``9`` specifying the level of compression: ``1`` produces the least compression, and ``9`` (default) produces the most compression. @@ -110,9 +108,6 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionadded:: 3.3 - .. deprecated:: 3.0 - The keyword argument *buffering* was deprecated and is now ignored. - .. versionchanged:: 3.1 Support for the :keyword:`with` statement was added. @@ -138,6 +133,13 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.9 + The *buffering* parameter has been removed. It was ignored and deprecated + since Python 3.0. Pass an open file object to control how the file is + opened. + + The *compresslevel* parameter became keyword-only. + Incremental (de)compression --------------------------- diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 8ca755645d66f..f40685c932793 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -420,6 +420,12 @@ Removed 3.5 (:issue:`22486`): use :func:`math.gcd` instead. (Contributed by Victor Stinner in :issue:`39350`.) +* The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since + Python 3.0, it was ignored and using it was emitting + :exc:`DeprecationWarning`. Pass an open file object to control how the file + is opened. + (Contributed by Victor Stinner in :issue:`39357`.) + Porting to Python 3.9 ===================== @@ -451,6 +457,10 @@ Changes in the Python API :data:`~errno.EBADF` error. (Contributed by Victor Stinner in :issue:`39239`.) +* The *compresslevel* parameter of :class:`bz2.BZ2File` became keyword-only, + since the *buffering* parameter has been removed. + (Contributed by Victor Stinner in :issue:`39357`.) + CPython bytecode changes ------------------------ diff --git a/Lib/bz2.py b/Lib/bz2.py index 21e8ff49c67b3..a499ca3598f4b 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -24,8 +24,6 @@ # Value 2 no longer used _MODE_WRITE = 3 -_sentinel = object() - class BZ2File(_compression.BaseStream): @@ -38,7 +36,7 @@ class BZ2File(_compression.BaseStream): returned as bytes, and data to be written should be given as bytes. """ - def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): + def __init__(self, filename, mode="r", *, compresslevel=9): """Open a bzip2-compressed file. If filename is a str, bytes, or PathLike object, it gives the @@ -65,12 +63,6 @@ def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): self._closefp = False self._mode = _MODE_CLOSED - if buffering is not _sentinel: - warnings.warn("Use of 'buffering' argument is deprecated and ignored " - "since Python 3.0.", - DeprecationWarning, - stacklevel=2) - if not (1 <= compresslevel <= 9): raise ValueError("compresslevel must be between 1 and 9") diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index eb2f72ee4a5d3..030d564fc59e6 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -100,6 +100,9 @@ def testBadArgs(self): self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=0) self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=10) + # compresslevel is keyword-only + self.assertRaises(TypeError, BZ2File, os.devnull, "r", 3) + def testRead(self): self.createTempFile() with BZ2File(self.filename) as bz2f: diff --git a/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst b/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst new file mode 100644 index 0000000000000..a90802c91a2ed --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst @@ -0,0 +1,4 @@ +Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, it +was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an open +file object, to control how the file is opened. The *compresslevel* parameter +becomes keyword-only. From webhook-mailer at python.org Fri Jan 17 07:50:44 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 Jan 2020 12:50:44 -0000 Subject: [Python-checkins] bpo-39357: Update bz2 docstring: remove buffering (GH-18036) Message-ID: https://github.com/python/cpython/commit/10fd6b2b9f0aeb8f5a0ce4cb4b9f21f942d39a71 commit: 10fd6b2b9f0aeb8f5a0ce4cb4b9f21f942d39a71 branch: master author: Victor Stinner committer: GitHub date: 2020-01-17T13:50:39+01:00 summary: bpo-39357: Update bz2 docstring: remove buffering (GH-18036) Thanks Karthikeyan Singaravelan for the report ;-) files: M Lib/bz2.py diff --git a/Lib/bz2.py b/Lib/bz2.py index a499ca3598f4b..e094fbb548bc9 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -47,8 +47,6 @@ def __init__(self, filename, mode="r", *, compresslevel=9): 'x' for creating exclusively, or 'a' for appending. These can equivalently be given as 'rb', 'wb', 'xb', and 'ab'. - buffering is ignored since Python 3.0. Its use is deprecated. - If mode is 'w', 'x' or 'a', compresslevel can be a number between 1 and 9 specifying the level of compression: 1 produces the least compression, and 9 (default) produces the most compression. From webhook-mailer at python.org Fri Jan 17 09:17:57 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 17 Jan 2020 14:17:57 -0000 Subject: [Python-checkins] bpo-39356, zipfile: Remove code handling DeprecationWarning (GH-18027) Message-ID: https://github.com/python/cpython/commit/1d3b0aaa54c56282c0a3e7fc396e5b1de8b1974e commit: 1d3b0aaa54c56282c0a3e7fc396e5b1de8b1974e branch: master author: Victor Stinner committer: GitHub date: 2020-01-17T15:17:48+01:00 summary: bpo-39356, zipfile: Remove code handling DeprecationWarning (GH-18027) Remove old "except DeprecationWarning:" code path added by commit bf02e3bb21b2d75cba4ce409a14ae64dbc2dd6d2. It's no longer needed. struct.pack() no longer emit DeprecationWarning if getting a float whereas an integer is expected. It now raises an hard error instead. files: M Lib/zipfile.py diff --git a/Lib/zipfile.py b/Lib/zipfile.py index e1d07f2a5237b..2da87ef505e6e 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1867,25 +1867,15 @@ def _write_end_record(self): extract_version = max(min_version, zinfo.extract_version) create_version = max(min_version, zinfo.create_version) - try: - filename, flag_bits = zinfo._encodeFilenameFlags() - centdir = struct.pack(structCentralDir, - stringCentralDir, create_version, - zinfo.create_system, extract_version, zinfo.reserved, - flag_bits, zinfo.compress_type, dostime, dosdate, - zinfo.CRC, compress_size, file_size, - len(filename), len(extra_data), len(zinfo.comment), - 0, zinfo.internal_attr, zinfo.external_attr, - header_offset) - except DeprecationWarning: - print((structCentralDir, stringCentralDir, create_version, - zinfo.create_system, extract_version, zinfo.reserved, - zinfo.flag_bits, zinfo.compress_type, dostime, dosdate, - zinfo.CRC, compress_size, file_size, - len(zinfo.filename), len(extra_data), len(zinfo.comment), - 0, zinfo.internal_attr, zinfo.external_attr, - header_offset), file=sys.stderr) - raise + filename, flag_bits = zinfo._encodeFilenameFlags() + centdir = struct.pack(structCentralDir, + stringCentralDir, create_version, + zinfo.create_system, extract_version, zinfo.reserved, + flag_bits, zinfo.compress_type, dostime, dosdate, + zinfo.CRC, compress_size, file_size, + len(filename), len(extra_data), len(zinfo.comment), + 0, zinfo.internal_attr, zinfo.external_attr, + header_offset) self.fp.write(centdir) self.fp.write(filename) self.fp.write(extra_data) From webhook-mailer at python.org Fri Jan 17 17:54:52 2020 From: webhook-mailer at python.org (Barry Warsaw) Date: Fri, 17 Jan 2020 22:54:52 -0000 Subject: [Python-checkins] Fix Lock.locked() to remove extra bold highlighting (#18042) Message-ID: https://github.com/python/cpython/commit/ef8844f1bcbea994a2a69b5a70309369d08b555c commit: ef8844f1bcbea994a2a69b5a70309369d08b555c branch: master author: Grant Jenks committer: Barry Warsaw date: 2020-01-17T14:54:44-08:00 summary: Fix Lock.locked() to remove extra bold highlighting (#18042) files: M Doc/library/threading.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 96989bdd525e0..1e90294142796 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -497,6 +497,7 @@ All methods are executed atomically. There is no return value. .. method:: locked() + Return true if the lock is acquired. From webhook-mailer at python.org Fri Jan 17 18:00:56 2020 From: webhook-mailer at python.org (Barry Warsaw) Date: Fri, 17 Jan 2020 23:00:56 -0000 Subject: [Python-checkins] Fix Lock.locked() to remove extra bold highlighting (GH-18042) (#18044) Message-ID: https://github.com/python/cpython/commit/504605576d6a79f1396c5cc633562f0ae64c70fa commit: 504605576d6a79f1396c5cc633562f0ae64c70fa branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Barry Warsaw date: 2020-01-17T15:00:47-08:00 summary: Fix Lock.locked() to remove extra bold highlighting (GH-18042) (#18044) (cherry picked from commit ef8844f1bcbea994a2a69b5a70309369d08b555c) Co-authored-by: Grant Jenks Co-authored-by: Grant Jenks files: M Doc/library/threading.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 02af94eda6cc9..6f56b220b19f7 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -419,6 +419,7 @@ All methods are executed atomically. There is no return value. .. method:: locked() + Return true if the lock is acquired. From webhook-mailer at python.org Fri Jan 17 18:02:13 2020 From: webhook-mailer at python.org (Barry Warsaw) Date: Fri, 17 Jan 2020 23:02:13 -0000 Subject: [Python-checkins] Fix Lock.locked() to remove extra bold highlighting (GH-18042) (#18043) Message-ID: https://github.com/python/cpython/commit/34ece35a0d52f0c332b2c0d55b567daa7bcad9eb commit: 34ece35a0d52f0c332b2c0d55b567daa7bcad9eb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Barry Warsaw date: 2020-01-17T15:02:06-08:00 summary: Fix Lock.locked() to remove extra bold highlighting (GH-18042) (#18043) (cherry picked from commit ef8844f1bcbea994a2a69b5a70309369d08b555c) Co-authored-by: Grant Jenks Co-authored-by: Grant Jenks files: M Doc/library/threading.rst diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 93ea4bda7cd7a..f4b58d3d3aebb 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -489,6 +489,7 @@ All methods are executed atomically. There is no return value. .. method:: locked() + Return true if the lock is acquired. From webhook-mailer at python.org Fri Jan 17 18:45:00 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 17 Jan 2020 23:45:00 -0000 Subject: [Python-checkins] Run doctests in GitHub actions Docs targer (GH-18041) Message-ID: https://github.com/python/cpython/commit/6aabb63d96845b3cb207d28d40bf0b78e171be75 commit: 6aabb63d96845b3cb207d28d40bf0b78e171be75 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-17T23:44:38Z summary: Run doctests in GitHub actions Docs targer (GH-18041) files: M .github/workflows/doc.yml diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 405b12e3d29c9..5bba8e690655f 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -23,17 +23,17 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout at v1 - - uses: actions/setup-python at v1 - with: - python-version: '3.7' - architecture: 'x64' + - name: 'Install Dependencies' + run: sudo ./.github/workflows/posix-deps-apt.sh && sudo apt-get install wamerican + - name: 'Configure CPython' + run: ./configure --with-pydebug + - name: 'Build CPython' + run: make -s -j4 - name: 'Install build dependencies' - run: python -m pip install sphinx==2.2.0 blurb python-docs-theme + run: make -C Doc/ PYTHON=../python venv - name: 'Build documentation' - run: | - cd Doc - make check suspicious html PYTHON=python - - name: Upload + run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W -j4" doctest suspicious html + - name: 'Upload' uses: actions/upload-artifact at v1 with: name: doc-html From webhook-mailer at python.org Fri Jan 17 22:15:06 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 18 Jan 2020 03:15:06 -0000 Subject: [Python-checkins] bpo-39372: Clean header files of declared interfaces with no implementations (GH-18037) Message-ID: https://github.com/python/cpython/commit/cd7db76a636c218b2d81d3526eb435cfae61f212 commit: cd7db76a636c218b2d81d3526eb435cfae61f212 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-18T03:14:59Z summary: bpo-39372: Clean header files of declared interfaces with no implementations (GH-18037) The public API symbols being removed are: _PyBytes_InsertThousandsGroupingLocale, _PyBytes_InsertThousandsGrouping, _Py_InitializeFromArgs, _Py_InitializeFromWideArgs, _PyFloat_Repr, _PyFloat_Digits, _PyFloat_DigitsInit, PyFrame_ExtendStack, _PyAIterWrapper_Type, PyNullImporter_Type, PyCmpWrapper_Type, PySortWrapper_Type, PyNoArgsFunction. files: A Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst M Include/bytesobject.h M Include/cpython/pylifecycle.h M Include/floatobject.h M Include/frameobject.h M Include/genobject.h M Include/import.h M Include/internal/pycore_pathconfig.h M Include/iterobject.h M Include/listobject.h M Include/methodobject.h M Include/pythread.h M Objects/stringlib/asciilib.h M Objects/stringlib/ucs1lib.h M Objects/stringlib/ucs2lib.h M Objects/stringlib/ucs4lib.h M Objects/stringlib/undef.h diff --git a/Include/bytesobject.h b/Include/bytesobject.h index fc9981e56d277..4aaa71a832bd7 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -106,28 +106,6 @@ PyAPI_FUNC(int) PyBytes_AsStringAndSize( strings) */ ); -/* Using the current locale, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width); - -/* Using explicit passed-in values, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - const char *thousands_sep); -#endif - /* Flags used by string formatting */ #define F_LJUST (1<<0) #define F_SIGN (1<<1) diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 2f3a0dbdfe64c..a01e9c94f12d7 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -32,14 +32,6 @@ PyAPI_FUNC(int) _Py_IsCoreInitialized(void); PyAPI_FUNC(PyStatus) Py_InitializeFromConfig( const PyConfig *config); -PyAPI_FUNC(PyStatus) _Py_InitializeFromArgs( - const PyConfig *config, - Py_ssize_t argc, - char * const *argv); -PyAPI_FUNC(PyStatus) _Py_InitializeFromWideArgs( - const PyConfig *config, - Py_ssize_t argc, - wchar_t * const *argv); PyAPI_FUNC(PyStatus) _Py_InitializeMain(void); PyAPI_FUNC(int) Py_RunMain(void); diff --git a/Include/floatobject.h b/Include/floatobject.h index f1044d64cba84..0fb9fc4e0fae7 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -88,15 +88,6 @@ PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); -/* Needed for the old way for marshal to store a floating point number. - Returns the string length copied into p, -1 on error. - */ -PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); - -/* Used to get the important decimal digits of a double */ -PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); -PyAPI_FUNC(void) _PyFloat_DigitsInit(void); - /* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool * argument, true if the string is in little-endian format (exponent * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). diff --git a/Include/frameobject.h b/Include/frameobject.h index 3bad86a66f752..ddcf1591aaea7 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -67,10 +67,6 @@ PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); -/* Extend the value stack */ - -PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); - /* Conversions between "fast locals" and locals in dictionary */ PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); diff --git a/Include/genobject.h b/Include/genobject.h index 96f8dcc74d8ce..5ee9a2831d12b 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -58,8 +58,6 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCoro_Type; PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; -PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; - #define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) PyObject *_PyCoro_GetAwaitableIter(PyObject *o); PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, diff --git a/Include/import.h b/Include/import.h index 735533ee7a79a..aeef3efd0bcee 100644 --- a/Include/import.h +++ b/Include/import.h @@ -81,8 +81,6 @@ PyAPI_FUNC(int) PyImport_ImportFrozenModule( const char *name /* UTF-8 encoded string */ ); -PyAPI_DATA(PyTypeObject) PyNullImporter_Type; - PyAPI_FUNC(int) PyImport_AppendInittab( const char *name, /* ASCII encoded string */ PyObject* (*initfunc)(void) diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index 257c056a77d0d..42d61b1ca26bd 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -47,8 +47,6 @@ PyAPI_DATA(wchar_t*) _Py_dll_path; #endif extern void _PyPathConfig_ClearGlobal(void); -extern PyStatus _PyPathConfig_SetGlobal( - const struct _PyPathConfig *pathconfig); extern PyStatus _PyPathConfig_Calculate( _PyPathConfig *pathconfig, diff --git a/Include/iterobject.h b/Include/iterobject.h index f61726f1f7f83..eec2ee271eb67 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -7,7 +7,6 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; -PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; #define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) diff --git a/Include/listobject.h b/Include/listobject.h index 6057279d51c3a..baf94152792ed 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -43,7 +43,6 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyList_Type; PyAPI_DATA(PyTypeObject) PyListIter_Type; PyAPI_DATA(PyTypeObject) PyListRevIter_Type; -PyAPI_DATA(PyTypeObject) PySortWrapper_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) diff --git a/Include/methodobject.h b/Include/methodobject.h index a15d05f89917e..d9f8d4f80c2cd 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -22,8 +22,6 @@ typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, PyObject *const *, Py_ssize_t, PyObject *); -typedef PyObject *(*PyNoArgsFunction)(PyObject *); - PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); diff --git a/Include/pythread.h b/Include/pythread.h index 569d69648994f..1cf83b7a36d14 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -3,7 +3,6 @@ #define Py_PYTHREAD_H typedef void *PyThread_type_lock; -typedef void *PyThread_type_sema; #ifdef __cplusplus extern "C" { diff --git a/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst b/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst new file mode 100644 index 0000000000000..8415d756ffa49 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst @@ -0,0 +1,8 @@ +Clean header files of interfaces defined but with no implementation. The +public API symbols being removed are: +``_PyBytes_InsertThousandsGroupingLocale``, +``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, +``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, +``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, ``_PyAIterWrapper_Type``, +``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, +``PyNoArgsFunction``. diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index d0fc18d22fa5f..e95552624aa50 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping - diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h index ce1eb57f0d7da..bc4b104f112cc 100644 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -24,7 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping - - diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h index f900cb65f8ced..86a1dff1b5637 100644 --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping - diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h index 86a480f1e3a7e..3c32a93c96a1c 100644 --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -25,5 +25,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII -#define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping - diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h index f9d3f1d3328d5..c41e254fde6f4 100644 --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -6,6 +6,5 @@ #undef STRINGLIB_STR #undef STRINGLIB_LEN #undef STRINGLIB_NEW -#undef _Py_InsertThousandsGrouping #undef STRINGLIB_IS_UNICODE From webhook-mailer at python.org Sun Jan 19 05:29:51 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 19 Jan 2020 10:29:51 -0000 Subject: [Python-checkins] Fix typo from base to based (GH-18055) Message-ID: https://github.com/python/cpython/commit/558f07891170fe5173f277d3749e92d844de0a27 commit: 558f07891170fe5173f277d3749e92d844de0a27 branch: master author: Michael Haas committer: Cheryl Sabella date: 2020-01-19T05:29:42-05:00 summary: Fix typo from base to based (GH-18055) files: M Lib/webbrowser.py diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index 0af36c4301d79..1ef179a91a6f1 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -87,7 +87,7 @@ def open_new_tab(url): def _synthesize(browser, *, preferred=False): - """Attempt to synthesize a controller base on existing controllers. + """Attempt to synthesize a controller based on existing controllers. This is useful to create a controller when a user specifies a path to an entry in the BROWSER environment variable -- we can copy a general From webhook-mailer at python.org Sun Jan 19 05:48:08 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 Jan 2020 10:48:08 -0000 Subject: [Python-checkins] Fix typo from base to based (GH-18055) Message-ID: https://github.com/python/cpython/commit/c7b16f858844546f02f7a3521c982038b44b3728 commit: c7b16f858844546f02f7a3521c982038b44b3728 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-19T02:48:04-08:00 summary: Fix typo from base to based (GH-18055) (cherry picked from commit 558f07891170fe5173f277d3749e92d844de0a27) Co-authored-by: Michael Haas files: M Lib/webbrowser.py diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index 0af36c4301d79..1ef179a91a6f1 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -87,7 +87,7 @@ def open_new_tab(url): def _synthesize(browser, *, preferred=False): - """Attempt to synthesize a controller base on existing controllers. + """Attempt to synthesize a controller based on existing controllers. This is useful to create a controller when a user specifies a path to an entry in the BROWSER environment variable -- we can copy a general From webhook-mailer at python.org Sun Jan 19 05:48:45 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 Jan 2020 10:48:45 -0000 Subject: [Python-checkins] Fix typo from base to based (GH-18055) Message-ID: https://github.com/python/cpython/commit/d96b7ddae9ba38ca66a3870f71f8d538357d2d39 commit: d96b7ddae9ba38ca66a3870f71f8d538357d2d39 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-19T02:48:40-08:00 summary: Fix typo from base to based (GH-18055) (cherry picked from commit 558f07891170fe5173f277d3749e92d844de0a27) Co-authored-by: Michael Haas files: M Lib/webbrowser.py diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index 82bff835fdd0b..e052e51cdec5a 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -87,7 +87,7 @@ def open_new_tab(url): def _synthesize(browser, *, preferred=False): - """Attempt to synthesize a controller base on existing controllers. + """Attempt to synthesize a controller based on existing controllers. This is useful to create a controller when a user specifies a path to an entry in the BROWSER environment variable -- we can copy a general From webhook-mailer at python.org Sun Jan 19 17:38:52 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 19 Jan 2020 22:38:52 -0000 Subject: [Python-checkins] bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Message-ID: https://github.com/python/cpython/commit/d8ef64422a75f40cecdb1a7ee43492607d3daaf6 commit: d8ef64422a75f40cecdb1a7ee43492607d3daaf6 branch: master author: Zackery Spytz committer: Victor Stinner date: 2020-01-19T23:38:37+01:00 summary: bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Update Misc/valgrind-python.supp to suppress the false alarm. files: M Misc/valgrind-python.supp diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp index 38a5ea3cd2b82..c9c45ba7ed6de 100644 --- a/Misc/valgrind-python.supp +++ b/Misc/valgrind-python.supp @@ -263,6 +263,14 @@ } +{ + Uninitialised byte(s) false alarm, see bpo-35561 + Memcheck:Param + epoll_ctl(event) + fun:epoll_ctl + fun:pyepoll_internal_ctl +} + { ZLIB problems, see test_gzip Memcheck:Cond From webhook-mailer at python.org Sun Jan 19 17:44:08 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 Jan 2020 22:44:08 -0000 Subject: [Python-checkins] bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Message-ID: https://github.com/python/cpython/commit/296383b6d05f9617283aeb5b601106f84b016198 commit: 296383b6d05f9617283aeb5b601106f84b016198 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-19T14:44:04-08:00 summary: bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Update Misc/valgrind-python.supp to suppress the false alarm. (cherry picked from commit d8ef64422a75f40cecdb1a7ee43492607d3daaf6) Co-authored-by: Zackery Spytz files: M Misc/valgrind-python.supp diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp index 38a5ea3cd2b82..c9c45ba7ed6de 100644 --- a/Misc/valgrind-python.supp +++ b/Misc/valgrind-python.supp @@ -263,6 +263,14 @@ } +{ + Uninitialised byte(s) false alarm, see bpo-35561 + Memcheck:Param + epoll_ctl(event) + fun:epoll_ctl + fun:pyepoll_internal_ctl +} + { ZLIB problems, see test_gzip Memcheck:Cond From webhook-mailer at python.org Sun Jan 19 17:44:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 Jan 2020 22:44:40 -0000 Subject: [Python-checkins] bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Message-ID: https://github.com/python/cpython/commit/23793edf0d61aa98478541d0ff8f2b900ff1813d commit: 23793edf0d61aa98478541d0ff8f2b900ff1813d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-19T14:44:35-08:00 summary: bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Update Misc/valgrind-python.supp to suppress the false alarm. (cherry picked from commit d8ef64422a75f40cecdb1a7ee43492607d3daaf6) Co-authored-by: Zackery Spytz files: M Misc/valgrind-python.supp diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp index 38a5ea3cd2b82..c9c45ba7ed6de 100644 --- a/Misc/valgrind-python.supp +++ b/Misc/valgrind-python.supp @@ -263,6 +263,14 @@ } +{ + Uninitialised byte(s) false alarm, see bpo-35561 + Memcheck:Param + epoll_ctl(event) + fun:epoll_ctl + fun:pyepoll_internal_ctl +} + { ZLIB problems, see test_gzip Memcheck:Cond From webhook-mailer at python.org Sun Jan 19 18:43:17 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 Jan 2020 23:43:17 -0000 Subject: [Python-checkins] bpo-38400 Don't check for NULL linked list pointers in _PyObject_IsFreed (GH-16630) Message-ID: https://github.com/python/cpython/commit/a360070121836dd29b691f5d6d14bcfb371d8029 commit: a360070121836dd29b691f5d6d14bcfb371d8029 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-19T15:43:12-08:00 summary: bpo-38400 Don't check for NULL linked list pointers in _PyObject_IsFreed (GH-16630) Some objects like Py_None are not initialized with conventional means that prepare the circular linked list pointers, leaving them unlinked from the rest of the objects. For those objects, NULL pointers does not mean that they are freed, so we need to skip the check in those cases. (cherry picked from commit 36e33c360ed7716a2b5ab2b53210da81f8ce1295) Co-authored-by: Pablo Galindo files: M Objects/object.c diff --git a/Objects/object.c b/Objects/object.c index 8a3f8831d6e92..21fa7b56607df 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -426,9 +426,12 @@ _PyObject_IsFreed(PyObject *op) /* ignore op->ob_ref: its value can have be modified by Py_INCREF() and Py_DECREF(). */ #ifdef Py_TRACE_REFS - if (_PyMem_IsPtrFreed(op->_ob_next) || _PyMem_IsPtrFreed(op->_ob_prev)) { + if (op->_ob_next != NULL && _PyMem_IsPtrFreed(op->_ob_next)) { return 1; } + if (op->_ob_prev != NULL && _PyMem_IsPtrFreed(op->_ob_prev)) { + return 1; + } #endif return 0; } From webhook-mailer at python.org Sun Jan 19 18:43:42 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 19 Jan 2020 23:43:42 -0000 Subject: [Python-checkins] bpo-38400 Don't check for NULL linked list pointers in _PyObject_IsFreed (GH-16630) Message-ID: https://github.com/python/cpython/commit/4cdb75890abd4ee7694744d5c24248f6735b0534 commit: 4cdb75890abd4ee7694744d5c24248f6735b0534 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-19T15:43:37-08:00 summary: bpo-38400 Don't check for NULL linked list pointers in _PyObject_IsFreed (GH-16630) Some objects like Py_None are not initialized with conventional means that prepare the circular linked list pointers, leaving them unlinked from the rest of the objects. For those objects, NULL pointers does not mean that they are freed, so we need to skip the check in those cases. (cherry picked from commit 36e33c360ed7716a2b5ab2b53210da81f8ce1295) Co-authored-by: Pablo Galindo files: M Objects/object.c diff --git a/Objects/object.c b/Objects/object.c index 566593a9c67cc..74b1b15d30bbf 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -454,9 +454,12 @@ _PyObject_IsFreed(PyObject *op) /* ignore op->ob_ref: its value can have be modified by Py_INCREF() and Py_DECREF(). */ #ifdef Py_TRACE_REFS - if (_PyMem_IsPtrFreed(op->_ob_next) || _PyMem_IsPtrFreed(op->_ob_prev)) { + if (op->_ob_next != NULL && _PyMem_IsPtrFreed(op->_ob_next)) { return 1; } + if (op->_ob_prev != NULL && _PyMem_IsPtrFreed(op->_ob_prev)) { + return 1; + } #endif return 0; } From webhook-mailer at python.org Sun Jan 19 22:46:00 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 20 Jan 2020 03:46:00 -0000 Subject: [Python-checkins] bpo-38536: locale: Remove trailing space in formatted currency (GH-16864) Message-ID: https://github.com/python/cpython/commit/e96d954527aa376457451e32a9d75ae3ea9ab4bd commit: e96d954527aa376457451e32a9d75ae3ea9ab4bd branch: master author: Inada Naoki committer: GitHub date: 2020-01-20T12:45:50+09:00 summary: bpo-38536: locale: Remove trailing space in formatted currency (GH-16864) files: A Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst M Lib/locale.py M Lib/test/test_locale.py diff --git a/Lib/locale.py b/Lib/locale.py index dd8a08524a018..1a4e9f694f309 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -279,6 +279,8 @@ def currency(val, symbol=True, grouping=False, international=False): if precedes: s = smb + (separated and ' ' or '') + s else: + if international and smb[-1] == ' ': + smb = smb[:-1] s = s + (separated and ' ' or '') + smb sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index c5d8e269d6318..2863d200e25c2 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -334,8 +334,7 @@ def test_currency(self): euro = '\u20ac' self._test_currency(50000, "50000,00 " + euro) self._test_currency(50000, "50 000,00 " + euro, grouping=True) - # XXX is the trailing space a bug? - self._test_currency(50000, "50 000,00 EUR ", + self._test_currency(50000, "50 000,00 EUR", grouping=True, international=True) diff --git a/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst b/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst new file mode 100644 index 0000000000000..147d181cc7e14 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst @@ -0,0 +1,2 @@ +Removes trailing space in formatted currency with `international=True` and a locale with symbol following value. +E.g. `locale.currency(12.34, international=True)` returned `'12,34 EUR '` instead of `'12,34 EUR'`. From webhook-mailer at python.org Sun Jan 19 23:54:09 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 20 Jan 2020 04:54:09 -0000 Subject: [Python-checkins] bpo-39377: json: Remove the encoding option. (GH-18075) Message-ID: https://github.com/python/cpython/commit/5492bfcefec67b016e8239c0e9135bc2f03e3058 commit: 5492bfcefec67b016e8239c0e9135bc2f03e3058 branch: master author: Inada Naoki committer: GitHub date: 2020-01-20T13:54:00+09:00 summary: bpo-39377: json: Remove the encoding option. (GH-18075) files: A Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst M Lib/json/__init__.py M Lib/test/test_json/test_decode.py diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py index 1ba8b48bd78cd..2c52bdeba6754 100644 --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -329,8 +329,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` kwarg; otherwise ``JSONDecoder`` is used. - - The ``encoding`` argument is ignored and deprecated since Python 3.1. """ if isinstance(s, str): if s.startswith('\ufeff'): @@ -342,15 +340,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, f'not {s.__class__.__name__}') s = s.decode(detect_encoding(s), 'surrogatepass') - if "encoding" in kw: - import warnings - warnings.warn( - "'encoding' is ignored and deprecated. It will be removed in Python 3.9", - DeprecationWarning, - stacklevel=2 - ) - del kw['encoding'] - if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py index 895c95b54c3b6..fdb9e62124ece 100644 --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -95,9 +95,5 @@ def test_negative_index(self): d = self.json.JSONDecoder() self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000) - def test_deprecated_encode(self): - with self.assertWarns(DeprecationWarning): - self.loads('{}', encoding='fake') - class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst b/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst new file mode 100644 index 0000000000000..8493ac88e4b72 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst @@ -0,0 +1,2 @@ +Removed ``encoding`` option from :func:`json.loads`. It has been deprecated +since Python 3.1. From webhook-mailer at python.org Mon Jan 20 17:21:40 2020 From: webhook-mailer at python.org (Nick Coghlan) Date: Mon, 20 Jan 2020 22:21:40 -0000 Subject: [Python-checkins] bpo-35134: Migrate frameobject.h contents to cpython/frameobject.h (GH-18052) Message-ID: https://github.com/python/cpython/commit/1e420f849d0c094098543d2c27d35eaec69b2784 commit: 1e420f849d0c094098543d2c27d35eaec69b2784 branch: master author: Nick Coghlan committer: GitHub date: 2020-01-21T08:21:35+10:00 summary: bpo-35134: Migrate frameobject.h contents to cpython/frameobject.h (GH-18052) files: A Include/cpython/frameobject.h M Include/frameobject.h diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h new file mode 100644 index 0000000000000..cf8c00c3528e0 --- /dev/null +++ b/Include/cpython/frameobject.h @@ -0,0 +1,87 @@ +/* Frame object interface */ + +#ifndef Py_CPYTHON_FRAMEOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + +/* only internal use */ +PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif diff --git a/Include/frameobject.h b/Include/frameobject.h index ddcf1591aaea7..1460e2210e317 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -1,88 +1,22 @@ /* Frame object interface */ -#ifndef Py_LIMITED_API #ifndef Py_FRAMEOBJECT_H #define Py_FRAMEOBJECT_H #ifdef __cplusplus extern "C" { #endif -typedef struct { - int b_type; /* what kind of block this is */ - int b_handler; /* where to jump to find handler */ - int b_level; /* value stack level to pop to */ -} PyTryBlock; - -typedef struct _frame { - PyObject_VAR_HEAD - struct _frame *f_back; /* previous frame, or NULL */ - PyCodeObject *f_code; /* code segment */ - PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ - PyObject *f_globals; /* global symbol table (PyDictObject) */ - PyObject *f_locals; /* local symbol table (any mapping) */ - PyObject **f_valuestack; /* points after the last local */ - /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. */ - PyObject **f_stacktop; - PyObject *f_trace; /* Trace function */ - char f_trace_lines; /* Emit per-line trace events? */ - char f_trace_opcodes; /* Emit per-opcode trace events? */ - - /* Borrowed reference to a generator, or NULL */ - PyObject *f_gen; - - int f_lasti; /* Last instruction if called */ - /* Call PyFrame_GetLineNumber() instead of reading this field - directly. As of 2.3 f_lineno is only valid when tracing is - active (i.e. when f_trace is set). At other times we use - PyCode_Addr2Line to calculate the line from the current - bytecode index. */ - int f_lineno; /* Current line number */ - int f_iblock; /* index in f_blockstack */ - char f_executing; /* whether the frame is still executing */ - PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ - PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ -} PyFrameObject; - - -/* Standard object interface */ - -PyAPI_DATA(PyTypeObject) PyFrame_Type; - -#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) - -PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - -/* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - +/* There are currently no frame related APIs in the stable ABI + * (they're all in the full CPython-specific API) + */ -/* The rest of the interface is specific for frame objects */ - -/* Block management functions */ - -PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); -PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); - -/* Conversions between "fast locals" and locals in dictionary */ - -PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); - -PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); -PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); - -PyAPI_FUNC(int) PyFrame_ClearFreeList(void); - -PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); - -/* Return the line of code the frame is currently executing. */ -PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); +#ifndef Py_LIMITED_API +# define Py_CPYTHON_FRAMEOBJECT_H +# include "cpython/frameobject.h" +# undef Py_CPYTHON_FRAMEOBJECT_H +#endif #ifdef __cplusplus } #endif #endif /* !Py_FRAMEOBJECT_H */ -#endif /* Py_LIMITED_API */ From webhook-mailer at python.org Mon Jan 20 17:46:46 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Mon, 20 Jan 2020 22:46:46 -0000 Subject: [Python-checkins] Fix asyncio.get_event_loop() documentation (GH-18051) Message-ID: https://github.com/python/cpython/commit/2c49becc69c05934996a00b902e4a4f089b91954 commit: 2c49becc69c05934996a00b902e4a4f089b91954 branch: master author: Andrew Svetlov committer: GitHub date: 2020-01-21T00:46:38+02:00 summary: Fix asyncio.get_event_loop() documentation (GH-18051) Mention that the function implicitly creates new event loop only if called from the main thread. files: A Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst M Doc/library/asyncio-eventloop.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index ee995e04e4765..25a3692695d53 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -38,8 +38,10 @@ an event loop: .. function:: get_event_loop() - Get the current event loop. If there is no current event loop set - in the current OS thread and :func:`set_event_loop` has not yet + Get the current event loop. + + If there is no current event loop set in the current OS thread, + the OS thread is main, and :func:`set_event_loop` has not yet been called, asyncio will create a new event loop and set it as the current one. diff --git a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst new file mode 100644 index 0000000000000..37b66ad9dfd17 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst @@ -0,0 +1,2 @@ +Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new +event loop only if called from the main thread. From webhook-mailer at python.org Mon Jan 20 17:49:38 2020 From: webhook-mailer at python.org (Andrew Svetlov) Date: Mon, 20 Jan 2020 22:49:38 -0000 Subject: [Python-checkins] bpo-39386: Prevent double awaiting of async iterator (GH-18081) Message-ID: https://github.com/python/cpython/commit/a96e06db77dcbd3433d39761ddb4615d7d96284a commit: a96e06db77dcbd3433d39761ddb4615d7d96284a branch: master author: Andrew Svetlov committer: GitHub date: 2020-01-21T00:49:30+02:00 summary: bpo-39386: Prevent double awaiting of async iterator (GH-18081) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst M Lib/test/test_asyncgen.py M Objects/genobject.c diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 58d8aee19adac..24b20bec2b2d1 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1128,6 +1128,42 @@ def exception_handler(loop, context): self.assertEqual([], messages) + def test_async_gen_await_anext_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.__anext__() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited __anext__\(\)/asend\(\)" + ): + await nxt + + await it.aclose() # prevent unfinished iterator warning + + self.loop.run_until_complete(run()) + + def test_async_gen_await_aclose_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.aclose() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited aclose\(\)/athrow\(\)" + ): + await nxt + + self.loop.run_until_complete(run()) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst new file mode 100644 index 0000000000000..f24e1f4e8a183 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst @@ -0,0 +1 @@ +Prevent double awaiting of async iterator. diff --git a/Objects/genobject.c b/Objects/genobject.c index c5fe9999af26e..652c2903dd284 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1518,7 +1518,9 @@ async_gen_asend_send(PyAsyncGenASend *o, PyObject *arg) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1561,7 +1563,9 @@ async_gen_asend_throw(PyAsyncGenASend *o, PyObject *args) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1795,7 +1799,9 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) if (f == NULL || f->f_stacktop == NULL || o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } @@ -1917,7 +1923,9 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args) PyObject *retval; if (o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } From webhook-mailer at python.org Mon Jan 20 17:52:04 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 Jan 2020 22:52:04 -0000 Subject: [Python-checkins] Fix asyncio.get_event_loop() documentation (GH-18051) Message-ID: https://github.com/python/cpython/commit/2469066a4b6a7b126b742b35e146641393022c31 commit: 2469066a4b6a7b126b742b35e146641393022c31 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T14:51:57-08:00 summary: Fix asyncio.get_event_loop() documentation (GH-18051) Mention that the function implicitly creates new event loop only if called from the main thread. (cherry picked from commit 2c49becc69c05934996a00b902e4a4f089b91954) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst M Doc/library/asyncio-eventloop.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index d8e1a7443fa94..97c1078022601 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -34,8 +34,10 @@ an event loop: .. function:: get_event_loop() - Get the current event loop. If there is no current event loop set - in the current OS thread and :func:`set_event_loop` has not yet + Get the current event loop. + + If there is no current event loop set in the current OS thread, + the OS thread is main, and :func:`set_event_loop` has not yet been called, asyncio will create a new event loop and set it as the current one. diff --git a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst new file mode 100644 index 0000000000000..37b66ad9dfd17 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst @@ -0,0 +1,2 @@ +Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new +event loop only if called from the main thread. From webhook-mailer at python.org Mon Jan 20 17:52:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 Jan 2020 22:52:40 -0000 Subject: [Python-checkins] Fix asyncio.get_event_loop() documentation (GH-18051) Message-ID: https://github.com/python/cpython/commit/6aeed01901d020363e383821b38614816d0b4032 commit: 6aeed01901d020363e383821b38614816d0b4032 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T14:52:35-08:00 summary: Fix asyncio.get_event_loop() documentation (GH-18051) Mention that the function implicitly creates new event loop only if called from the main thread. (cherry picked from commit 2c49becc69c05934996a00b902e4a4f089b91954) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst M Doc/library/asyncio-eventloop.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 7fed2c23df7d5..24f621e2d9fff 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -38,8 +38,10 @@ an event loop: .. function:: get_event_loop() - Get the current event loop. If there is no current event loop set - in the current OS thread and :func:`set_event_loop` has not yet + Get the current event loop. + + If there is no current event loop set in the current OS thread, + the OS thread is main, and :func:`set_event_loop` has not yet been called, asyncio will create a new event loop and set it as the current one. diff --git a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst new file mode 100644 index 0000000000000..37b66ad9dfd17 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst @@ -0,0 +1,2 @@ +Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new +event loop only if called from the main thread. From webhook-mailer at python.org Mon Jan 20 18:06:45 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 Jan 2020 23:06:45 -0000 Subject: [Python-checkins] bpo-39386: Prevent double awaiting of async iterator (GH-18081) Message-ID: https://github.com/python/cpython/commit/5cadd3fe3aead1b5bee1438dc03383d6739d4209 commit: 5cadd3fe3aead1b5bee1438dc03383d6739d4209 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T15:06:40-08:00 summary: bpo-39386: Prevent double awaiting of async iterator (GH-18081) (cherry picked from commit a96e06db77dcbd3433d39761ddb4615d7d96284a) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst M Lib/test/test_asyncgen.py M Objects/genobject.c diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 58d8aee19adac..24b20bec2b2d1 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1128,6 +1128,42 @@ def exception_handler(loop, context): self.assertEqual([], messages) + def test_async_gen_await_anext_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.__anext__() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited __anext__\(\)/asend\(\)" + ): + await nxt + + await it.aclose() # prevent unfinished iterator warning + + self.loop.run_until_complete(run()) + + def test_async_gen_await_aclose_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.aclose() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited aclose\(\)/athrow\(\)" + ): + await nxt + + self.loop.run_until_complete(run()) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst new file mode 100644 index 0000000000000..f24e1f4e8a183 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst @@ -0,0 +1 @@ +Prevent double awaiting of async iterator. diff --git a/Objects/genobject.c b/Objects/genobject.c index 5643553b708d1..72aa872c6b59f 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1533,7 +1533,9 @@ async_gen_asend_send(PyAsyncGenASend *o, PyObject *arg) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1576,7 +1578,9 @@ async_gen_asend_throw(PyAsyncGenASend *o, PyObject *args) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1810,7 +1814,9 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) if (f == NULL || f->f_stacktop == NULL || o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } @@ -1932,7 +1938,9 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args) PyObject *retval; if (o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } From webhook-mailer at python.org Mon Jan 20 18:07:59 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 Jan 2020 23:07:59 -0000 Subject: [Python-checkins] bpo-39386: Prevent double awaiting of async iterator (GH-18081) Message-ID: https://github.com/python/cpython/commit/b76d5e9ee64b8ac861e856d8e41289c0977c75e1 commit: b76d5e9ee64b8ac861e856d8e41289c0977c75e1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T15:07:54-08:00 summary: bpo-39386: Prevent double awaiting of async iterator (GH-18081) (cherry picked from commit a96e06db77dcbd3433d39761ddb4615d7d96284a) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst M Lib/test/test_asyncgen.py M Objects/genobject.c diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index cca6d58417ac4..426d5d1161423 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1117,6 +1117,42 @@ def exception_handler(loop, context): self.assertEqual([], messages) + def test_async_gen_await_anext_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.__anext__() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited __anext__\(\)/asend\(\)" + ): + await nxt + + await it.aclose() # prevent unfinished iterator warning + + self.loop.run_until_complete(run()) + + def test_async_gen_await_aclose_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.aclose() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited aclose\(\)/athrow\(\)" + ): + await nxt + + self.loop.run_until_complete(run()) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst new file mode 100644 index 0000000000000..f24e1f4e8a183 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst @@ -0,0 +1 @@ +Prevent double awaiting of async iterator. diff --git a/Objects/genobject.c b/Objects/genobject.c index 7fc7a1f2aeb3d..a42169f82e4d7 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1533,7 +1533,9 @@ async_gen_asend_send(PyAsyncGenASend *o, PyObject *arg) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1568,7 +1570,9 @@ async_gen_asend_throw(PyAsyncGenASend *o, PyObject *args) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1802,7 +1806,9 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) if (f == NULL || f->f_stacktop == NULL || o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } @@ -1906,7 +1912,9 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args) PyObject *retval; if (o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } From webhook-mailer at python.org Mon Jan 20 18:23:01 2020 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 20 Jan 2020 23:23:01 -0000 Subject: [Python-checkins] bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) Message-ID: https://github.com/python/cpython/commit/8d57a4182f0aa68e16d66dea31ba59e732612b4f commit: 8d57a4182f0aa68e16d66dea31ba59e732612b4f branch: master author: Peter Bittner committer: Ned Deily date: 2020-01-20T18:22:56-05:00 summary: bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) files: M Doc/library/platform.rst diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 1d33afc75870a..8e8e3775aaff4 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -145,8 +145,8 @@ Cross Platform .. function:: system() - Returns the system/OS name, e.g. ``'Linux'``, ``'Windows'``, or ``'Java'``. An - empty string is returned if the value cannot be determined. + Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``, + ``'Windows'``. An empty string is returned if the value cannot be determined. .. function:: system_alias(system, release, version) @@ -260,4 +260,3 @@ Unix Platforms using :program:`gcc`. The file is read and scanned in chunks of *chunksize* bytes. - From webhook-mailer at python.org Mon Jan 20 18:28:23 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 Jan 2020 23:28:23 -0000 Subject: [Python-checkins] bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) Message-ID: https://github.com/python/cpython/commit/3da839046359644f286195f5126035e162440af1 commit: 3da839046359644f286195f5126035e162440af1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T15:28:18-08:00 summary: bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) (cherry picked from commit 8d57a4182f0aa68e16d66dea31ba59e732612b4f) Co-authored-by: Peter Bittner files: M Doc/library/platform.rst diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 7d29dc186b67c..f00567c2aa104 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -140,8 +140,8 @@ Cross Platform .. function:: system() - Returns the system/OS name, e.g. ``'Linux'``, ``'Windows'``, or ``'Java'``. An - empty string is returned if the value cannot be determined. + Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``, + ``'Windows'``. An empty string is returned if the value cannot be determined. .. function:: system_alias(system, release, version) @@ -281,4 +281,3 @@ Unix Platforms using :program:`gcc`. The file is read and scanned in chunks of *chunksize* bytes. - From webhook-mailer at python.org Mon Jan 20 18:28:48 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 20 Jan 2020 23:28:48 -0000 Subject: [Python-checkins] bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) Message-ID: https://github.com/python/cpython/commit/c1964e09421e7ab61179eb4e2691e858a50d70e5 commit: c1964e09421e7ab61179eb4e2691e858a50d70e5 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T15:28:43-08:00 summary: bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) (cherry picked from commit 8d57a4182f0aa68e16d66dea31ba59e732612b4f) Co-authored-by: Peter Bittner files: M Doc/library/platform.rst diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 1d33afc75870a..8e8e3775aaff4 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -145,8 +145,8 @@ Cross Platform .. function:: system() - Returns the system/OS name, e.g. ``'Linux'``, ``'Windows'``, or ``'Java'``. An - empty string is returned if the value cannot be determined. + Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``, + ``'Windows'``. An empty string is returned if the value cannot be determined. .. function:: system_alias(system, release, version) @@ -260,4 +260,3 @@ Unix Platforms using :program:`gcc`. The file is read and scanned in chunks of *chunksize* bytes. - From webhook-mailer at python.org Mon Jan 20 19:41:27 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 21 Jan 2020 00:41:27 -0000 Subject: [Python-checkins] improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) Message-ID: https://github.com/python/cpython/commit/8698b34b68065b80bd9bd18b8decb425208fa386 commit: 8698b34b68065b80bd9bd18b8decb425208fa386 branch: master author: Carl Friedrich Bolz-Tereick committer: Inada Naoki date: 2020-01-21T09:41:16+09:00 summary: improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d3124f973f1d0..aef5c7e8bf261 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1140,22 +1140,24 @@ All of the following opcodes use their arguments. .. opcode:: LOAD_METHOD (namei) - Loads a method named ``co_names[namei]`` from TOS object. TOS is popped and - method and TOS are pushed when interpreter can call unbound method directly. - TOS will be used as the first argument (``self``) by :opcode:`CALL_METHOD`. - Otherwise, ``NULL`` and method is pushed (method is bound method or - something else). + Loads a method named ``co_names[namei]`` from the TOS object. TOS is popped. + This bytecode distinguishes two cases: if TOS has a method with the correct + name, the bytecode pushes the unbound method and TOS. TOS will be used as + the first argument (``self``) by :opcode:`CALL_METHOD` when calling the + unbound method. Otherwise, ``NULL`` and the object return by the attribute + lookup are pushed. .. versionadded:: 3.7 .. opcode:: CALL_METHOD (argc) - Calls a method. *argc* is number of positional arguments. + Calls a method. *argc* is the number of positional arguments. Keyword arguments are not supported. This opcode is designed to be used with :opcode:`LOAD_METHOD`. Positional arguments are on top of the stack. - Below them, two items described in :opcode:`LOAD_METHOD` on the stack. - All of them are popped and return value is pushed. + Below them, the two items described in :opcode:`LOAD_METHOD` are on the + stack (either ``self`` and an unbound method object or ``NULL`` and an + arbitrary callable). All of them are popped and the return value is pushed. .. versionadded:: 3.7 From webhook-mailer at python.org Mon Jan 20 20:04:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 Jan 2020 01:04:40 -0000 Subject: [Python-checkins] improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) Message-ID: https://github.com/python/cpython/commit/d7b0118a124f11f702bbe6e9f1bad680fb53590b commit: d7b0118a124f11f702bbe6e9f1bad680fb53590b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T17:04:36-08:00 summary: improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) (cherry picked from commit 8698b34b68065b80bd9bd18b8decb425208fa386) Co-authored-by: Carl Friedrich Bolz-Tereick files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 5e6f002dcd767..5c29c61a6fef4 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1120,22 +1120,24 @@ All of the following opcodes use their arguments. .. opcode:: LOAD_METHOD (namei) - Loads a method named ``co_names[namei]`` from TOS object. TOS is popped and - method and TOS are pushed when interpreter can call unbound method directly. - TOS will be used as the first argument (``self``) by :opcode:`CALL_METHOD`. - Otherwise, ``NULL`` and method is pushed (method is bound method or - something else). + Loads a method named ``co_names[namei]`` from the TOS object. TOS is popped. + This bytecode distinguishes two cases: if TOS has a method with the correct + name, the bytecode pushes the unbound method and TOS. TOS will be used as + the first argument (``self``) by :opcode:`CALL_METHOD` when calling the + unbound method. Otherwise, ``NULL`` and the object return by the attribute + lookup are pushed. .. versionadded:: 3.7 .. opcode:: CALL_METHOD (argc) - Calls a method. *argc* is number of positional arguments. + Calls a method. *argc* is the number of positional arguments. Keyword arguments are not supported. This opcode is designed to be used with :opcode:`LOAD_METHOD`. Positional arguments are on top of the stack. - Below them, two items described in :opcode:`LOAD_METHOD` on the stack. - All of them are popped and return value is pushed. + Below them, the two items described in :opcode:`LOAD_METHOD` are on the + stack (either ``self`` and an unbound method object or ``NULL`` and an + arbitrary callable). All of them are popped and the return value is pushed. .. versionadded:: 3.7 From webhook-mailer at python.org Mon Jan 20 20:12:12 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 Jan 2020 01:12:12 -0000 Subject: [Python-checkins] improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) Message-ID: https://github.com/python/cpython/commit/070e68a59d4a3e36085957eea83b79181bd1e0ba commit: 070e68a59d4a3e36085957eea83b79181bd1e0ba branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-20T17:12:07-08:00 summary: improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) (cherry picked from commit 8698b34b68065b80bd9bd18b8decb425208fa386) Co-authored-by: Carl Friedrich Bolz-Tereick files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 39a3e130afd3e..b1404af9c00eb 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1176,22 +1176,24 @@ All of the following opcodes use their arguments. .. opcode:: LOAD_METHOD (namei) - Loads a method named ``co_names[namei]`` from TOS object. TOS is popped and - method and TOS are pushed when interpreter can call unbound method directly. - TOS will be used as the first argument (``self``) by :opcode:`CALL_METHOD`. - Otherwise, ``NULL`` and method is pushed (method is bound method or - something else). + Loads a method named ``co_names[namei]`` from the TOS object. TOS is popped. + This bytecode distinguishes two cases: if TOS has a method with the correct + name, the bytecode pushes the unbound method and TOS. TOS will be used as + the first argument (``self``) by :opcode:`CALL_METHOD` when calling the + unbound method. Otherwise, ``NULL`` and the object return by the attribute + lookup are pushed. .. versionadded:: 3.7 .. opcode:: CALL_METHOD (argc) - Calls a method. *argc* is number of positional arguments. + Calls a method. *argc* is the number of positional arguments. Keyword arguments are not supported. This opcode is designed to be used with :opcode:`LOAD_METHOD`. Positional arguments are on top of the stack. - Below them, two items described in :opcode:`LOAD_METHOD` on the stack. - All of them are popped and return value is pushed. + Below them, the two items described in :opcode:`LOAD_METHOD` are on the + stack (either ``self`` and an unbound method object or ``NULL`` and an + arbitrary callable). All of them are popped and the return value is pushed. .. versionadded:: 3.7 From webhook-mailer at python.org Tue Jan 21 05:11:38 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Tue, 21 Jan 2020 10:11:38 -0000 Subject: [Python-checkins] bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Message-ID: https://github.com/python/cpython/commit/ec64640a2c5236d7a5d5470d759172a3d93eab0b commit: ec64640a2c5236d7a5d5470d759172a3d93eab0b branch: master author: Cheryl Sabella committer: Terry Jan Reedy date: 2020-01-21T05:11:26-05:00 summary: bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Fix comments and add tests for editor newline_and_indent_event method. Remove unused None default for function parameter of pyparse find_good_parse_start method and code triggered by that default. Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/editor.py M Lib/idlelib/idle_test/test_editor.py M Lib/idlelib/idle_test/test_pyparse.py M Lib/idlelib/pyparse.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index cbf55d9adef40..9f8894e517b76 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-32989: Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. + bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 92dcf57c4ff26..c9f1a1625ca5e 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -1342,38 +1342,51 @@ def smart_indent_event(self, event): text.undo_block_stop() def newline_and_indent_event(self, event): + """Insert a newline and indentation after Enter keypress event. + + Properly position the cursor on the new line based on information + from the current line. This takes into account if the current line + is a shell prompt, is empty, has selected text, contains a block + opener, contains a block closer, is a continuation line, or + is inside a string. + """ text = self.text first, last = self.get_selection_indices() text.undo_block_start() - try: + try: # Close undo block and expose new line in finally clause. if first and last: text.delete(first, last) text.mark_set("insert", first) line = text.get("insert linestart", "insert") + + # Count leading whitespace for indent size. i, n = 0, len(line) while i < n and line[i] in " \t": - i = i+1 + i += 1 if i == n: - # the cursor is in or at leading indentation in a continuation - # line; just inject an empty line at the start + # The cursor is in or at leading indentation in a continuation + # line; just inject an empty line at the start. text.insert("insert linestart", '\n') return "break" indent = line[:i] - # strip whitespace before insert point unless it's in the prompt + + # Strip whitespace before insert point unless it's in the prompt. i = 0 while line and line[-1] in " \t" and line != self.prompt_last_line: line = line[:-1] - i = i+1 + i += 1 if i: text.delete("insert - %d chars" % i, "insert") - # strip whitespace after insert point + + # Strip whitespace after insert point. while text.get("insert") in " \t": text.delete("insert") - # start new line + + # Insert new line. text.insert("insert", '\n') - # adjust indentation for continuations and block - # open/close first need to find the last stmt + # Adjust indentation for continuations and block open/close. + # First need to find the last statement. lno = index2line(text.index('insert')) y = pyparse.Parser(self.indentwidth, self.tabwidth) if not self.prompt_last_line: @@ -1383,7 +1396,7 @@ def newline_and_indent_event(self, event): rawtext = text.get(startatindex, "insert") y.set_code(rawtext) bod = y.find_good_parse_start( - self._build_char_in_string_func(startatindex)) + self._build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break y.set_lo(bod or 0) @@ -1399,26 +1412,26 @@ def newline_and_indent_event(self, event): c = y.get_continuation_type() if c != pyparse.C_NONE: - # The current stmt hasn't ended yet. + # The current statement hasn't ended yet. if c == pyparse.C_STRING_FIRST_LINE: - # after the first line of a string; do not indent at all + # After the first line of a string do not indent at all. pass elif c == pyparse.C_STRING_NEXT_LINES: - # inside a string which started before this line; - # just mimic the current indent + # Inside a string which started before this line; + # just mimic the current indent. text.insert("insert", indent) elif c == pyparse.C_BRACKET: - # line up with the first (if any) element of the + # Line up with the first (if any) element of the # last open bracket structure; else indent one # level beyond the indent of the line with the - # last open bracket + # last open bracket. self.reindent_to(y.compute_bracket_indent()) elif c == pyparse.C_BACKSLASH: - # if more than one line in this stmt already, just + # If more than one line in this statement already, just # mimic the current indent; else if initial line # has a start on an assignment stmt, indent to # beyond leftmost =; else to beyond first chunk of - # non-whitespace on initial line + # non-whitespace on initial line. if y.get_num_lines_in_stmt() > 1: text.insert("insert", indent) else: @@ -1427,9 +1440,9 @@ def newline_and_indent_event(self, event): assert 0, "bogus continuation type %r" % (c,) return "break" - # This line starts a brand new stmt; indent relative to + # This line starts a brand new statement; indent relative to # indentation of initial line of closest preceding - # interesting stmt. + # interesting statement. indent = y.get_base_indent_string() text.insert("insert", indent) if y.is_block_opener(): diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py index 240db71747a28..91e8ef89d1d72 100644 --- a/Lib/idlelib/idle_test/test_editor.py +++ b/Lib/idlelib/idle_test/test_editor.py @@ -2,6 +2,7 @@ from idlelib import editor import unittest +from collections import namedtuple from test.support import requires from tkinter import Tk @@ -91,5 +92,103 @@ def test_tabwidth_8(self): ) +class IndentAndNewlineTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.window = Editor(root=cls.root) + cls.window.indentwidth = 2 + cls.window.tabwidth = 2 + + @classmethod + def tearDownClass(cls): + cls.window._close() + del cls.window + cls.root.update_idletasks() + for id in cls.root.tk.call('after', 'info'): + cls.root.after_cancel(id) + cls.root.destroy() + del cls.root + + def insert(self, text): + t = self.window.text + t.delete('1.0', 'end') + t.insert('end', text) + # Force update for colorizer to finish. + t.update() + + def test_indent_and_newline_event(self): + eq = self.assertEqual + w = self.window + text = w.text + get = text.get + nl = w.newline_and_indent_event + + TestInfo = namedtuple('Tests', ['label', 'text', 'expected', 'mark']) + + tests = (TestInfo('Empty line inserts with no indent.', + ' \n def __init__(self):', + '\n \n def __init__(self):\n', + '1.end'), + TestInfo('Inside bracket before space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.14'), + TestInfo('Inside bracket after space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.15'), + TestInfo('Inside string with one line - no indent.', + ' """Docstring."""', + ' """Docstring.\n"""\n', + '1.15'), + TestInfo('Inside string with more than one line.', + ' """Docstring.\n Docstring Line 2"""', + ' """Docstring.\n Docstring Line 2\n """\n', + '2.18'), + TestInfo('Backslash with one line.', + 'a =\\', + 'a =\\\n \n', + '1.end'), + TestInfo('Backslash with more than one line.', + 'a =\\\n multiline\\', + 'a =\\\n multiline\\\n \n', + '2.end'), + TestInfo('Block opener - indents +1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n \n pass\n', + '1.end'), + TestInfo('Block closer - dedents -1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n pass\n \n', + '2.end'), + ) + + w.prompt_last_line = '' + for test in tests: + with self.subTest(label=test.label): + self.insert(test.text) + text.mark_set('insert', test.mark) + nl(event=None) + eq(get('1.0', 'end'), test.expected) + + # Selected text. + self.insert(' def f1(self, a, b):\n return a + b') + text.tag_add('sel', '1.17', '1.end') + nl(None) + # Deletes selected text before adding new line. + eq(get('1.0', 'end'), ' def f1(self, a,\n \n return a + b\n') + + # Preserves the whitespace in shell prompt. + w.prompt_last_line = '>>> ' + self.insert('>>> \t\ta =') + text.mark_set('insert', '1.5') + nl(None) + eq(get('1.0', 'end'), '>>> \na =\n') + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index f7154e6ded957..a2b13c38d80d5 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -18,7 +18,7 @@ def test_trans(self): # trans is the production instance of ParseMap, used in _study1 parser = pyparse.Parser(4, 4) self.assertEqual('\t a([{b}])b"c\'d\n'.translate(pyparse.trans), - 'xxx(((x)))x"x\'x\n') + 'xxx(((x)))x"x\'x\n') class PyParseTest(unittest.TestCase): @@ -61,14 +61,17 @@ def test_find_good_parse_start(self): # Split def across lines. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a,\n' - ' b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a,\n' + ' b=True):\n' + ' pass\n' + ) - # No value sent for is_char_in_string(). - self.assertIsNone(start()) + # Passing no value or non-callable should fail (issue 32989). + with self.assertRaises(TypeError): + start() + with self.assertRaises(TypeError): + start(False) # Make text look like a string. This returns pos as the start # position, but it's set to None. @@ -91,10 +94,10 @@ def test_find_good_parse_start(self): # Code without extra line break in def line - mostly returns the same # values. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a, b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a, b=True):\n' + ' pass\n' + ) eq(start(is_char_in_string=lambda index: False), 44) eq(start(is_char_in_string=lambda index: index > 44), 44) eq(start(is_char_in_string=lambda index: index >= 44), 33) diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index feb57cbb74056..9fa2010896071 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,8 +133,7 @@ def set_code(self, s): self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string=None, - _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some @@ -149,10 +148,6 @@ def find_good_parse_start(self, is_char_in_string=None, """ code, pos = self.code, None - if not is_char_in_string: - # no clue -- make the caller pass everything - return None - # Peek back from the end for a good place to start, # but don't try too often; pos will be left None, or # bumped to a legitimate synch point. diff --git a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst new file mode 100644 index 0000000000000..38f0fb6e10452 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst @@ -0,0 +1,2 @@ +Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. From webhook-mailer at python.org Tue Jan 21 05:14:18 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 Jan 2020 10:14:18 -0000 Subject: [Python-checkins] bpo-39396: Fix math.nextafter(-0.0, +0.0) on AIX 7.1 (GH-18094) Message-ID: https://github.com/python/cpython/commit/85ead4fc62829cb7ef2eb0af1a2933282f58c629 commit: 85ead4fc62829cb7ef2eb0af1a2933282f58c629 branch: master author: Victor Stinner committer: GitHub date: 2020-01-21T11:14:10+01:00 summary: bpo-39396: Fix math.nextafter(-0.0, +0.0) on AIX 7.1 (GH-18094) Move also math.nextafter() on math.ulp() tests from IsCloseTests to MathTests. files: A Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst M Lib/test/test_math.py M Modules/mathmodule.c diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 6d10227a0c135..e96fd745970a1 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1752,6 +1752,83 @@ def assertIsNaN(self, value): if not math.isnan(value): self.fail("Expected a NaN, got {!r}.".format(value)) + def assertEqualSign(self, x, y): + """Similar to assertEqual(), but compare also the sign. + + Function useful to compare signed zeros. + """ + self.assertEqual(x, y) + self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + + @requires_IEEE_754 + def test_nextafter(self): + # around 2^52 and 2^63 + self.assertEqual(math.nextafter(4503599627370496.0, -INF), + 4503599627370495.5) + self.assertEqual(math.nextafter(4503599627370496.0, INF), + 4503599627370497.0) + self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), + 9223372036854774784.0) + self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), + -9223372036854774784.0) + + # around 1.0 + self.assertEqual(math.nextafter(1.0, -INF), + float.fromhex('0x1.fffffffffffffp-1')) + self.assertEqual(math.nextafter(1.0, INF), + float.fromhex('0x1.0000000000001p+0')) + + # x == y: y is returned + self.assertEqual(math.nextafter(2.0, 2.0), 2.0) + self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) + self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) + + # around 0.0 + smallest_subnormal = sys.float_info.min * sys.float_info.epsilon + self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) + self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) + self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) + + # around infinity + largest_normal = sys.float_info.max + self.assertEqual(math.nextafter(INF, 0.0), largest_normal) + self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) + self.assertEqual(math.nextafter(largest_normal, INF), INF) + self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) + + # NaN + self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) + self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) + self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) + + @requires_IEEE_754 + def test_ulp(self): + self.assertEqual(math.ulp(1.0), sys.float_info.epsilon) + # use int ** int rather than float ** int to not rely on pow() accuracy + self.assertEqual(math.ulp(2 ** 52), 1.0) + self.assertEqual(math.ulp(2 ** 53), 2.0) + self.assertEqual(math.ulp(2 ** 64), 4096.0) + + # min and max + self.assertEqual(math.ulp(0.0), + sys.float_info.min * sys.float_info.epsilon) + self.assertEqual(math.ulp(FLOAT_MAX), + FLOAT_MAX - math.nextafter(FLOAT_MAX, -INF)) + + # special cases + self.assertEqual(math.ulp(INF), INF) + self.assertTrue(math.isnan(math.ulp(math.nan))) + + # negative number: ulp(-x) == ulp(x) + for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): + with self.subTest(x=x): + self.assertEqual(math.ulp(-x), math.ulp(x)) + class IsCloseTests(unittest.TestCase): isclose = math.isclose # subclasses should override this @@ -2009,83 +2086,6 @@ def testComb(self): self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) - def assertEqualSign(self, x, y): - """Similar to assertEqual(), but compare also the sign. - - Function useful to compare signed zeros. - """ - self.assertEqual(x, y) - self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) - - @requires_IEEE_754 - def test_nextafter(self): - # around 2^52 and 2^63 - self.assertEqual(math.nextafter(4503599627370496.0, -INF), - 4503599627370495.5) - self.assertEqual(math.nextafter(4503599627370496.0, INF), - 4503599627370497.0) - self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), - 9223372036854774784.0) - self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), - -9223372036854774784.0) - - # around 1.0 - self.assertEqual(math.nextafter(1.0, -INF), - float.fromhex('0x1.fffffffffffffp-1')) - self.assertEqual(math.nextafter(1.0, INF), - float.fromhex('0x1.0000000000001p+0')) - - # x == y: y is returned - self.assertEqual(math.nextafter(2.0, 2.0), 2.0) - self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) - self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) - - # around 0.0 - smallest_subnormal = sys.float_info.min * sys.float_info.epsilon - self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) - self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) - self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) - self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) - self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) - self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) - self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) - self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) - - # around infinity - largest_normal = sys.float_info.max - self.assertEqual(math.nextafter(INF, 0.0), largest_normal) - self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) - self.assertEqual(math.nextafter(largest_normal, INF), INF) - self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) - - # NaN - self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) - self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) - self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) - - @requires_IEEE_754 - def test_ulp(self): - self.assertEqual(math.ulp(1.0), sys.float_info.epsilon) - # use int ** int rather than float ** int to not rely on pow() accuracy - self.assertEqual(math.ulp(2 ** 52), 1.0) - self.assertEqual(math.ulp(2 ** 53), 2.0) - self.assertEqual(math.ulp(2 ** 64), 4096.0) - - # min and max - self.assertEqual(math.ulp(0.0), - sys.float_info.min * sys.float_info.epsilon) - self.assertEqual(math.ulp(FLOAT_MAX), - FLOAT_MAX - math.nextafter(FLOAT_MAX, -INF)) - - # special cases - self.assertEqual(math.ulp(INF), INF) - self.assertTrue(math.isnan(math.ulp(math.nan))) - - # negative number: ulp(-x) == ulp(x) - for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): - with self.subTest(x=x): - self.assertEqual(math.ulp(-x), math.ulp(x)) - def test_main(): from doctest import DocFileSuite diff --git a/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst b/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst new file mode 100644 index 0000000000000..af7076854a5f9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst @@ -0,0 +1 @@ +Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 81d871786f139..f012b51d86698 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3287,8 +3287,14 @@ static PyObject * math_nextafter_impl(PyObject *module, double x, double y) /*[clinic end generated code: output=750c8266c1c540ce input=02b2d50cd1d9f9b6]*/ { - double f = nextafter(x, y); - return PyFloat_FromDouble(f); +#if defined(_AIX) + if (x == y) { + /* On AIX 7.1, libm nextafter(-0.0, +0.0) returns -0.0. + Bug fixed in bos.adt.libm 7.2.2.0 by APAR IV95512. */ + return PyFloat_FromDouble(y); + } +#endif + return PyFloat_FromDouble(nextafter(x, y)); } From webhook-mailer at python.org Tue Jan 21 05:28:52 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 Jan 2020 10:28:52 -0000 Subject: [Python-checkins] bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Message-ID: https://github.com/python/cpython/commit/f3d3a3cc114ed30829544c3613b73e4fa6dd5599 commit: f3d3a3cc114ed30829544c3613b73e4fa6dd5599 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-21T02:28:48-08:00 summary: bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Fix comments and add tests for editor newline_and_indent_event method. Remove unused None default for function parameter of pyparse find_good_parse_start method and code triggered by that default. Co-authored-by: Terry Jan Reedy (cherry picked from commit ec64640a2c5236d7a5d5470d759172a3d93eab0b) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/editor.py M Lib/idlelib/idle_test/test_editor.py M Lib/idlelib/idle_test/test_pyparse.py M Lib/idlelib/pyparse.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index ac8570701e3fa..817bb2e0261c2 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-12-16? ====================================== +bpo-32989: Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. + bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 92dcf57c4ff26..c9f1a1625ca5e 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -1342,38 +1342,51 @@ def smart_indent_event(self, event): text.undo_block_stop() def newline_and_indent_event(self, event): + """Insert a newline and indentation after Enter keypress event. + + Properly position the cursor on the new line based on information + from the current line. This takes into account if the current line + is a shell prompt, is empty, has selected text, contains a block + opener, contains a block closer, is a continuation line, or + is inside a string. + """ text = self.text first, last = self.get_selection_indices() text.undo_block_start() - try: + try: # Close undo block and expose new line in finally clause. if first and last: text.delete(first, last) text.mark_set("insert", first) line = text.get("insert linestart", "insert") + + # Count leading whitespace for indent size. i, n = 0, len(line) while i < n and line[i] in " \t": - i = i+1 + i += 1 if i == n: - # the cursor is in or at leading indentation in a continuation - # line; just inject an empty line at the start + # The cursor is in or at leading indentation in a continuation + # line; just inject an empty line at the start. text.insert("insert linestart", '\n') return "break" indent = line[:i] - # strip whitespace before insert point unless it's in the prompt + + # Strip whitespace before insert point unless it's in the prompt. i = 0 while line and line[-1] in " \t" and line != self.prompt_last_line: line = line[:-1] - i = i+1 + i += 1 if i: text.delete("insert - %d chars" % i, "insert") - # strip whitespace after insert point + + # Strip whitespace after insert point. while text.get("insert") in " \t": text.delete("insert") - # start new line + + # Insert new line. text.insert("insert", '\n') - # adjust indentation for continuations and block - # open/close first need to find the last stmt + # Adjust indentation for continuations and block open/close. + # First need to find the last statement. lno = index2line(text.index('insert')) y = pyparse.Parser(self.indentwidth, self.tabwidth) if not self.prompt_last_line: @@ -1383,7 +1396,7 @@ def newline_and_indent_event(self, event): rawtext = text.get(startatindex, "insert") y.set_code(rawtext) bod = y.find_good_parse_start( - self._build_char_in_string_func(startatindex)) + self._build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break y.set_lo(bod or 0) @@ -1399,26 +1412,26 @@ def newline_and_indent_event(self, event): c = y.get_continuation_type() if c != pyparse.C_NONE: - # The current stmt hasn't ended yet. + # The current statement hasn't ended yet. if c == pyparse.C_STRING_FIRST_LINE: - # after the first line of a string; do not indent at all + # After the first line of a string do not indent at all. pass elif c == pyparse.C_STRING_NEXT_LINES: - # inside a string which started before this line; - # just mimic the current indent + # Inside a string which started before this line; + # just mimic the current indent. text.insert("insert", indent) elif c == pyparse.C_BRACKET: - # line up with the first (if any) element of the + # Line up with the first (if any) element of the # last open bracket structure; else indent one # level beyond the indent of the line with the - # last open bracket + # last open bracket. self.reindent_to(y.compute_bracket_indent()) elif c == pyparse.C_BACKSLASH: - # if more than one line in this stmt already, just + # If more than one line in this statement already, just # mimic the current indent; else if initial line # has a start on an assignment stmt, indent to # beyond leftmost =; else to beyond first chunk of - # non-whitespace on initial line + # non-whitespace on initial line. if y.get_num_lines_in_stmt() > 1: text.insert("insert", indent) else: @@ -1427,9 +1440,9 @@ def newline_and_indent_event(self, event): assert 0, "bogus continuation type %r" % (c,) return "break" - # This line starts a brand new stmt; indent relative to + # This line starts a brand new statement; indent relative to # indentation of initial line of closest preceding - # interesting stmt. + # interesting statement. indent = y.get_base_indent_string() text.insert("insert", indent) if y.is_block_opener(): diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py index 240db71747a28..91e8ef89d1d72 100644 --- a/Lib/idlelib/idle_test/test_editor.py +++ b/Lib/idlelib/idle_test/test_editor.py @@ -2,6 +2,7 @@ from idlelib import editor import unittest +from collections import namedtuple from test.support import requires from tkinter import Tk @@ -91,5 +92,103 @@ def test_tabwidth_8(self): ) +class IndentAndNewlineTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.window = Editor(root=cls.root) + cls.window.indentwidth = 2 + cls.window.tabwidth = 2 + + @classmethod + def tearDownClass(cls): + cls.window._close() + del cls.window + cls.root.update_idletasks() + for id in cls.root.tk.call('after', 'info'): + cls.root.after_cancel(id) + cls.root.destroy() + del cls.root + + def insert(self, text): + t = self.window.text + t.delete('1.0', 'end') + t.insert('end', text) + # Force update for colorizer to finish. + t.update() + + def test_indent_and_newline_event(self): + eq = self.assertEqual + w = self.window + text = w.text + get = text.get + nl = w.newline_and_indent_event + + TestInfo = namedtuple('Tests', ['label', 'text', 'expected', 'mark']) + + tests = (TestInfo('Empty line inserts with no indent.', + ' \n def __init__(self):', + '\n \n def __init__(self):\n', + '1.end'), + TestInfo('Inside bracket before space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.14'), + TestInfo('Inside bracket after space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.15'), + TestInfo('Inside string with one line - no indent.', + ' """Docstring."""', + ' """Docstring.\n"""\n', + '1.15'), + TestInfo('Inside string with more than one line.', + ' """Docstring.\n Docstring Line 2"""', + ' """Docstring.\n Docstring Line 2\n """\n', + '2.18'), + TestInfo('Backslash with one line.', + 'a =\\', + 'a =\\\n \n', + '1.end'), + TestInfo('Backslash with more than one line.', + 'a =\\\n multiline\\', + 'a =\\\n multiline\\\n \n', + '2.end'), + TestInfo('Block opener - indents +1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n \n pass\n', + '1.end'), + TestInfo('Block closer - dedents -1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n pass\n \n', + '2.end'), + ) + + w.prompt_last_line = '' + for test in tests: + with self.subTest(label=test.label): + self.insert(test.text) + text.mark_set('insert', test.mark) + nl(event=None) + eq(get('1.0', 'end'), test.expected) + + # Selected text. + self.insert(' def f1(self, a, b):\n return a + b') + text.tag_add('sel', '1.17', '1.end') + nl(None) + # Deletes selected text before adding new line. + eq(get('1.0', 'end'), ' def f1(self, a,\n \n return a + b\n') + + # Preserves the whitespace in shell prompt. + w.prompt_last_line = '>>> ' + self.insert('>>> \t\ta =') + text.mark_set('insert', '1.5') + nl(None) + eq(get('1.0', 'end'), '>>> \na =\n') + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index f7154e6ded957..a2b13c38d80d5 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -18,7 +18,7 @@ def test_trans(self): # trans is the production instance of ParseMap, used in _study1 parser = pyparse.Parser(4, 4) self.assertEqual('\t a([{b}])b"c\'d\n'.translate(pyparse.trans), - 'xxx(((x)))x"x\'x\n') + 'xxx(((x)))x"x\'x\n') class PyParseTest(unittest.TestCase): @@ -61,14 +61,17 @@ def test_find_good_parse_start(self): # Split def across lines. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a,\n' - ' b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a,\n' + ' b=True):\n' + ' pass\n' + ) - # No value sent for is_char_in_string(). - self.assertIsNone(start()) + # Passing no value or non-callable should fail (issue 32989). + with self.assertRaises(TypeError): + start() + with self.assertRaises(TypeError): + start(False) # Make text look like a string. This returns pos as the start # position, but it's set to None. @@ -91,10 +94,10 @@ def test_find_good_parse_start(self): # Code without extra line break in def line - mostly returns the same # values. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a, b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a, b=True):\n' + ' pass\n' + ) eq(start(is_char_in_string=lambda index: False), 44) eq(start(is_char_in_string=lambda index: index > 44), 44) eq(start(is_char_in_string=lambda index: index >= 44), 33) diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index feb57cbb74056..9fa2010896071 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,8 +133,7 @@ def set_code(self, s): self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string=None, - _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some @@ -149,10 +148,6 @@ def find_good_parse_start(self, is_char_in_string=None, """ code, pos = self.code, None - if not is_char_in_string: - # no clue -- make the caller pass everything - return None - # Peek back from the end for a good place to start, # but don't try too often; pos will be left None, or # bumped to a legitimate synch point. diff --git a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst new file mode 100644 index 0000000000000..38f0fb6e10452 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst @@ -0,0 +1,2 @@ +Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. From webhook-mailer at python.org Tue Jan 21 05:29:43 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 21 Jan 2020 10:29:43 -0000 Subject: [Python-checkins] bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Message-ID: https://github.com/python/cpython/commit/060ad2fc1535adc76f96be8269b4af0f14429161 commit: 060ad2fc1535adc76f96be8269b4af0f14429161 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-21T02:29:39-08:00 summary: bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Fix comments and add tests for editor newline_and_indent_event method. Remove unused None default for function parameter of pyparse find_good_parse_start method and code triggered by that default. Co-authored-by: Terry Jan Reedy (cherry picked from commit ec64640a2c5236d7a5d5470d759172a3d93eab0b) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/editor.py M Lib/idlelib/idle_test/test_editor.py M Lib/idlelib/idle_test/test_pyparse.py M Lib/idlelib/pyparse.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 0baec813b044d..6e30ef35081f2 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-12-16? ====================================== +bpo-32989: Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. + bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 92dcf57c4ff26..c9f1a1625ca5e 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -1342,38 +1342,51 @@ def smart_indent_event(self, event): text.undo_block_stop() def newline_and_indent_event(self, event): + """Insert a newline and indentation after Enter keypress event. + + Properly position the cursor on the new line based on information + from the current line. This takes into account if the current line + is a shell prompt, is empty, has selected text, contains a block + opener, contains a block closer, is a continuation line, or + is inside a string. + """ text = self.text first, last = self.get_selection_indices() text.undo_block_start() - try: + try: # Close undo block and expose new line in finally clause. if first and last: text.delete(first, last) text.mark_set("insert", first) line = text.get("insert linestart", "insert") + + # Count leading whitespace for indent size. i, n = 0, len(line) while i < n and line[i] in " \t": - i = i+1 + i += 1 if i == n: - # the cursor is in or at leading indentation in a continuation - # line; just inject an empty line at the start + # The cursor is in or at leading indentation in a continuation + # line; just inject an empty line at the start. text.insert("insert linestart", '\n') return "break" indent = line[:i] - # strip whitespace before insert point unless it's in the prompt + + # Strip whitespace before insert point unless it's in the prompt. i = 0 while line and line[-1] in " \t" and line != self.prompt_last_line: line = line[:-1] - i = i+1 + i += 1 if i: text.delete("insert - %d chars" % i, "insert") - # strip whitespace after insert point + + # Strip whitespace after insert point. while text.get("insert") in " \t": text.delete("insert") - # start new line + + # Insert new line. text.insert("insert", '\n') - # adjust indentation for continuations and block - # open/close first need to find the last stmt + # Adjust indentation for continuations and block open/close. + # First need to find the last statement. lno = index2line(text.index('insert')) y = pyparse.Parser(self.indentwidth, self.tabwidth) if not self.prompt_last_line: @@ -1383,7 +1396,7 @@ def newline_and_indent_event(self, event): rawtext = text.get(startatindex, "insert") y.set_code(rawtext) bod = y.find_good_parse_start( - self._build_char_in_string_func(startatindex)) + self._build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break y.set_lo(bod or 0) @@ -1399,26 +1412,26 @@ def newline_and_indent_event(self, event): c = y.get_continuation_type() if c != pyparse.C_NONE: - # The current stmt hasn't ended yet. + # The current statement hasn't ended yet. if c == pyparse.C_STRING_FIRST_LINE: - # after the first line of a string; do not indent at all + # After the first line of a string do not indent at all. pass elif c == pyparse.C_STRING_NEXT_LINES: - # inside a string which started before this line; - # just mimic the current indent + # Inside a string which started before this line; + # just mimic the current indent. text.insert("insert", indent) elif c == pyparse.C_BRACKET: - # line up with the first (if any) element of the + # Line up with the first (if any) element of the # last open bracket structure; else indent one # level beyond the indent of the line with the - # last open bracket + # last open bracket. self.reindent_to(y.compute_bracket_indent()) elif c == pyparse.C_BACKSLASH: - # if more than one line in this stmt already, just + # If more than one line in this statement already, just # mimic the current indent; else if initial line # has a start on an assignment stmt, indent to # beyond leftmost =; else to beyond first chunk of - # non-whitespace on initial line + # non-whitespace on initial line. if y.get_num_lines_in_stmt() > 1: text.insert("insert", indent) else: @@ -1427,9 +1440,9 @@ def newline_and_indent_event(self, event): assert 0, "bogus continuation type %r" % (c,) return "break" - # This line starts a brand new stmt; indent relative to + # This line starts a brand new statement; indent relative to # indentation of initial line of closest preceding - # interesting stmt. + # interesting statement. indent = y.get_base_indent_string() text.insert("insert", indent) if y.is_block_opener(): diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py index 240db71747a28..91e8ef89d1d72 100644 --- a/Lib/idlelib/idle_test/test_editor.py +++ b/Lib/idlelib/idle_test/test_editor.py @@ -2,6 +2,7 @@ from idlelib import editor import unittest +from collections import namedtuple from test.support import requires from tkinter import Tk @@ -91,5 +92,103 @@ def test_tabwidth_8(self): ) +class IndentAndNewlineTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.window = Editor(root=cls.root) + cls.window.indentwidth = 2 + cls.window.tabwidth = 2 + + @classmethod + def tearDownClass(cls): + cls.window._close() + del cls.window + cls.root.update_idletasks() + for id in cls.root.tk.call('after', 'info'): + cls.root.after_cancel(id) + cls.root.destroy() + del cls.root + + def insert(self, text): + t = self.window.text + t.delete('1.0', 'end') + t.insert('end', text) + # Force update for colorizer to finish. + t.update() + + def test_indent_and_newline_event(self): + eq = self.assertEqual + w = self.window + text = w.text + get = text.get + nl = w.newline_and_indent_event + + TestInfo = namedtuple('Tests', ['label', 'text', 'expected', 'mark']) + + tests = (TestInfo('Empty line inserts with no indent.', + ' \n def __init__(self):', + '\n \n def __init__(self):\n', + '1.end'), + TestInfo('Inside bracket before space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.14'), + TestInfo('Inside bracket after space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.15'), + TestInfo('Inside string with one line - no indent.', + ' """Docstring."""', + ' """Docstring.\n"""\n', + '1.15'), + TestInfo('Inside string with more than one line.', + ' """Docstring.\n Docstring Line 2"""', + ' """Docstring.\n Docstring Line 2\n """\n', + '2.18'), + TestInfo('Backslash with one line.', + 'a =\\', + 'a =\\\n \n', + '1.end'), + TestInfo('Backslash with more than one line.', + 'a =\\\n multiline\\', + 'a =\\\n multiline\\\n \n', + '2.end'), + TestInfo('Block opener - indents +1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n \n pass\n', + '1.end'), + TestInfo('Block closer - dedents -1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n pass\n \n', + '2.end'), + ) + + w.prompt_last_line = '' + for test in tests: + with self.subTest(label=test.label): + self.insert(test.text) + text.mark_set('insert', test.mark) + nl(event=None) + eq(get('1.0', 'end'), test.expected) + + # Selected text. + self.insert(' def f1(self, a, b):\n return a + b') + text.tag_add('sel', '1.17', '1.end') + nl(None) + # Deletes selected text before adding new line. + eq(get('1.0', 'end'), ' def f1(self, a,\n \n return a + b\n') + + # Preserves the whitespace in shell prompt. + w.prompt_last_line = '>>> ' + self.insert('>>> \t\ta =') + text.mark_set('insert', '1.5') + nl(None) + eq(get('1.0', 'end'), '>>> \na =\n') + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index f7154e6ded957..a2b13c38d80d5 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -18,7 +18,7 @@ def test_trans(self): # trans is the production instance of ParseMap, used in _study1 parser = pyparse.Parser(4, 4) self.assertEqual('\t a([{b}])b"c\'d\n'.translate(pyparse.trans), - 'xxx(((x)))x"x\'x\n') + 'xxx(((x)))x"x\'x\n') class PyParseTest(unittest.TestCase): @@ -61,14 +61,17 @@ def test_find_good_parse_start(self): # Split def across lines. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a,\n' - ' b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a,\n' + ' b=True):\n' + ' pass\n' + ) - # No value sent for is_char_in_string(). - self.assertIsNone(start()) + # Passing no value or non-callable should fail (issue 32989). + with self.assertRaises(TypeError): + start() + with self.assertRaises(TypeError): + start(False) # Make text look like a string. This returns pos as the start # position, but it's set to None. @@ -91,10 +94,10 @@ def test_find_good_parse_start(self): # Code without extra line break in def line - mostly returns the same # values. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a, b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a, b=True):\n' + ' pass\n' + ) eq(start(is_char_in_string=lambda index: False), 44) eq(start(is_char_in_string=lambda index: index > 44), 44) eq(start(is_char_in_string=lambda index: index >= 44), 33) diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index feb57cbb74056..9fa2010896071 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,8 +133,7 @@ def set_code(self, s): self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string=None, - _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some @@ -149,10 +148,6 @@ def find_good_parse_start(self, is_char_in_string=None, """ code, pos = self.code, None - if not is_char_in_string: - # no clue -- make the caller pass everything - return None - # Peek back from the end for a good place to start, # but don't try too often; pos will be left None, or # bumped to a legitimate synch point. diff --git a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst new file mode 100644 index 0000000000000..38f0fb6e10452 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst @@ -0,0 +1,2 @@ +Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. From webhook-mailer at python.org Tue Jan 21 06:25:32 2020 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Tue, 21 Jan 2020 11:25:32 -0000 Subject: [Python-checkins] bpo-39389: gzip: fix compression level metadata (GH-18077) Message-ID: https://github.com/python/cpython/commit/eab3b3f1c60afecfb4db3c3619109684cb04bd60 commit: eab3b3f1c60afecfb4db3c3619109684cb04bd60 branch: master author: William Chargin committer: Serhiy Storchaka date: 2020-01-21T13:25:24+02:00 summary: bpo-39389: gzip: fix compression level metadata (GH-18077) As described in RFC 1952, section 2.3.1, the XFL (eXtra FLags) byte of a gzip member header should indicate whether the DEFLATE algorithm was tuned for speed or compression ratio. Prior to this patch, archives emitted by the `gzip` module always indicated maximum compression. files: A Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst M Lib/gzip.py M Lib/test/test_gzip.py diff --git a/Lib/gzip.py b/Lib/gzip.py index e60d8ad5995b3..e422773b3edfb 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -209,7 +209,7 @@ def __init__(self, filename=None, mode=None, self.fileobj = fileobj if self.mode == WRITE: - self._write_gzip_header() + self._write_gzip_header(compresslevel) @property def filename(self): @@ -236,7 +236,7 @@ def _init_write(self, filename): self.bufsize = 0 self.offset = 0 # Current file offset for seek(), tell(), etc - def _write_gzip_header(self): + def _write_gzip_header(self, compresslevel): self.fileobj.write(b'\037\213') # magic header self.fileobj.write(b'\010') # compression method try: @@ -257,7 +257,13 @@ def _write_gzip_header(self): if mtime is None: mtime = time.time() write32u(self.fileobj, int(mtime)) - self.fileobj.write(b'\002') + if compresslevel == _COMPRESS_LEVEL_BEST: + xfl = b'\002' + elif compresslevel == _COMPRESS_LEVEL_FAST: + xfl = b'\004' + else: + xfl = b'\000' + self.fileobj.write(xfl) self.fileobj.write(b'\377') if fname: self.fileobj.write(fname + b'\000') diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 57d851cf9cf15..78334213f24b1 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -358,6 +358,26 @@ def test_metadata(self): isizeBytes = fRead.read(4) self.assertEqual(isizeBytes, struct.pack(' https://github.com/python/cpython/commit/ab0d8e356ecd351d55f89519a6a97a1e69c0dfab commit: ab0d8e356ecd351d55f89519a6a97a1e69c0dfab branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-21T03:42:49-08:00 summary: bpo-39389: gzip: fix compression level metadata (GH-18077) As described in RFC 1952, section 2.3.1, the XFL (eXtra FLags) byte of a gzip member header should indicate whether the DEFLATE algorithm was tuned for speed or compression ratio. Prior to this patch, archives emitted by the `gzip` module always indicated maximum compression. (cherry picked from commit eab3b3f1c60afecfb4db3c3619109684cb04bd60) Co-authored-by: William Chargin files: A Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst M Lib/gzip.py M Lib/test/test_gzip.py diff --git a/Lib/gzip.py b/Lib/gzip.py index 2968f475efad3..87b553df66cd8 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -201,7 +201,7 @@ def __init__(self, filename=None, mode=None, self.fileobj = fileobj if self.mode == WRITE: - self._write_gzip_header() + self._write_gzip_header(compresslevel) @property def filename(self): @@ -228,7 +228,7 @@ def _init_write(self, filename): self.bufsize = 0 self.offset = 0 # Current file offset for seek(), tell(), etc - def _write_gzip_header(self): + def _write_gzip_header(self, compresslevel): self.fileobj.write(b'\037\213') # magic header self.fileobj.write(b'\010') # compression method try: @@ -249,7 +249,13 @@ def _write_gzip_header(self): if mtime is None: mtime = time.time() write32u(self.fileobj, int(mtime)) - self.fileobj.write(b'\002') + if compresslevel == _COMPRESS_LEVEL_BEST: + xfl = b'\002' + elif compresslevel == _COMPRESS_LEVEL_FAST: + xfl = b'\004' + else: + xfl = b'\000' + self.fileobj.write(xfl) self.fileobj.write(b'\377') if fname: self.fileobj.write(fname + b'\000') diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 48a36a30913f6..646828621a53c 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -358,6 +358,26 @@ def test_metadata(self): isizeBytes = fRead.read(4) self.assertEqual(isizeBytes, struct.pack(' https://github.com/python/cpython/commit/629023c05be24fa2f01c914c739aaa5a61a0304c commit: 629023c05be24fa2f01c914c739aaa5a61a0304c branch: master author: Victor Stinner committer: GitHub date: 2020-01-21T12:47:29+01:00 summary: bpo-33387: Fix compiler warning in frame_block_unwind() (GH-18099) Replace int with intptr_t to fix the warning: objects\frameobject.c(341): warning C4244: 'initializing': conversion from '__int64' to 'int', possible loss of data files: M Objects/frameobject.c diff --git a/Objects/frameobject.c b/Objects/frameobject.c index d7acb41f7a3a1..4469e3c20cd2f 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -338,7 +338,7 @@ frame_block_unwind(PyFrameObject *f) assert(f->f_iblock > 0); f->f_iblock--; PyTryBlock *b = &f->f_blockstack[f->f_iblock]; - int delta = (f->f_stacktop - f->f_valuestack) - b->b_level; + intptr_t delta = (f->f_stacktop - f->f_valuestack) - b->b_level; while (delta > 0) { frame_stack_pop(f); delta--; From webhook-mailer at python.org Tue Jan 21 06:48:20 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 Jan 2020 11:48:20 -0000 Subject: [Python-checkins] Move test_math tests (GH-18098) Message-ID: https://github.com/python/cpython/commit/59e2d26b258c12f18d8d2e789ef741703d6c52d5 commit: 59e2d26b258c12f18d8d2e789ef741703d6c52d5 branch: master author: Victor Stinner committer: GitHub date: 2020-01-21T12:48:16+01:00 summary: Move test_math tests (GH-18098) testPerm() and testComb() belong to MathTests, not to IsCloseTests(). test_nextafter() and test_ulp() now use assertIsNaN(). files: M Lib/test/test_math.py diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index e96fd745970a1..b3301f6a5cf74 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1746,19 +1746,139 @@ def _naive_prod(iterable, start=1): self.assertEqual(type(prod([1, decimal.Decimal(2.0), 3, 4, 5, 6])), decimal.Decimal) - # Custom assertions. + def testPerm(self): + perm = math.perm + factorial = math.factorial + # Test if factorial definition is satisfied + for n in range(100): + for k in range(n + 1): + self.assertEqual(perm(n, k), + factorial(n) // factorial(n - k)) - def assertIsNaN(self, value): - if not math.isnan(value): - self.fail("Expected a NaN, got {!r}.".format(value)) + # Test for Pascal's identity + for n in range(1, 100): + for k in range(1, n): + self.assertEqual(perm(n, k), perm(n - 1, k - 1) * k + perm(n - 1, k)) - def assertEqualSign(self, x, y): - """Similar to assertEqual(), but compare also the sign. + # Test corner cases + for n in range(1, 100): + self.assertEqual(perm(n, 0), 1) + self.assertEqual(perm(n, 1), n) + self.assertEqual(perm(n, n), factorial(n)) - Function useful to compare signed zeros. - """ - self.assertEqual(x, y) - self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + # Test one argument form + for n in range(20): + self.assertEqual(perm(n), factorial(n)) + self.assertEqual(perm(n, None), factorial(n)) + + # Raises TypeError if any argument is non-integer or argument count is + # not 1 or 2 + self.assertRaises(TypeError, perm, 10, 1.0) + self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0)) + self.assertRaises(TypeError, perm, 10, "1") + self.assertRaises(TypeError, perm, 10.0, 1) + self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1) + self.assertRaises(TypeError, perm, "10", 1) + + self.assertRaises(TypeError, perm) + self.assertRaises(TypeError, perm, 10, 1, 3) + self.assertRaises(TypeError, perm) + + # Raises Value error if not k or n are negative numbers + self.assertRaises(ValueError, perm, -1, 1) + self.assertRaises(ValueError, perm, -2**1000, 1) + self.assertRaises(ValueError, perm, 1, -1) + self.assertRaises(ValueError, perm, 1, -2**1000) + + # Returns zero if k is greater than n + self.assertEqual(perm(1, 2), 0) + self.assertEqual(perm(1, 2**1000), 0) + + n = 2**1000 + self.assertEqual(perm(n, 0), 1) + self.assertEqual(perm(n, 1), n) + self.assertEqual(perm(n, 2), n * (n-1)) + if support.check_impl_detail(cpython=True): + self.assertRaises(OverflowError, perm, n, n) + + for n, k in (True, True), (True, False), (False, False): + self.assertEqual(perm(n, k), 1) + self.assertIs(type(perm(n, k)), int) + self.assertEqual(perm(IntSubclass(5), IntSubclass(2)), 20) + self.assertEqual(perm(MyIndexable(5), MyIndexable(2)), 20) + for k in range(3): + self.assertIs(type(perm(IntSubclass(5), IntSubclass(k))), int) + self.assertIs(type(perm(MyIndexable(5), MyIndexable(k))), int) + + def testComb(self): + comb = math.comb + factorial = math.factorial + # Test if factorial definition is satisfied + for n in range(100): + for k in range(n + 1): + self.assertEqual(comb(n, k), factorial(n) + // (factorial(k) * factorial(n - k))) + + # Test for Pascal's identity + for n in range(1, 100): + for k in range(1, n): + self.assertEqual(comb(n, k), comb(n - 1, k - 1) + comb(n - 1, k)) + + # Test corner cases + for n in range(100): + self.assertEqual(comb(n, 0), 1) + self.assertEqual(comb(n, n), 1) + + for n in range(1, 100): + self.assertEqual(comb(n, 1), n) + self.assertEqual(comb(n, n - 1), n) + + # Test Symmetry + for n in range(100): + for k in range(n // 2): + self.assertEqual(comb(n, k), comb(n, n - k)) + + # Raises TypeError if any argument is non-integer or argument count is + # not 2 + self.assertRaises(TypeError, comb, 10, 1.0) + self.assertRaises(TypeError, comb, 10, decimal.Decimal(1.0)) + self.assertRaises(TypeError, comb, 10, "1") + self.assertRaises(TypeError, comb, 10.0, 1) + self.assertRaises(TypeError, comb, decimal.Decimal(10.0), 1) + self.assertRaises(TypeError, comb, "10", 1) + + self.assertRaises(TypeError, comb, 10) + self.assertRaises(TypeError, comb, 10, 1, 3) + self.assertRaises(TypeError, comb) + + # Raises Value error if not k or n are negative numbers + self.assertRaises(ValueError, comb, -1, 1) + self.assertRaises(ValueError, comb, -2**1000, 1) + self.assertRaises(ValueError, comb, 1, -1) + self.assertRaises(ValueError, comb, 1, -2**1000) + + # Returns zero if k is greater than n + self.assertEqual(comb(1, 2), 0) + self.assertEqual(comb(1, 2**1000), 0) + + n = 2**1000 + self.assertEqual(comb(n, 0), 1) + self.assertEqual(comb(n, 1), n) + self.assertEqual(comb(n, 2), n * (n-1) // 2) + self.assertEqual(comb(n, n), 1) + self.assertEqual(comb(n, n-1), n) + self.assertEqual(comb(n, n-2), n * (n-1) // 2) + if support.check_impl_detail(cpython=True): + self.assertRaises(OverflowError, comb, n, n//2) + + for n, k in (True, True), (True, False), (False, False): + self.assertEqual(comb(n, k), 1) + self.assertIs(type(comb(n, k)), int) + self.assertEqual(comb(IntSubclass(5), IntSubclass(2)), 10) + self.assertEqual(comb(MyIndexable(5), MyIndexable(2)), 10) + for k in range(3): + self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) + self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) @requires_IEEE_754 def test_nextafter(self): @@ -1802,9 +1922,9 @@ def test_nextafter(self): self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) # NaN - self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) - self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) - self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) + self.assertIsNaN(math.nextafter(NAN, 1.0)) + self.assertIsNaN(math.nextafter(1.0, NAN)) + self.assertIsNaN(math.nextafter(NAN, NAN)) @requires_IEEE_754 def test_ulp(self): @@ -1822,13 +1942,27 @@ def test_ulp(self): # special cases self.assertEqual(math.ulp(INF), INF) - self.assertTrue(math.isnan(math.ulp(math.nan))) + self.assertIsNaN(math.ulp(math.nan)) # negative number: ulp(-x) == ulp(x) for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): with self.subTest(x=x): self.assertEqual(math.ulp(-x), math.ulp(x)) + # Custom assertions. + + def assertIsNaN(self, value): + if not math.isnan(value): + self.fail("Expected a NaN, got {!r}.".format(value)) + + def assertEqualSign(self, x, y): + """Similar to assertEqual(), but compare also the sign with copysign(). + + Function useful to compare signed zeros. + """ + self.assertEqual(x, y) + self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + class IsCloseTests(unittest.TestCase): isclose = math.isclose # subclasses should override this @@ -1952,140 +2086,6 @@ def test_fractions(self): self.assertAllClose(fraction_examples, rel_tol=1e-8) self.assertAllNotClose(fraction_examples, rel_tol=1e-9) - def testPerm(self): - perm = math.perm - factorial = math.factorial - # Test if factorial definition is satisfied - for n in range(100): - for k in range(n + 1): - self.assertEqual(perm(n, k), - factorial(n) // factorial(n - k)) - - # Test for Pascal's identity - for n in range(1, 100): - for k in range(1, n): - self.assertEqual(perm(n, k), perm(n - 1, k - 1) * k + perm(n - 1, k)) - - # Test corner cases - for n in range(1, 100): - self.assertEqual(perm(n, 0), 1) - self.assertEqual(perm(n, 1), n) - self.assertEqual(perm(n, n), factorial(n)) - - # Test one argument form - for n in range(20): - self.assertEqual(perm(n), factorial(n)) - self.assertEqual(perm(n, None), factorial(n)) - - # Raises TypeError if any argument is non-integer or argument count is - # not 1 or 2 - self.assertRaises(TypeError, perm, 10, 1.0) - self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0)) - self.assertRaises(TypeError, perm, 10, "1") - self.assertRaises(TypeError, perm, 10.0, 1) - self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1) - self.assertRaises(TypeError, perm, "10", 1) - - self.assertRaises(TypeError, perm) - self.assertRaises(TypeError, perm, 10, 1, 3) - self.assertRaises(TypeError, perm) - - # Raises Value error if not k or n are negative numbers - self.assertRaises(ValueError, perm, -1, 1) - self.assertRaises(ValueError, perm, -2**1000, 1) - self.assertRaises(ValueError, perm, 1, -1) - self.assertRaises(ValueError, perm, 1, -2**1000) - - # Returns zero if k is greater than n - self.assertEqual(perm(1, 2), 0) - self.assertEqual(perm(1, 2**1000), 0) - - n = 2**1000 - self.assertEqual(perm(n, 0), 1) - self.assertEqual(perm(n, 1), n) - self.assertEqual(perm(n, 2), n * (n-1)) - if support.check_impl_detail(cpython=True): - self.assertRaises(OverflowError, perm, n, n) - - for n, k in (True, True), (True, False), (False, False): - self.assertEqual(perm(n, k), 1) - self.assertIs(type(perm(n, k)), int) - self.assertEqual(perm(IntSubclass(5), IntSubclass(2)), 20) - self.assertEqual(perm(MyIndexable(5), MyIndexable(2)), 20) - for k in range(3): - self.assertIs(type(perm(IntSubclass(5), IntSubclass(k))), int) - self.assertIs(type(perm(MyIndexable(5), MyIndexable(k))), int) - - def testComb(self): - comb = math.comb - factorial = math.factorial - # Test if factorial definition is satisfied - for n in range(100): - for k in range(n + 1): - self.assertEqual(comb(n, k), factorial(n) - // (factorial(k) * factorial(n - k))) - - # Test for Pascal's identity - for n in range(1, 100): - for k in range(1, n): - self.assertEqual(comb(n, k), comb(n - 1, k - 1) + comb(n - 1, k)) - - # Test corner cases - for n in range(100): - self.assertEqual(comb(n, 0), 1) - self.assertEqual(comb(n, n), 1) - - for n in range(1, 100): - self.assertEqual(comb(n, 1), n) - self.assertEqual(comb(n, n - 1), n) - - # Test Symmetry - for n in range(100): - for k in range(n // 2): - self.assertEqual(comb(n, k), comb(n, n - k)) - - # Raises TypeError if any argument is non-integer or argument count is - # not 2 - self.assertRaises(TypeError, comb, 10, 1.0) - self.assertRaises(TypeError, comb, 10, decimal.Decimal(1.0)) - self.assertRaises(TypeError, comb, 10, "1") - self.assertRaises(TypeError, comb, 10.0, 1) - self.assertRaises(TypeError, comb, decimal.Decimal(10.0), 1) - self.assertRaises(TypeError, comb, "10", 1) - - self.assertRaises(TypeError, comb, 10) - self.assertRaises(TypeError, comb, 10, 1, 3) - self.assertRaises(TypeError, comb) - - # Raises Value error if not k or n are negative numbers - self.assertRaises(ValueError, comb, -1, 1) - self.assertRaises(ValueError, comb, -2**1000, 1) - self.assertRaises(ValueError, comb, 1, -1) - self.assertRaises(ValueError, comb, 1, -2**1000) - - # Returns zero if k is greater than n - self.assertEqual(comb(1, 2), 0) - self.assertEqual(comb(1, 2**1000), 0) - - n = 2**1000 - self.assertEqual(comb(n, 0), 1) - self.assertEqual(comb(n, 1), n) - self.assertEqual(comb(n, 2), n * (n-1) // 2) - self.assertEqual(comb(n, n), 1) - self.assertEqual(comb(n, n-1), n) - self.assertEqual(comb(n, n-2), n * (n-1) // 2) - if support.check_impl_detail(cpython=True): - self.assertRaises(OverflowError, comb, n, n//2) - - for n, k in (True, True), (True, False), (False, False): - self.assertEqual(comb(n, k), 1) - self.assertIs(type(comb(n, k)), int) - self.assertEqual(comb(IntSubclass(5), IntSubclass(2)), 10) - self.assertEqual(comb(MyIndexable(5), MyIndexable(2)), 10) - for k in range(3): - self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) - self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) - def test_main(): from doctest import DocFileSuite From webhook-mailer at python.org Tue Jan 21 09:04:40 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 Jan 2020 14:04:40 -0000 Subject: [Python-checkins] Move test_math tests (GH-18098) (GH-18102) Message-ID: https://github.com/python/cpython/commit/f4e3e1c4d410a8f98ee300eddce77922e04592eb commit: f4e3e1c4d410a8f98ee300eddce77922e04592eb branch: 3.8 author: Victor Stinner committer: GitHub date: 2020-01-21T15:04:33+01:00 summary: Move test_math tests (GH-18098) (GH-18102) testPerm() and testComb() belong to MathTests, not to IsCloseTests(). (cherry picked from commit 59e2d26b258c12f18d8d2e789ef741703d6c52d5) files: M Lib/test/test_math.py diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index ac978247fc917..6abaeead5c20c 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1744,135 +1744,6 @@ def _naive_prod(iterable, start=1): self.assertEqual(type(prod([1, decimal.Decimal(2.0), 3, 4, 5, 6])), decimal.Decimal) - # Custom assertions. - - def assertIsNaN(self, value): - if not math.isnan(value): - self.fail("Expected a NaN, got {!r}.".format(value)) - - -class IsCloseTests(unittest.TestCase): - isclose = math.isclose # subclasses should override this - - def assertIsClose(self, a, b, *args, **kwargs): - self.assertTrue(self.isclose(a, b, *args, **kwargs), - msg="%s and %s should be close!" % (a, b)) - - def assertIsNotClose(self, a, b, *args, **kwargs): - self.assertFalse(self.isclose(a, b, *args, **kwargs), - msg="%s and %s should not be close!" % (a, b)) - - def assertAllClose(self, examples, *args, **kwargs): - for a, b in examples: - self.assertIsClose(a, b, *args, **kwargs) - - def assertAllNotClose(self, examples, *args, **kwargs): - for a, b in examples: - self.assertIsNotClose(a, b, *args, **kwargs) - - def test_negative_tolerances(self): - # ValueError should be raised if either tolerance is less than zero - with self.assertRaises(ValueError): - self.assertIsClose(1, 1, rel_tol=-1e-100) - with self.assertRaises(ValueError): - self.assertIsClose(1, 1, rel_tol=1e-100, abs_tol=-1e10) - - def test_identical(self): - # identical values must test as close - identical_examples = [(2.0, 2.0), - (0.1e200, 0.1e200), - (1.123e-300, 1.123e-300), - (12345, 12345.0), - (0.0, -0.0), - (345678, 345678)] - self.assertAllClose(identical_examples, rel_tol=0.0, abs_tol=0.0) - - def test_eight_decimal_places(self): - # examples that are close to 1e-8, but not 1e-9 - eight_decimal_places_examples = [(1e8, 1e8 + 1), - (-1e-8, -1.000000009e-8), - (1.12345678, 1.12345679)] - self.assertAllClose(eight_decimal_places_examples, rel_tol=1e-8) - self.assertAllNotClose(eight_decimal_places_examples, rel_tol=1e-9) - - def test_near_zero(self): - # values close to zero - near_zero_examples = [(1e-9, 0.0), - (-1e-9, 0.0), - (-1e-150, 0.0)] - # these should not be close to any rel_tol - self.assertAllNotClose(near_zero_examples, rel_tol=0.9) - # these should be close to abs_tol=1e-8 - self.assertAllClose(near_zero_examples, abs_tol=1e-8) - - def test_identical_infinite(self): - # these are close regardless of tolerance -- i.e. they are equal - self.assertIsClose(INF, INF) - self.assertIsClose(INF, INF, abs_tol=0.0) - self.assertIsClose(NINF, NINF) - self.assertIsClose(NINF, NINF, abs_tol=0.0) - - def test_inf_ninf_nan(self): - # these should never be close (following IEEE 754 rules for equality) - not_close_examples = [(NAN, NAN), - (NAN, 1e-100), - (1e-100, NAN), - (INF, NAN), - (NAN, INF), - (INF, NINF), - (INF, 1.0), - (1.0, INF), - (INF, 1e308), - (1e308, INF)] - # use largest reasonable tolerance - self.assertAllNotClose(not_close_examples, abs_tol=0.999999999999999) - - def test_zero_tolerance(self): - # test with zero tolerance - zero_tolerance_close_examples = [(1.0, 1.0), - (-3.4, -3.4), - (-1e-300, -1e-300)] - self.assertAllClose(zero_tolerance_close_examples, rel_tol=0.0) - - zero_tolerance_not_close_examples = [(1.0, 1.000000000000001), - (0.99999999999999, 1.0), - (1.0e200, .999999999999999e200)] - self.assertAllNotClose(zero_tolerance_not_close_examples, rel_tol=0.0) - - def test_asymmetry(self): - # test the asymmetry example from PEP 485 - self.assertAllClose([(9, 10), (10, 9)], rel_tol=0.1) - - def test_integers(self): - # test with integer values - integer_examples = [(100000001, 100000000), - (123456789, 123456788)] - - self.assertAllClose(integer_examples, rel_tol=1e-8) - self.assertAllNotClose(integer_examples, rel_tol=1e-9) - - def test_decimals(self): - # test with Decimal values - from decimal import Decimal - - decimal_examples = [(Decimal('1.00000001'), Decimal('1.0')), - (Decimal('1.00000001e-20'), Decimal('1.0e-20')), - (Decimal('1.00000001e-100'), Decimal('1.0e-100')), - (Decimal('1.00000001e20'), Decimal('1.0e20'))] - self.assertAllClose(decimal_examples, rel_tol=1e-8) - self.assertAllNotClose(decimal_examples, rel_tol=1e-9) - - def test_fractions(self): - # test with Fraction values - from fractions import Fraction - - fraction_examples = [ - (Fraction(1, 100000000) + 1, Fraction(1)), - (Fraction(100000001), Fraction(100000000)), - (Fraction(10**8 + 1, 10**28), Fraction(1, 10**20))] - self.assertAllClose(fraction_examples, rel_tol=1e-8) - self.assertAllNotClose(fraction_examples, rel_tol=1e-9) - def testPerm(self): perm = math.perm factorial = math.factorial @@ -2007,6 +1878,135 @@ def testComb(self): self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) + # Custom assertions. + + def assertIsNaN(self, value): + if not math.isnan(value): + self.fail("Expected a NaN, got {!r}.".format(value)) + + +class IsCloseTests(unittest.TestCase): + isclose = math.isclose # subclasses should override this + + def assertIsClose(self, a, b, *args, **kwargs): + self.assertTrue(self.isclose(a, b, *args, **kwargs), + msg="%s and %s should be close!" % (a, b)) + + def assertIsNotClose(self, a, b, *args, **kwargs): + self.assertFalse(self.isclose(a, b, *args, **kwargs), + msg="%s and %s should not be close!" % (a, b)) + + def assertAllClose(self, examples, *args, **kwargs): + for a, b in examples: + self.assertIsClose(a, b, *args, **kwargs) + + def assertAllNotClose(self, examples, *args, **kwargs): + for a, b in examples: + self.assertIsNotClose(a, b, *args, **kwargs) + + def test_negative_tolerances(self): + # ValueError should be raised if either tolerance is less than zero + with self.assertRaises(ValueError): + self.assertIsClose(1, 1, rel_tol=-1e-100) + with self.assertRaises(ValueError): + self.assertIsClose(1, 1, rel_tol=1e-100, abs_tol=-1e10) + + def test_identical(self): + # identical values must test as close + identical_examples = [(2.0, 2.0), + (0.1e200, 0.1e200), + (1.123e-300, 1.123e-300), + (12345, 12345.0), + (0.0, -0.0), + (345678, 345678)] + self.assertAllClose(identical_examples, rel_tol=0.0, abs_tol=0.0) + + def test_eight_decimal_places(self): + # examples that are close to 1e-8, but not 1e-9 + eight_decimal_places_examples = [(1e8, 1e8 + 1), + (-1e-8, -1.000000009e-8), + (1.12345678, 1.12345679)] + self.assertAllClose(eight_decimal_places_examples, rel_tol=1e-8) + self.assertAllNotClose(eight_decimal_places_examples, rel_tol=1e-9) + + def test_near_zero(self): + # values close to zero + near_zero_examples = [(1e-9, 0.0), + (-1e-9, 0.0), + (-1e-150, 0.0)] + # these should not be close to any rel_tol + self.assertAllNotClose(near_zero_examples, rel_tol=0.9) + # these should be close to abs_tol=1e-8 + self.assertAllClose(near_zero_examples, abs_tol=1e-8) + + def test_identical_infinite(self): + # these are close regardless of tolerance -- i.e. they are equal + self.assertIsClose(INF, INF) + self.assertIsClose(INF, INF, abs_tol=0.0) + self.assertIsClose(NINF, NINF) + self.assertIsClose(NINF, NINF, abs_tol=0.0) + + def test_inf_ninf_nan(self): + # these should never be close (following IEEE 754 rules for equality) + not_close_examples = [(NAN, NAN), + (NAN, 1e-100), + (1e-100, NAN), + (INF, NAN), + (NAN, INF), + (INF, NINF), + (INF, 1.0), + (1.0, INF), + (INF, 1e308), + (1e308, INF)] + # use largest reasonable tolerance + self.assertAllNotClose(not_close_examples, abs_tol=0.999999999999999) + + def test_zero_tolerance(self): + # test with zero tolerance + zero_tolerance_close_examples = [(1.0, 1.0), + (-3.4, -3.4), + (-1e-300, -1e-300)] + self.assertAllClose(zero_tolerance_close_examples, rel_tol=0.0) + + zero_tolerance_not_close_examples = [(1.0, 1.000000000000001), + (0.99999999999999, 1.0), + (1.0e200, .999999999999999e200)] + self.assertAllNotClose(zero_tolerance_not_close_examples, rel_tol=0.0) + + def test_asymmetry(self): + # test the asymmetry example from PEP 485 + self.assertAllClose([(9, 10), (10, 9)], rel_tol=0.1) + + def test_integers(self): + # test with integer values + integer_examples = [(100000001, 100000000), + (123456789, 123456788)] + + self.assertAllClose(integer_examples, rel_tol=1e-8) + self.assertAllNotClose(integer_examples, rel_tol=1e-9) + + def test_decimals(self): + # test with Decimal values + from decimal import Decimal + + decimal_examples = [(Decimal('1.00000001'), Decimal('1.0')), + (Decimal('1.00000001e-20'), Decimal('1.0e-20')), + (Decimal('1.00000001e-100'), Decimal('1.0e-100')), + (Decimal('1.00000001e20'), Decimal('1.0e20'))] + self.assertAllClose(decimal_examples, rel_tol=1e-8) + self.assertAllNotClose(decimal_examples, rel_tol=1e-9) + + def test_fractions(self): + # test with Fraction values + from fractions import Fraction + + fraction_examples = [ + (Fraction(1, 100000000) + 1, Fraction(1)), + (Fraction(100000001), Fraction(100000000)), + (Fraction(10**8 + 1, 10**28), Fraction(1, 10**20))] + self.assertAllClose(fraction_examples, rel_tol=1e-8) + self.assertAllNotClose(fraction_examples, rel_tol=1e-9) + def test_main(): from doctest import DocFileSuite From webhook-mailer at python.org Tue Jan 21 10:13:19 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 Jan 2020 15:13:19 -0000 Subject: [Python-checkins] bpo-39413: Implement os.unsetenv() on Windows (GH-18104) Message-ID: https://github.com/python/cpython/commit/56cd3710a1ea3ba872d345ea1bebc86ed08bc8b8 commit: 56cd3710a1ea3ba872d345ea1bebc86ed08bc8b8 branch: master author: Victor Stinner committer: GitHub date: 2020-01-21T16:13:09+01:00 summary: bpo-39413: Implement os.unsetenv() on Windows (GH-18104) The os.unsetenv() function is now also available on Windows. It is implemented with SetEnvironmentVariableW(name, NULL). files: A Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst M Doc/library/os.rst M Doc/whatsnew/3.9.rst M Lib/test/test_os.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4fec647828e25..de3e5603e109f 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -645,6 +645,9 @@ process and user. .. availability:: most flavors of Unix, Windows. + .. versionchanged:: 3.9 + The function is now also available on Windows. + .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f40685c932793..ab27c488ea30b 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -216,6 +216,9 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. +The :func:`os.unsetenv` function is now also available on Windows. +(Contributed by Victor Stinner in :issue:`39413`.) + poplib ------ diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 82c441c204835..50535da0a2bfc 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -956,14 +956,9 @@ def test_environb(self): # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) def test_unset_error(self): - if sys.platform == "win32": - # an environment variable is limited to 32,767 characters - key = 'x' * 50000 - self.assertRaises(ValueError, os.environ.__delitem__, key) - else: - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + # "=" is not allowed in a variable name + key = 'key=' + self.assertRaises(OSError, os.environ.__delitem__, key) def test_key_type(self): missing = 'missingkey' diff --git a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst new file mode 100644 index 0000000000000..a185ab5efe2ed --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst @@ -0,0 +1 @@ +The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index aa4756a620aae..661d91afb7eb6 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6125,7 +6125,43 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ -#if defined(HAVE_UNSETENV) +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os_unsetenv__doc__, +"unsetenv($module, name, /)\n" +"--\n" +"\n" +"Delete an environment variable."); + +#define OS_UNSETENV_METHODDEF \ + {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name); + +static PyObject * +os_unsetenv(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("unsetenv", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + name = arg; + return_value = os_unsetenv_impl(module, name); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6157,7 +6193,7 @@ os_unsetenv(PyObject *module, PyObject *arg) return return_value; } -#endif /* defined(HAVE_UNSETENV) */ +#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8773,4 +8809,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6e739a2715712e88 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 322c2159812cd..d2047d9c2ac1f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10163,7 +10163,49 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) #endif /* HAVE_PUTENV */ -#ifdef HAVE_UNSETENV +#ifdef MS_WINDOWS +/*[clinic input] +os.unsetenv + name: unicode + / + +Delete an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ +{ + /* PyUnicode_AsWideCharString() rejects embedded null characters */ + wchar_t *name_str = PyUnicode_AsWideCharString(name, NULL); + if (name_str == NULL) { + return NULL; + } + + BOOL ok = SetEnvironmentVariableW(name_str, NULL); + PyMem_Free(name_str); + + if (!ok) { + return PyErr_SetFromWindowsErr(0); + } + + /* Remove the key from posix_putenv_garbage; + * this will cause it to be collected. This has to + * happen after the real unsetenv() call because the + * old value was still accessible until then. + */ + if (PyDict_DelItem(_posixstate(module)->posix_putenv_garbage, name)) { + /* really not much we can do; just leak */ + if (!PyErr_ExceptionMatches(PyExc_KeyError)) { + return NULL; + } + PyErr_Clear(); + } + + Py_RETURN_NONE; +} +/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ +#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) /*[clinic input] os.unsetenv name: FSConverter From webhook-mailer at python.org Tue Jan 21 13:25:47 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 21 Jan 2020 18:25:47 -0000 Subject: [Python-checkins] bpo-39406: Add PY_PUTENV_DICT macro to posixmodule.c (GH-18106) Message-ID: https://github.com/python/cpython/commit/623ed6171eae35af7fd2e804dfd9c832c05c5d48 commit: 623ed6171eae35af7fd2e804dfd9c832c05c5d48 branch: master author: Victor Stinner committer: GitHub date: 2020-01-21T19:25:32+01:00 summary: bpo-39406: Add PY_PUTENV_DICT macro to posixmodule.c (GH-18106) Rename posix_putenv_garbage to putenv_dict. files: M Modules/posixmodule.c diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d2047d9c2ac1f..5a0c8a311a790 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,9 +819,19 @@ dir_fd_converter(PyObject *o, void *p) } } +#ifdef HAVE_PUTENV +# define PY_PUTENV_DICT +#endif + typedef struct { PyObject *billion; - PyObject *posix_putenv_garbage; +#ifdef PY_PUTENV_DICT + /* putenv() and _wputenv() requires that the caller manages the environment + variable memory. Use a Python dictionary for that: name => env, where + env is a string like "name=value". On Windows, dict keys and values are + Unicode strings. On Unix, they are bytes strings. */ + PyObject *putenv_dict; +#endif PyObject *DirEntryType; PyObject *ScandirIteratorType; #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2105,7 +2115,9 @@ static int _posix_clear(PyObject *module) { Py_CLEAR(_posixstate(module)->billion); - Py_CLEAR(_posixstate(module)->posix_putenv_garbage); +#ifdef PY_PUTENV_DICT + Py_CLEAR(_posixstate(module)->putenv_dict); +#endif Py_CLEAR(_posixstate(module)->DirEntryType); Py_CLEAR(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2130,7 +2142,9 @@ static int _posix_traverse(PyObject *module, visitproc visit, void *arg) { Py_VISIT(_posixstate(module)->billion); - Py_VISIT(_posixstate(module)->posix_putenv_garbage); +#ifdef PY_PUTENV_DICT + Py_VISIT(_posixstate(module)->putenv_dict); +#endif Py_VISIT(_posixstate(module)->DirEntryType); Py_VISIT(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -10047,23 +10061,26 @@ os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, } #endif /* HAVE_POSIX_FADVISE && !POSIX_FADVISE_AIX_BUG */ -#ifdef HAVE_PUTENV +#ifdef PY_PUTENV_DICT static void -posix_putenv_garbage_setitem(PyObject *name, PyObject *value) +posix_putenv_dict_setitem(PyObject *name, PyObject *value) { - /* Install the first arg and newstr in posix_putenv_garbage; + /* Install the first arg and newstr in putenv_dict; * this will cause previous value to be collected. This has to * happen after the real putenv() call because the old value * was still accessible until then. */ - if (PyDict_SetItem(_posixstate_global->posix_putenv_garbage, name, value)) + if (PyDict_SetItem(_posixstate_global->putenv_dict, name, value)) /* really not much we can do; just leak */ PyErr_Clear(); else Py_DECREF(value); } +#endif /* PY_PUTENV_DICT */ +#ifdef HAVE_PUTENV + #ifdef MS_WINDOWS /*[clinic input] os.putenv @@ -10114,7 +10131,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) goto error; } - posix_putenv_garbage_setitem(name, unicode); + posix_putenv_dict_setitem(name, unicode); Py_RETURN_NONE; error: @@ -10156,7 +10173,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) return posix_error(); } - posix_putenv_garbage_setitem(name, bytes); + posix_putenv_dict_setitem(name, bytes); Py_RETURN_NONE; } #endif /* MS_WINDOWS */ @@ -10189,18 +10206,20 @@ os_unsetenv_impl(PyObject *module, PyObject *name) return PyErr_SetFromWindowsErr(0); } - /* Remove the key from posix_putenv_garbage; +#ifdef PY_PUTENV_DICT + /* Remove the key from putenv_dict; * this will cause it to be collected. This has to * happen after the real unsetenv() call because the * old value was still accessible until then. */ - if (PyDict_DelItem(_posixstate(module)->posix_putenv_garbage, name)) { + if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { /* really not much we can do; just leak */ if (!PyErr_ExceptionMatches(PyExc_KeyError)) { return NULL; } PyErr_Clear(); } +#endif Py_RETURN_NONE; } @@ -10230,18 +10249,21 @@ os_unsetenv_impl(PyObject *module, PyObject *name) return posix_error(); #endif - /* Remove the key from posix_putenv_garbage; +#ifdef PY_PUTENV_DICT + /* Remove the key from putenv_dict; * this will cause it to be collected. This has to * happen after the real unsetenv() call because the * old value was still accessible until then. */ - if (PyDict_DelItem(_posixstate(module)->posix_putenv_garbage, name)) { + if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { /* really not much we can do; just leak */ if (!PyErr_ExceptionMatches(PyExc_KeyError)) { return NULL; } PyErr_Clear(); } +#endif + Py_RETURN_NONE; } #endif /* HAVE_UNSETENV */ @@ -14538,10 +14560,10 @@ INITFUNC(void) Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); -#ifdef HAVE_PUTENV +#ifdef PY_PUTENV_DICT /* Save putenv() parameters as values here, so we can collect them when they * get re-set with another call for the same key. */ - _posixstate(m)->posix_putenv_garbage = PyDict_New(); + _posixstate(m)->putenv_dict = PyDict_New(); #endif #if defined(HAVE_WAITID) && !defined(__APPLE__) From webhook-mailer at python.org Tue Jan 21 14:14:18 2020 From: webhook-mailer at python.org (Mark Dickinson) Date: Tue, 21 Jan 2020 19:14:18 -0000 Subject: [Python-checkins] PyLong_AsLongLong() docs should say 'long long' (#18082) Message-ID: https://github.com/python/cpython/commit/47be7d0108b4021ede111dbd15a095c725be46b7 commit: 47be7d0108b4021ede111dbd15a095c725be46b7 branch: master author: Keith Erskine committer: Mark Dickinson date: 2020-01-21T19:14:13Z summary: PyLong_AsLongLong() docs should say 'long long' (#18082) files: M Doc/c-api/long.rst diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index c360104592078..c5c2aa60dcc35 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -177,7 +177,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. :c:type:`PyLongObject`. Raise :exc:`OverflowError` if the value of *obj* is out of range for a - :c:type:`long`. + :c:type:`long long`. Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. From webhook-mailer at python.org Tue Jan 21 14:21:48 2020 From: webhook-mailer at python.org (Mark Dickinson) Date: Tue, 21 Jan 2020 19:21:48 -0000 Subject: [Python-checkins] PyLong_AsLongLong() docs should say 'long long' (GH-18082) (#18109) Message-ID: https://github.com/python/cpython/commit/d76ff72b4da3929e3f3950ad19c14bb785994fd4 commit: d76ff72b4da3929e3f3950ad19c14bb785994fd4 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Mark Dickinson date: 2020-01-21T19:21:41Z summary: PyLong_AsLongLong() docs should say 'long long' (GH-18082) (#18109) (cherry picked from commit 47be7d0108b4021ede111dbd15a095c725be46b7) Co-authored-by: Keith Erskine Co-authored-by: Keith Erskine files: M Doc/c-api/long.rst diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 15fccb86a403e..08cf6a9bf25a4 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -164,7 +164,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. (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:type:`long long`. Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. From webhook-mailer at python.org Tue Jan 21 14:22:26 2020 From: webhook-mailer at python.org (Mark Dickinson) Date: Tue, 21 Jan 2020 19:22:26 -0000 Subject: [Python-checkins] PyLong_AsLongLong() docs should say 'long long' (GH-18082) (GH-18110) Message-ID: https://github.com/python/cpython/commit/41b3e879303d147bb46f0d230d5a101bca40bb9f commit: 41b3e879303d147bb46f0d230d5a101bca40bb9f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Mark Dickinson date: 2020-01-21T19:22:21Z summary: PyLong_AsLongLong() docs should say 'long long' (GH-18082) (GH-18110) (cherry picked from commit 47be7d0108b4021ede111dbd15a095c725be46b7) Co-authored-by: Keith Erskine Co-authored-by: Keith Erskine files: M Doc/c-api/long.rst diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 33f6b3be58307..f41d419bd3775 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -179,7 +179,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. :c:type:`PyLongObject`. Raise :exc:`OverflowError` if the value of *obj* is out of range for a - :c:type:`long`. + :c:type:`long long`. Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. From webhook-mailer at python.org Tue Jan 21 21:49:39 2020 From: webhook-mailer at python.org (Benjamin Peterson) Date: Wed, 22 Jan 2020 02:49:39 -0000 Subject: [Python-checkins] closes bpo-39415: Remove unused codes from longobject.c complexobject.c floatobject.c. (GH-18105) Message-ID: https://github.com/python/cpython/commit/0d5eac8c327251f8edde5261cee43975d81311f6 commit: 0d5eac8c327251f8edde5261cee43975d81311f6 branch: master author: Dong-hee Na committer: Benjamin Peterson date: 2020-01-21T18:49:30-08:00 summary: closes bpo-39415: Remove unused codes from longobject.c complexobject.c floatobject.c. (GH-18105) files: M Objects/complexobject.c M Objects/floatobject.c M Objects/longobject.c diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 367752db78f5f..f1b76673efd4c 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -731,29 +731,9 @@ complex__format__(PyObject* self, PyObject* args) return _PyUnicodeWriter_Finish(&writer); } -#if 0 -static PyObject * -complex_is_finite(PyObject *self) -{ - Py_complex c; - c = ((PyComplexObject *)self)->cval; - return PyBool_FromLong((long)(Py_IS_FINITE(c.real) && - Py_IS_FINITE(c.imag))); -} - -PyDoc_STRVAR(complex_is_finite_doc, -"complex.is_finite() -> bool\n" -"\n" -"Returns True if the real and the imaginary part is finite."); -#endif - static PyMethodDef complex_methods[] = { {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS, complex_conjugate_doc}, -#if 0 - {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS, - complex_is_finite_doc}, -#endif {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS}, {"__format__", (PyCFunction)complex__format__, METH_VARARGS, complex__format__doc}, diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 4fc412b43f7a3..d67f17abb5c27 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -843,35 +843,6 @@ float_is_integer_impl(PyObject *self) return o; } -#if 0 -static PyObject * -float_is_inf(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_INFINITY(x)); -} - -static PyObject * -float_is_nan(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_NAN(x)); -} - -static PyObject * -float_is_finite(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_FINITE(x)); -} -#endif - /*[clinic input] float.__trunc__ @@ -1863,14 +1834,6 @@ static PyMethodDef float_methods[] = { FLOAT_FROMHEX_METHODDEF FLOAT_HEX_METHODDEF FLOAT_IS_INTEGER_METHODDEF -#if 0 - {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Return True if the float is positive or negative infinite."}, - {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Return True if the float is finite, neither infinite nor NaN."}, - {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Return True if the float is not a number (NaN)."}, -#endif FLOAT___GETNEWARGS___METHODDEF FLOAT___GETFORMAT___METHODDEF FLOAT___SET_FORMAT___METHODDEF diff --git a/Objects/longobject.c b/Objects/longobject.c index b672ae4201891..124b837d008e3 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5411,13 +5411,6 @@ int_bit_length_impl(PyObject *self) return NULL; } -#if 0 -static PyObject * -long_is_finite(PyObject *v) -{ - Py_RETURN_TRUE; -} -#endif /*[clinic input] int.as_integer_ratio @@ -5574,10 +5567,6 @@ static PyMethodDef long_methods[] = { {"conjugate", long_long_meth, METH_NOARGS, "Returns self, the complex conjugate of any int."}, INT_BIT_LENGTH_METHODDEF -#if 0 - {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS, - "Returns always True."}, -#endif INT_TO_BYTES_METHODDEF INT_FROM_BYTES_METHODDEF INT_AS_INTEGER_RATIO_METHODDEF From webhook-mailer at python.org Tue Jan 21 22:26:39 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 Jan 2020 03:26:39 -0000 Subject: [Python-checkins] closes bpo-39415: Remove unused codes from longobject.c complexobject.c floatobject.c. (GH-18105) Message-ID: https://github.com/python/cpython/commit/a755410e054e1e2390de5830befc08fe80706c66 commit: a755410e054e1e2390de5830befc08fe80706c66 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-21T19:26:34-08:00 summary: closes bpo-39415: Remove unused codes from longobject.c complexobject.c floatobject.c. (GH-18105) (cherry picked from commit 0d5eac8c327251f8edde5261cee43975d81311f6) Co-authored-by: Dong-hee Na files: M Objects/complexobject.c M Objects/floatobject.c M Objects/longobject.c diff --git a/Objects/complexobject.c b/Objects/complexobject.c index a49da4018411e..e01409b971b0e 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -743,29 +743,9 @@ complex__format__(PyObject* self, PyObject* args) return _PyUnicodeWriter_Finish(&writer); } -#if 0 -static PyObject * -complex_is_finite(PyObject *self) -{ - Py_complex c; - c = ((PyComplexObject *)self)->cval; - return PyBool_FromLong((long)(Py_IS_FINITE(c.real) && - Py_IS_FINITE(c.imag))); -} - -PyDoc_STRVAR(complex_is_finite_doc, -"complex.is_finite() -> bool\n" -"\n" -"Returns True if the real and the imaginary part is finite."); -#endif - static PyMethodDef complex_methods[] = { {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS, complex_conjugate_doc}, -#if 0 - {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS, - complex_is_finite_doc}, -#endif {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS}, {"__format__", (PyCFunction)complex__format__, METH_VARARGS, complex__format__doc}, diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 1cb8ff795fb87..609f66f8b32ca 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -861,35 +861,6 @@ float_is_integer_impl(PyObject *self) return o; } -#if 0 -static PyObject * -float_is_inf(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_INFINITY(x)); -} - -static PyObject * -float_is_nan(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_NAN(x)); -} - -static PyObject * -float_is_finite(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_FINITE(x)); -} -#endif - /*[clinic input] float.__trunc__ @@ -1852,14 +1823,6 @@ static PyMethodDef float_methods[] = { FLOAT_FROMHEX_METHODDEF FLOAT_HEX_METHODDEF FLOAT_IS_INTEGER_METHODDEF -#if 0 - {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Return True if the float is positive or negative infinite."}, - {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Return True if the float is finite, neither infinite nor NaN."}, - {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Return True if the float is not a number (NaN)."}, -#endif FLOAT___GETNEWARGS___METHODDEF FLOAT___GETFORMAT___METHODDEF FLOAT___SET_FORMAT___METHODDEF diff --git a/Objects/longobject.c b/Objects/longobject.c index 708934c51fe25..67dce97471522 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5464,13 +5464,6 @@ int_bit_length_impl(PyObject *self) return NULL; } -#if 0 -static PyObject * -long_is_finite(PyObject *v) -{ - Py_RETURN_TRUE; -} -#endif /*[clinic input] int.as_integer_ratio @@ -5628,10 +5621,6 @@ static PyMethodDef long_methods[] = { {"conjugate", long_long_meth, METH_NOARGS, "Returns self, the complex conjugate of any int."}, INT_BIT_LENGTH_METHODDEF -#if 0 - {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS, - "Returns always True."}, -#endif INT_TO_BYTES_METHODDEF INT_FROM_BYTES_METHODDEF INT_AS_INTEGER_RATIO_METHODDEF From webhook-mailer at python.org Wed Jan 22 05:01:47 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Wed, 22 Jan 2020 10:01:47 -0000 Subject: [Python-checkins] bpo-39377: json: Update doc about the encoding option. (GH-18076) Message-ID: https://github.com/python/cpython/commit/5bbac8cbdf140ebce446ea4e7db2b20a5d7b8402 commit: 5bbac8cbdf140ebce446ea4e7db2b20a5d7b8402 branch: master author: Inada Naoki committer: GitHub date: 2020-01-22T19:01:24+09:00 summary: bpo-39377: json: Update doc about the encoding option. (GH-18076) Co-authored-by: Kyle Stanley files: M Doc/library/json.rst M Doc/whatsnew/3.9.rst diff --git a/Doc/library/json.rst b/Doc/library/json.rst index cfe68c9dd91d0..b923c8e167052 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -283,19 +283,18 @@ Basic Usage instance containing a JSON document) to a Python object using this :ref:`conversion table `. - The other arguments have the same meaning as in :func:`load`, except - *encoding* which is ignored and deprecated since Python 3.1. + The other arguments have the same meaning as in :func:`load`. If the data being deserialized is not a valid JSON document, a :exc:`JSONDecodeError` will be raised. - .. deprecated-removed:: 3.1 3.9 - *encoding* keyword argument. - .. versionchanged:: 3.6 *s* can now be of type :class:`bytes` or :class:`bytearray`. The input encoding should be UTF-8, UTF-16 or UTF-32. + .. versionchanged:: 3.9 + The keyword argument *encoding* has been removed. + Encoders and Decoders --------------------- diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ab27c488ea30b..00341ef8019e7 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -424,11 +424,15 @@ Removed (Contributed by Victor Stinner in :issue:`39350`.) * The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since - Python 3.0, it was ignored and using it was emitting - :exc:`DeprecationWarning`. Pass an open file object to control how the file - is opened. + Python 3.0, it was ignored and using it emitted a :exc:`DeprecationWarning`. + Pass an open file object to control how the file is opened. (Contributed by Victor Stinner in :issue:`39357`.) +* The *encoding* parameter of :func:`json.loads` has been removed. + As of Python 3.1, it was deprecated and ignored; using it has emitted a + :exc:`DeprecationWarning` since Python 3.8. + (Contributed by Inada Naoki in :issue:`39377`) + Porting to Python 3.9 ===================== From webhook-mailer at python.org Wed Jan 22 07:50:47 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 Jan 2020 12:50:47 -0000 Subject: [Python-checkins] bpo-39413: os.unsetenv() is not available on Windows (GH-18108) Message-ID: https://github.com/python/cpython/commit/f84f65be5602e561fef04b66bb487fbc4e560db5 commit: f84f65be5602e561fef04b66bb487fbc4e560db5 branch: 3.8 author: Victor Stinner committer: GitHub date: 2020-01-22T13:50:40+01:00 summary: bpo-39413: os.unsetenv() is not available on Windows (GH-18108) Update os.unsetenv() documentation: it is not available on Windows. files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 9d2e8b2eea239..7aadbcf773b6a 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -643,7 +643,7 @@ process and user. calls to :func:`unsetenv` don't update ``os.environ``, so it is actually preferable to delete items of ``os.environ``. - .. availability:: most flavors of Unix, Windows. + .. availability:: most flavors of Unix. .. _os-newstreams: From webhook-mailer at python.org Wed Jan 22 07:56:27 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 Jan 2020 12:56:27 -0000 Subject: [Python-checkins] bpo-39413: os.unsetenv() is not available on Windows (GH-18108) Message-ID: https://github.com/python/cpython/commit/570724667d37fcb160cdef2b34190dc36e28155c commit: 570724667d37fcb160cdef2b34190dc36e28155c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-22T04:56:22-08:00 summary: bpo-39413: os.unsetenv() is not available on Windows (GH-18108) Update os.unsetenv() documentation: it is not available on Windows. (cherry picked from commit f84f65be5602e561fef04b66bb487fbc4e560db5) Co-authored-by: Victor Stinner files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 10d7deaecdcae..3a5a5f97b93a6 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -642,7 +642,7 @@ process and user. calls to :func:`unsetenv` don't update ``os.environ``, so it is actually preferable to delete items of ``os.environ``. - .. availability:: most flavors of Unix, Windows. + .. availability:: most flavors of Unix. .. _os-newstreams: From webhook-mailer at python.org Wed Jan 22 12:36:59 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 22 Jan 2020 17:36:59 -0000 Subject: [Python-checkins] bpo-39425: Fix list.count performance regression (GH-18119) Message-ID: https://github.com/python/cpython/commit/14d80d0b605d8b148e14458e4c1853a940071462 commit: 14d80d0b605d8b148e14458e4c1853a940071462 branch: master author: Dong-hee Na committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-22T09:36:54-08:00 summary: bpo-39425: Fix list.count performance regression (GH-18119) https://bugs.python.org/issue39425 Automerge-Triggered-By: @pablogsal files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index bc8425cae63e1..a4e90dbf90cf9 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2584,6 +2584,10 @@ list_count(PyListObject *self, PyObject *value) for (i = 0; i < Py_SIZE(self); i++) { PyObject *obj = self->ob_item[i]; + if (obj == value) { + count++; + continue; + } Py_INCREF(obj); int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); Py_DECREF(obj); From webhook-mailer at python.org Wed Jan 22 13:11:26 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Wed, 22 Jan 2020 18:11:26 -0000 Subject: [Python-checkins] bpo-39425: Fix list.count performance regression (GH-18119) (GH-18120) Message-ID: https://github.com/python/cpython/commit/fdb21609d944941f0732df72dc3d07a7a9a7efea commit: fdb21609d944941f0732df72dc3d07a7a9a7efea branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Pablo Galindo date: 2020-01-22T18:11:22Z summary: bpo-39425: Fix list.count performance regression (GH-18119) (GH-18120) https://bugs.python.org/issue39425 Automerge-Triggered-By: @pablogsal (cherry picked from commit 14d80d0b605d8b148e14458e4c1853a940071462) Co-authored-by: Dong-hee Na Co-authored-by: Dong-hee Na files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index d506c0817336b..73afc44c39e36 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2586,6 +2586,10 @@ list_count(PyListObject *self, PyObject *value) for (i = 0; i < Py_SIZE(self); i++) { PyObject *obj = self->ob_item[i]; + if (obj == value) { + count++; + continue; + } Py_INCREF(obj); int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); Py_DECREF(obj); From webhook-mailer at python.org Wed Jan 22 13:11:35 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Wed, 22 Jan 2020 18:11:35 -0000 Subject: [Python-checkins] bpo-39425: Fix list.count performance regression (GH-18119) (GH-18121) Message-ID: https://github.com/python/cpython/commit/9e06d61af30bac4fcacb7973f826147ccc010392 commit: 9e06d61af30bac4fcacb7973f826147ccc010392 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Pablo Galindo date: 2020-01-22T18:11:30Z summary: bpo-39425: Fix list.count performance regression (GH-18119) (GH-18121) https://bugs.python.org/issue39425 Automerge-Triggered-By: @pablogsal (cherry picked from commit 14d80d0b605d8b148e14458e4c1853a940071462) Co-authored-by: Dong-hee Na Co-authored-by: Dong-hee Na files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index d622da9e0dbf3..856f3215e8855 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2537,6 +2537,10 @@ list_count(PyListObject *self, PyObject *value) for (i = 0; i < Py_SIZE(self); i++) { PyObject *obj = self->ob_item[i]; + if (obj == value) { + count++; + continue; + } Py_INCREF(obj); int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); Py_DECREF(obj); From webhook-mailer at python.org Wed Jan 22 14:44:27 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 Jan 2020 19:44:27 -0000 Subject: [Python-checkins] bpo-39353: Deprecate the binhex module (GH-18025) Message-ID: https://github.com/python/cpython/commit/beea26b57e8c80f1eff0f967a0f9d083a7dc3d66 commit: beea26b57e8c80f1eff0f967a0f9d083a7dc3d66 branch: master author: Victor Stinner committer: GitHub date: 2020-01-22T20:44:22+01:00 summary: bpo-39353: Deprecate the binhex module (GH-18025) Deprecate binhex4 and hexbin4 standards. Deprecate the binhex module and the following binascii functions: * b2a_hqx(), a2b_hqx() * rlecode_hqx(), rledecode_hqx() * crc_hqx() files: A Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst M Doc/library/binascii.rst M Doc/library/binhex.rst M Doc/whatsnew/3.9.rst M Lib/binhex.py M Lib/test/test_binascii.py M Lib/test/test_binhex.py M Modules/binascii.c M Modules/clinic/binascii.c.h diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 98d8679fa3dcd..aa2a27084c34c 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -92,6 +92,8 @@ The :mod:`binascii` module defines the following functions: The string should contain a complete number of binary bytes, or (in case of the last portion of the binhex4 data) have the remaining bits zero. + .. deprecated:: 3.9 + .. function:: rledecode_hqx(data) @@ -104,11 +106,15 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.2 Accept only bytestring or bytearray objects as input. + .. deprecated:: 3.9 + .. function:: rlecode_hqx(data) Perform binhex4 style RLE-compression on *data* and return the result. + .. deprecated:: 3.9 + .. function:: b2a_hqx(data) @@ -116,6 +122,8 @@ The :mod:`binascii` module defines the following functions: argument should already be RLE-coded, and have a length divisible by 3 (except possibly the last fragment). + .. deprecated:: 3.9 + .. function:: crc_hqx(data, value) @@ -124,6 +132,8 @@ The :mod:`binascii` module defines the following functions: *x*:sup:`16` + *x*:sup:`12` + *x*:sup:`5` + 1, often represented as 0x1021. This CRC is used in the binhex4 format. + .. deprecated:: 3.9 + .. function:: crc32(data[, value]) diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst index 2966e0dbfbcfe..7de6a663762f0 100644 --- a/Doc/library/binhex.rst +++ b/Doc/library/binhex.rst @@ -6,6 +6,8 @@ **Source code:** :source:`Lib/binhex.py` +.. deprecated:: 3.9 + -------------- This module encodes and decodes files in binhex4 format, a format allowing diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 00341ef8019e7..0e82ff0695d3e 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -353,6 +353,16 @@ Deprecated deprecated and will be removed in version 3.11. (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.) +* binhex4 and hexbin4 standards are now deprecated. The :`binhex` module + and the following :mod:`binascii` functions are now deprecated: + + * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` + * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` + * :func:`~binascii.crc_hqx` + + (Contributed by Victor Stinner in :issue:`39353`.) + + Removed ======= diff --git a/Lib/binhex.py b/Lib/binhex.py index 56b5f852c0038..6ff38dd8229c8 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -21,10 +21,16 @@ # input. The resulting code (xx 90 90) would appear to be interpreted as an # escaped *value* of 0x90. All coders I've seen appear to ignore this nicety... # +import binascii +import contextlib import io import os import struct -import binascii +import warnings + +warnings.warn('the binhex module is deprecated', DeprecationWarning, + stacklevel=2) + __all__ = ["binhex","hexbin","Error"] @@ -76,6 +82,16 @@ def write(self, *args): def close(self): pass + +# DeprecationWarning is already emitted on "import binhex". There is no need +# to repeat the warning at each call to deprecated binascii functions. + at contextlib.contextmanager +def _ignore_deprecation_warning(): + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', '', DeprecationWarning) + yield + + class _Hqxcoderengine: """Write data to the coder in 3-byte chunks""" @@ -93,7 +109,8 @@ def write(self, data): self.data = self.data[todo:] if not data: return - self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) self._flush(0) def _flush(self, force): @@ -109,7 +126,8 @@ def _flush(self, force): def close(self): if self.data: - self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) self._flush(1) self.ofp.close() del self.ofp @@ -125,13 +143,15 @@ def write(self, data): self.data = self.data + data if len(self.data) < REASONABLY_LARGE: return - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.data = b'' def close(self): if self.data: - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.ofp.close() del self.ofp @@ -180,7 +200,8 @@ def _writeinfo(self, name, finfo): self._writecrc() def _write(self, data): - self.crc = binascii.crc_hqx(data, self.crc) + with _ignore_deprecation_warning(): + self.crc = binascii.crc_hqx(data, self.crc) self.ofp.write(data) def _writecrc(self): @@ -276,7 +297,8 @@ def read(self, totalwtd): # while True: try: - decdatacur, self.eof = binascii.a2b_hqx(data) + with _ignore_deprecation_warning(): + decdatacur, self.eof = binascii.a2b_hqx(data) break except binascii.Incomplete: pass @@ -312,8 +334,9 @@ def read(self, wtd): def _fill(self, wtd): self.pre_buffer = self.pre_buffer + self.ifp.read(wtd + 4) if self.ifp.eof: - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer) self.pre_buffer = b'' return @@ -340,8 +363,9 @@ def _fill(self, wtd): else: mark = mark - 1 - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer[:mark]) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer[:mark]) self.pre_buffer = self.pre_buffer[mark:] def close(self): @@ -372,7 +396,8 @@ def __init__(self, ifp): def _read(self, len): data = self.ifp.read(len) - self.crc = binascii.crc_hqx(data, self.crc) + with _ignore_deprecation_warning(): + self.crc = binascii.crc_hqx(data, self.crc) return data def _checkcrc(self): diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 08de5c9fc7cc3..649edbe295413 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -4,6 +4,7 @@ import binascii import array import re +from test import support # Note: "*_hex" functions are aliases for "(un)hexlify" b2a_functions = ['b2a_base64', 'b2a_hex', 'b2a_hqx', 'b2a_qp', 'b2a_uu', @@ -36,6 +37,7 @@ def test_functions(self): self.assertTrue(hasattr(getattr(binascii, name), '__call__')) self.assertRaises(TypeError, getattr(binascii, name)) + @support.ignore_warnings(category=DeprecationWarning) def test_returned_value(self): # Limit to the minimum of all limits (b2a_uu) MAX_ALL = 45 @@ -179,6 +181,7 @@ def test_uu(self): with self.assertRaises(TypeError): binascii.b2a_uu(b"", True) + @support.ignore_warnings(category=DeprecationWarning) def test_crc_hqx(self): crc = binascii.crc_hqx(self.type2test(b"Test the CRC-32 of"), 0) crc = binascii.crc_hqx(self.type2test(b" this string."), crc) @@ -198,6 +201,7 @@ def test_crc32(self): self.assertRaises(TypeError, binascii.crc32) + @support.ignore_warnings(category=DeprecationWarning) def test_hqx(self): # Perform binhex4 style RLE-compression # Then calculate the hexbin4 binary-to-ASCII translation @@ -208,6 +212,7 @@ def test_hqx(self): res = binascii.rledecode_hqx(b) self.assertEqual(res, self.rawdata) + @support.ignore_warnings(category=DeprecationWarning) def test_rle(self): # test repetition with a repetition longer than the limit of 255 data = (b'a' * 100 + b'b' + b'c' * 300) @@ -354,6 +359,7 @@ def test_qp(self): self.assertEqual(b2a_qp(type2test(b'a.\n')), b'a.\n') self.assertEqual(b2a_qp(type2test(b'.a')[:-1]), b'=2E') + @support.ignore_warnings(category=DeprecationWarning) def test_empty_string(self): # A test for SF bug #1022953. Make sure SystemError is not raised. empty = self.type2test(b'') @@ -378,6 +384,7 @@ def test_unicode_b2a(self): # crc_hqx needs 2 arguments self.assertRaises(TypeError, binascii.crc_hqx, "test", 0) + @support.ignore_warnings(category=DeprecationWarning) def test_unicode_a2b(self): # Unicode strings are accepted by a2b_* functions. MAX_ALL = 45 @@ -416,6 +423,21 @@ def test_b2a_base64_newline(self): self.assertEqual(binascii.b2a_base64(b, newline=False), b'aGVsbG8=') + def test_deprecated_warnings(self): + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.b2a_hqx(b'abc'), b'B@*M') + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.a2b_hqx(b'B@*M'), (b'abc', 0)) + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rlecode_hqx(b'a' * 10), b'a\x90\n') + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rledecode_hqx(b'a\x90\n'), b'a' * 10) + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.crc_hqx(b'abc', 0), 40406) + class ArrayBinASCIITest(BinASCIITest): def type2test(self, s): diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index 2f3d53afbd132..86ca37ce1b99a 100644 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -3,10 +3,12 @@ Uses the mechanism of the python binhex module Based on an original test by Roger E. Masse. """ -import binhex import unittest from test import support +with support.check_warnings(('', DeprecationWarning)): + import binhex + class BinHexTestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst b/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst new file mode 100644 index 0000000000000..c0d4583ca7fec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst @@ -0,0 +1,4 @@ +Deprecate binhex4 and hexbin4 standards. Deprecate the :mod:`binhex` module and +the following :mod:`binascii` functions: :func:`~binascii.b2a_hqx`, +:func:`~binascii.a2b_hqx`, :func:`~binascii.rlecode_hqx`, +:func:`~binascii.rledecode_hqx`, :func:`~binascii.crc_hqx`. diff --git a/Modules/binascii.c b/Modules/binascii.c index 94b0732c12c83..c6da3e0a635bc 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -613,6 +613,11 @@ static PyObject * binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=4d6d8c54d54ea1c1 input=0d914c680e0eed55]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.a2b_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *ascii_data; unsigned char *bin_data; int leftbits = 0; @@ -701,6 +706,11 @@ static PyObject * binascii_rlecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=393d79338f5f5629 input=e1f1712447a82b09]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rlecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char ch; @@ -763,6 +773,11 @@ static PyObject * binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=d0aa5a704bc9f7de input=9596ebe019fe12ba]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.b2a_hqx() is deprecated", 1) < 0) { + return NULL; + } + unsigned char *ascii_data; const unsigned char *bin_data; int leftbits = 0; @@ -818,6 +833,11 @@ static PyObject * binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=9826619565de1c6c input=54cdd49fc014402c]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rledecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char in_byte, in_repeat; @@ -932,7 +952,7 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic input] -binascii.crc_hqx -> unsigned_int +binascii.crc_hqx data: Py_buffer crc: unsigned_int(bitwise=True) @@ -941,10 +961,15 @@ binascii.crc_hqx -> unsigned_int Compute CRC-CCITT incrementally. [clinic start generated code]*/ -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) -/*[clinic end generated code: output=8ec2a78590d19170 input=f18240ff8c705b79]*/ +/*[clinic end generated code: output=2fde213d0f547a98 input=56237755370a951c]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.crc_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *bin_data; Py_ssize_t len; @@ -956,7 +981,7 @@ binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) crc = ((crc<<8)&0xff00) ^ crctab_hqx[(crc>>8)^*bin_data++]; } - return crc; + return PyLong_FromUnsignedLong(crc); } #ifndef USE_ZLIB_CRC32 diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 82942f08a6868..4d02c72c472e1 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -328,7 +328,7 @@ PyDoc_STRVAR(binascii_crc_hqx__doc__, #define BINASCII_CRC_HQX_METHODDEF \ {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__}, -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc); static PyObject * @@ -337,7 +337,6 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; Py_buffer data = {NULL, NULL}; unsigned int crc; - unsigned int _return_value; if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) { goto exit; @@ -358,11 +357,7 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (crc == (unsigned int)-1 && PyErr_Occurred()) { goto exit; } - _return_value = binascii_crc_hqx_impl(module, &data, crc); - if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromUnsignedLong((unsigned long)_return_value); + return_value = binascii_crc_hqx_impl(module, &data, crc); exit: /* Cleanup for data */ @@ -801,4 +796,4 @@ binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj return return_value; } -/*[clinic end generated code: output=ec26d03c2007eaac input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a1e878d3963b615e input=a9049054013a1b77]*/ From webhook-mailer at python.org Wed Jan 22 15:11:21 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 Jan 2020 20:11:21 -0000 Subject: [Python-checkins] Revert "bpo-39413: Implement os.unsetenv() on Windows (GH-18104)" (GH-18124) Message-ID: https://github.com/python/cpython/commit/b73dd02ea744288831f71363a7467552c09875ea commit: b73dd02ea744288831f71363a7467552c09875ea branch: master author: Victor Stinner committer: GitHub date: 2020-01-22T21:11:17+01:00 summary: Revert "bpo-39413: Implement os.unsetenv() on Windows (GH-18104)" (GH-18124) This reverts commit 56cd3710a1ea3ba872d345ea1bebc86ed08bc8b8. files: D Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst M Doc/library/os.rst M Doc/whatsnew/3.9.rst M Lib/test/test_os.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c diff --git a/Doc/library/os.rst b/Doc/library/os.rst index de3e5603e109f..4fec647828e25 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -645,9 +645,6 @@ process and user. .. availability:: most flavors of Unix, Windows. - .. versionchanged:: 3.9 - The function is now also available on Windows. - .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 0e82ff0695d3e..f5835d68515ac 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -216,9 +216,6 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. -The :func:`os.unsetenv` function is now also available on Windows. -(Contributed by Victor Stinner in :issue:`39413`.) - poplib ------ diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 50535da0a2bfc..82c441c204835 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -956,9 +956,14 @@ def test_environb(self): # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) def test_unset_error(self): - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + if sys.platform == "win32": + # an environment variable is limited to 32,767 characters + key = 'x' * 50000 + self.assertRaises(ValueError, os.environ.__delitem__, key) + else: + # "=" is not allowed in a variable name + key = 'key=' + self.assertRaises(OSError, os.environ.__delitem__, key) def test_key_type(self): missing = 'missingkey' diff --git a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst deleted file mode 100644 index a185ab5efe2ed..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst +++ /dev/null @@ -1 +0,0 @@ -The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 661d91afb7eb6..aa4756a620aae 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6125,43 +6125,7 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ -#if defined(MS_WINDOWS) - -PyDoc_STRVAR(os_unsetenv__doc__, -"unsetenv($module, name, /)\n" -"--\n" -"\n" -"Delete an environment variable."); - -#define OS_UNSETENV_METHODDEF \ - {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, - -static PyObject * -os_unsetenv_impl(PyObject *module, PyObject *name); - -static PyObject * -os_unsetenv(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - PyObject *name; - - if (!PyUnicode_Check(arg)) { - _PyArg_BadArgument("unsetenv", "argument", "str", arg); - goto exit; - } - if (PyUnicode_READY(arg) == -1) { - goto exit; - } - name = arg; - return_value = os_unsetenv_impl(module, name); - -exit: - return return_value; -} - -#endif /* defined(MS_WINDOWS) */ - -#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) +#if defined(HAVE_UNSETENV) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6193,7 +6157,7 @@ os_unsetenv(PyObject *module, PyObject *arg) return return_value; } -#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ +#endif /* defined(HAVE_UNSETENV) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8809,4 +8773,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=6e739a2715712e88 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 5a0c8a311a790..e0eecfa6d1143 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10180,51 +10180,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) #endif /* HAVE_PUTENV */ -#ifdef MS_WINDOWS -/*[clinic input] -os.unsetenv - name: unicode - / - -Delete an environment variable. -[clinic start generated code]*/ - -static PyObject * -os_unsetenv_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ -{ - /* PyUnicode_AsWideCharString() rejects embedded null characters */ - wchar_t *name_str = PyUnicode_AsWideCharString(name, NULL); - if (name_str == NULL) { - return NULL; - } - - BOOL ok = SetEnvironmentVariableW(name_str, NULL); - PyMem_Free(name_str); - - if (!ok) { - return PyErr_SetFromWindowsErr(0); - } - -#ifdef PY_PUTENV_DICT - /* Remove the key from putenv_dict; - * this will cause it to be collected. This has to - * happen after the real unsetenv() call because the - * old value was still accessible until then. - */ - if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { - /* really not much we can do; just leak */ - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - return NULL; - } - PyErr_Clear(); - } -#endif - - Py_RETURN_NONE; -} -/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ -#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) +#ifdef HAVE_UNSETENV /*[clinic input] os.unsetenv name: FSConverter From webhook-mailer at python.org Wed Jan 22 15:53:34 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 Jan 2020 20:53:34 -0000 Subject: [Python-checkins] bpo-39406: os.putenv() avoids putenv_dict on Windows (GH-18126) Message-ID: https://github.com/python/cpython/commit/0852c7dd52ac42e7843ddfef44571494e4c86070 commit: 0852c7dd52ac42e7843ddfef44571494e4c86070 branch: master author: Victor Stinner committer: GitHub date: 2020-01-22T21:53:26+01:00 summary: bpo-39406: os.putenv() avoids putenv_dict on Windows (GH-18126) Windows: _wputenv(env) copies the *env* string and doesn't require the caller to manage the variable memory. files: M Modules/posixmodule.c diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e0eecfa6d1143..71b99fd836f15 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,7 +819,9 @@ dir_fd_converter(PyObject *o, void *p) } } -#ifdef HAVE_PUTENV +/* Windows: _wputenv(env) copies the *env* string and doesn't require the + caller to manage the variable memory. */ +#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) # define PY_PUTENV_DICT #endif @@ -10130,8 +10132,10 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) posix_error(); goto error; } + /* _wputenv(env) copies the *env* string and doesn't require the caller + to manage the variable memory. */ + Py_DECREF(unicode); - posix_putenv_dict_setitem(name, unicode); Py_RETURN_NONE; error: From webhook-mailer at python.org Wed Jan 22 16:48:20 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 22 Jan 2020 21:48:20 -0000 Subject: [Python-checkins] bpo-39406: Implement os.putenv() with setenv() if available (GH-18128) Message-ID: https://github.com/python/cpython/commit/b477d19a6b7751b0c933b239dae4fc96dbcde9c4 commit: b477d19a6b7751b0c933b239dae4fc96dbcde9c4 branch: master author: Victor Stinner committer: GitHub date: 2020-01-22T22:48:16+01:00 summary: bpo-39406: Implement os.putenv() with setenv() if available (GH-18128) If setenv() C function is available, os.putenv() is now implemented with setenv() instead of putenv(), so Python doesn't have to handle the environment variable memory. files: A Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M configure M configure.ac M pyconfig.h.in diff --git a/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst b/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst new file mode 100644 index 0000000000000..56a5316043238 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst @@ -0,0 +1,3 @@ +If ``setenv()`` C function is available, :func:`os.putenv` is now +implemented with ``setenv()`` instead of ``putenv()``, so Python doesn't +have to handle the environment variable memory. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index aa4756a620aae..13a69cd5f0e4d 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6034,7 +6034,7 @@ os_posix_fadvise(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #endif /* (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG)) */ -#if defined(HAVE_PUTENV) && defined(MS_WINDOWS) +#if defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6080,9 +6080,9 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -#endif /* defined(HAVE_PUTENV) && defined(MS_WINDOWS) */ +#endif /* defined(MS_WINDOWS) */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) +#if ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6123,7 +6123,7 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -#endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ +#endif /* ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) */ #if defined(HAVE_UNSETENV) @@ -8773,4 +8773,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6f42d8be634f5942 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 71b99fd836f15..6a687529df0c0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,19 +819,20 @@ dir_fd_converter(PyObject *o, void *p) } } -/* Windows: _wputenv(env) copies the *env* string and doesn't require the - caller to manage the variable memory. */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) +/* Windows _wputenv() and setenv() copy the arguments and so don't require + the caller to manage the variable memory. Only Unix putenv() requires + putenv_dict. */ +#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) && !defined(HAVE_SETENV) # define PY_PUTENV_DICT #endif typedef struct { PyObject *billion; #ifdef PY_PUTENV_DICT - /* putenv() and _wputenv() requires that the caller manages the environment - variable memory. Use a Python dictionary for that: name => env, where - env is a string like "name=value". On Windows, dict keys and values are - Unicode strings. On Unix, they are bytes strings. */ + /* putenv() requires that the caller manages the environment variable + memory. Use a Python dictionary for that: name => env, where env is a + string like "name=value". On Windows, dict keys and values are Unicode + strings. On Unix, they are bytes strings. */ PyObject *putenv_dict; #endif PyObject *DirEntryType; @@ -10081,8 +10082,6 @@ posix_putenv_dict_setitem(PyObject *name, PyObject *value) #endif /* PY_PUTENV_DICT */ -#ifdef HAVE_PUTENV - #ifdef MS_WINDOWS /*[clinic input] os.putenv @@ -10132,8 +10131,6 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) posix_error(); goto error; } - /* _wputenv(env) copies the *env* string and doesn't require the caller - to manage the variable memory. */ Py_DECREF(unicode); Py_RETURN_NONE; @@ -10142,7 +10139,8 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) Py_DECREF(unicode); return NULL; } -#else /* MS_WINDOWS */ +/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ +#elif (defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS) /*[clinic input] os.putenv @@ -10157,8 +10155,6 @@ static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic end generated code: output=d29a567d6b2327d2 input=a97bc6152f688d31]*/ { - PyObject *bytes = NULL; - char *env; const char *name_string = PyBytes_AS_STRING(name); const char *value_string = PyBytes_AS_STRING(value); @@ -10166,22 +10162,28 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } - bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); + +#ifdef HAVE_SETENV + if (setenv(name_string, value_string, 1)) { + return posix_error(); + } +#else + PyObject *bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); if (bytes == NULL) { return NULL; } - env = PyBytes_AS_STRING(bytes); + char *env = PyBytes_AS_STRING(bytes); if (putenv(env)) { Py_DECREF(bytes); return posix_error(); } posix_putenv_dict_setitem(name, bytes); +#endif Py_RETURN_NONE; } -#endif /* MS_WINDOWS */ -#endif /* HAVE_PUTENV */ +#endif /* defined(HAVE_SETENV) || defined(HAVE_PUTENV) */ #ifdef HAVE_UNSETENV diff --git a/configure b/configure index c8253b1455f65..e96683622b304 100755 --- a/configure +++ b/configure @@ -782,7 +782,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -896,7 +895,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1149,15 +1147,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1295,7 +1284,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1448,7 +1437,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -10303,6 +10291,7 @@ fi + if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. @@ -11561,7 +11550,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ diff --git a/configure.ac b/configure.ac index bcef99c496225..36c165b2f2e42 100644 --- a/configure.ac +++ b/configure.ac @@ -3600,7 +3600,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ diff --git a/pyconfig.h.in b/pyconfig.h.in index e053be15a1180..1918fab8bdbe7 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -895,6 +895,9 @@ /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID From webhook-mailer at python.org Wed Jan 22 16:59:48 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Wed, 22 Jan 2020 21:59:48 -0000 Subject: [Python-checkins] bpo-39366: Remove xpath() and xgtitle() methods of NNTP (GH-18035) Message-ID: https://github.com/python/cpython/commit/1f0f102dec506fd06f912b74dd2be64a7fba0d3f commit: 1f0f102dec506fd06f912b74dd2be64a7fba0d3f branch: master author: Dong-hee Na committer: Berker Peksag date: 2020-01-23T00:59:43+03:00 summary: bpo-39366: Remove xpath() and xgtitle() methods of NNTP (GH-18035) files: A Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst M Doc/library/nntplib.rst M Doc/whatsnew/3.9.rst M Lib/nntplib.py diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 76973651526a8..e7ec9047e015e 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -542,33 +542,6 @@ them have been superseded by newer commands in :rfc:`3977`. if available. -.. method:: NNTP.xpath(id) - - Return a pair ``(resp, path)``, where *path* is the directory path to the - article with message ID *id*. Most of the time, this extension is not - enabled by NNTP server administrators. - - .. deprecated:: 3.3 - The XPATH extension is not actively used. - - -.. XXX deprecated: - - .. method:: NNTP.xgtitle(name, *, file=None) - - Process an ``XGTITLE`` command, returning a pair ``(response, list)``, where - *list* is a list of tuples containing ``(name, title)``. If the *file* parameter - is supplied, then the output of the ``XGTITLE`` command is stored in a file. - If *file* is a string, then the method will open a file with that name, write - to it then close it. If *file* is a :term:`file object`, then it will start - calling :meth:`write` on it to store the lines of the command output. If *file* - is supplied, then the returned *list* is an empty list. This is an optional NNTP - extension, and may not be supported by all servers. - - :rfc:`2980` says "It is suggested that this extension be deprecated". Use - :meth:`descriptions` or :meth:`description` instead. - - Utility functions ----------------- diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f5835d68515ac..d9c545adc43d6 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -363,6 +363,13 @@ Deprecated Removed ======= +* :class:`nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. + These methods are deprecated since Python 3.3. Generally, these extensions + are not supported or not enabled by NNTP server administrators. + For ``xgtitle()``, please use :meth:`nntplib.NNTP.descriptions` or + :meth:`nntplib.NNTP.description` instead. + (Contributed by Dong-hee Na in :issue:`39366`.) + * :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been removed. They were aliases to ``tobytes()`` and ``frombytes()``, deprecated since Python 3.2. diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 8951203f325c8..aa9b46a8aaa39 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -67,7 +67,6 @@ import socket import collections import datetime -import warnings import sys try: @@ -834,44 +833,6 @@ def over(self, message_spec, *, file=None): fmt = self._getoverviewfmt() return resp, _parse_overview(lines, fmt) - def xgtitle(self, group, *, file=None): - """Process an XGTITLE command (optional server extension) Arguments: - - group: group name wildcard (i.e. news.*) - Returns: - - resp: server response if successful - - list: list of (name,title) strings""" - warnings.warn("The XGTITLE extension is not actively used, " - "use descriptions() instead", - DeprecationWarning, 2) - line_pat = re.compile('^([^ \t]+)[ \t]+(.*)$') - resp, raw_lines = self._longcmdstring('XGTITLE ' + group, file) - lines = [] - for raw_line in raw_lines: - match = line_pat.search(raw_line.strip()) - if match: - lines.append(match.group(1, 2)) - return resp, lines - - def xpath(self, id): - """Process an XPATH command (optional server extension) Arguments: - - id: Message id of article - Returns: - resp: server response if successful - path: directory path to article - """ - warnings.warn("The XPATH extension is not actively used", - DeprecationWarning, 2) - - resp = self._shortcmd('XPATH {0}'.format(id)) - if not resp.startswith('223'): - raise NNTPReplyError(resp) - try: - [resp_num, path] = resp.split() - except ValueError: - raise NNTPReplyError(resp) from None - else: - return resp, path - def date(self): """Process the DATE command. Returns: diff --git a/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst b/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst new file mode 100644 index 0000000000000..00d98a7f183ae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst @@ -0,0 +1,2 @@ +The previously deprecated ``xpath()`` and ``xgtitle()`` methods of +:class:`nntplib.NNTP` have been removed. From webhook-mailer at python.org Wed Jan 22 18:28:39 2020 From: webhook-mailer at python.org (Gregory P. Smith) Date: Wed, 22 Jan 2020 23:28:39 -0000 Subject: [Python-checkins] bpo-35182: fix communicate() crash after child closes its pipes (GH-17020) (GH-18117) Message-ID: https://github.com/python/cpython/commit/d3ae95e1e945ed20297e1c38ba43a18b7a868ab6 commit: d3ae95e1e945ed20297e1c38ba43a18b7a868ab6 branch: master author: Alex Rebert committer: Gregory P. Smith date: 2020-01-22T15:28:31-08:00 summary: bpo-35182: fix communicate() crash after child closes its pipes (GH-17020) (GH-18117) When communicate() is called in a loop, it crashes when the child process has already closed any piped standard stream, but still continues to be running Co-authored-by: Andriy Maletsky files: A Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst M Lib/subprocess.py M Lib/test/test_subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 79dffd349a30e..26a1e69bd38c2 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1983,9 +1983,9 @@ def _communicate(self, input, endtime, orig_timeout): with _PopenSelector() as selector: if self.stdin and input: selector.register(self.stdin, selectors.EVENT_WRITE) - if self.stdout: + if self.stdout and not self.stdout.closed: selector.register(self.stdout, selectors.EVENT_READ) - if self.stderr: + if self.stderr and not self.stderr.closed: selector.register(self.stderr, selectors.EVENT_READ) while selector.get_map(): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index f1fb93455dd7d..2bbdbaef84e99 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -3145,6 +3145,17 @@ def test_send_signal_race(self): # so Popen failed to read it and uses a default returncode instead. self.assertIsNotNone(proc.returncode) + def test_communicate_repeated_call_after_stdout_close(self): + proc = subprocess.Popen([sys.executable, '-c', + 'import os, time; os.close(1), time.sleep(2)'], + stdout=subprocess.PIPE) + while True: + try: + proc.communicate(timeout=0.1) + return + except subprocess.TimeoutExpired: + pass + @unittest.skipUnless(mswindows, "Windows specific tests") class Win32ProcessTestCase(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst new file mode 100644 index 0000000000000..9438cd8f9fd0b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst @@ -0,0 +1,3 @@ +Fixed :func:`Popen.communicate` subsequent call crash when the child process +has already closed any piped standard stream, but still continues to be +running. Patch by Andriy Maletsky. From webhook-mailer at python.org Wed Jan 22 19:42:45 2020 From: webhook-mailer at python.org (Dino Viehland) Date: Thu, 23 Jan 2020 00:42:45 -0000 Subject: [Python-checkins] bpo-39336: Allow packages to not let their child modules be set on them (#18006) Message-ID: https://github.com/python/cpython/commit/9b6fec46513006d7b06fcb645cca6e4f5bf7c7b8 commit: 9b6fec46513006d7b06fcb645cca6e4f5bf7c7b8 branch: master author: Dino Viehland committer: GitHub date: 2020-01-22T16:42:38-08:00 summary: bpo-39336: Allow packages to not let their child modules be set on them (#18006) * bpo-39336: Allow setattr to fail on modules which aren't assignable When attaching a child module to a package if the object in sys.modules raises an AttributeError (e.g. because it is immutable) it causes the whole import to fail. This now allows immutable packages to exist and an ImportWarning is reported and the AttributeError exception is ignored. files: A Lib/test/test_import/data/unwritable/__init__.py A Lib/test/test_import/data/unwritable/x.py A Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst M Lib/importlib/_bootstrap.py M Lib/test/test_import/__init__.py M Python/importlib.h diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 8de0e9ee79fd8..7b74e88820d03 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -978,7 +978,12 @@ def _find_and_load_unlocked(name, import_): if parent: # Set the module as an attribute on its parent. parent_module = sys.modules[parent] - setattr(parent_module, name.rpartition('.')[2], module) + child = name.rpartition('.')[2] + try: + setattr(parent_module, child, module) + except AttributeError: + msg = f"Cannot set an attribute on {parent!r} for child module {child!r}" + _warnings.warn(msg, ImportWarning) return module diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 13d04815da7e0..482fe6a9216a5 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -26,6 +26,7 @@ temp_dir, DirsOnSysPath) from test.support import script_helper from test.test_importlib.util import uncache +from types import ModuleType skip_if_dont_write_bytecode = unittest.skipIf( @@ -1339,6 +1340,19 @@ def test_circular_from_import(self): str(cm.exception), ) + def test_unwritable_module(self): + self.addCleanup(unload, "test.test_import.data.unwritable") + self.addCleanup(unload, "test.test_import.data.unwritable.x") + + import test.test_import.data.unwritable as unwritable + with self.assertWarns(ImportWarning): + from test.test_import.data.unwritable import x + + self.assertNotEqual(type(unwritable), ModuleType) + self.assertEqual(type(x), ModuleType) + with self.assertRaises(AttributeError): + unwritable.x = 42 + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. diff --git a/Lib/test/test_import/data/unwritable/__init__.py b/Lib/test/test_import/data/unwritable/__init__.py new file mode 100644 index 0000000000000..da4ddb3d027c3 --- /dev/null +++ b/Lib/test/test_import/data/unwritable/__init__.py @@ -0,0 +1,12 @@ +import sys + +class MyMod(object): + __slots__ = ['__builtins__', '__cached__', '__doc__', + '__file__', '__loader__', '__name__', + '__package__', '__path__', '__spec__'] + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, globals()[attr]) + + +sys.modules[__name__] = MyMod() diff --git a/Lib/test/test_import/data/unwritable/x.py b/Lib/test/test_import/data/unwritable/x.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst new file mode 100644 index 0000000000000..55b6bbbcac0d1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst @@ -0,0 +1 @@ +Import loaders which publish immutable module objects can now publish immutable packages in addition to individual modules. diff --git a/Python/importlib.h b/Python/importlib.h index 63e2064889b92..3a84e9bb1d81f 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1448,8 +1448,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, 114,200,0,0,0,122,16,78,111,32,109,111,100,117,108,101, 32,110,97,109,101,100,32,122,4,123,33,114,125,99,2,0, - 0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0, - 0,0,67,0,0,0,115,218,0,0,0,100,0,125,2,124, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0, + 0,0,67,0,0,0,115,22,1,0,0,100,0,125,2,124, 0,160,0,100,1,161,1,100,2,25,0,125,3,124,3,114, 132,124,3,116,1,106,2,118,1,114,42,116,3,124,1,124, 3,131,2,1,0,124,0,116,1,106,2,118,0,114,62,116, @@ -1460,341 +1460,350 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,100,4,141,2,100,0,130,2,89,0,110,2,48,0,116, 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, 170,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, - 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,114, - 214,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, - 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, - 0,124,7,83,0,41,6,78,114,127,0,0,0,114,22,0, - 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, - 233,2,0,0,0,41,12,114,128,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,66,0,0,0,114,140,0,0,0, - 114,105,0,0,0,218,8,95,69,82,82,95,77,83,71,114, - 44,0,0,0,218,19,77,111,100,117,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,194,0,0,0,114,158, - 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, - 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,156,0,0,0,114,94,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 23,95,102,105,110,100,95,97,110,100,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,190,3,0,0,115,42,0,0, - 0,0,1,4,1,14,1,4,1,10,1,10,2,10,1,10, - 1,10,1,2,1,10,1,12,1,16,1,20,1,10,1,8, - 1,20,2,8,1,4,2,10,1,22,1,114,205,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0, - 124,0,131,1,143,62,1,0,116,1,106,2,160,3,124,0, - 116,4,161,2,125,2,124,2,116,4,117,0,114,56,116,5, - 124,0,124,1,131,2,87,0,2,0,100,1,4,0,4,0, - 131,3,1,0,83,0,87,0,100,1,4,0,4,0,131,3, - 1,0,110,16,49,0,115,76,48,0,1,0,1,0,1,0, - 89,0,1,0,124,2,100,1,117,0,114,116,100,2,160,6, - 124,0,161,1,125,3,116,7,124,3,124,0,100,3,141,2, - 130,1,116,8,124,0,131,1,1,0,124,2,83,0,41,4, - 122,25,70,105,110,100,32,97,110,100,32,108,111,97,100,32, - 116,104,101,32,109,111,100,117,108,101,46,78,122,40,105,109, - 112,111,114,116,32,111,102,32,123,125,32,104,97,108,116,101, - 100,59,32,78,111,110,101,32,105,110,32,115,121,115,46,109, - 111,100,117,108,101,115,114,16,0,0,0,41,9,114,49,0, + 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,144, + 1,114,18,116,1,106,2,124,3,25,0,125,4,124,0,160, + 0,100,1,161,1,100,5,25,0,125,8,122,16,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,110,48,4,0,116, + 5,144,1,121,16,1,0,1,0,1,0,100,6,124,3,155, + 2,100,7,124,8,155,2,157,4,125,5,116,12,160,13,124, + 5,116,14,161,2,1,0,89,0,110,2,48,0,124,7,83, + 0,41,8,78,114,127,0,0,0,114,22,0,0,0,122,23, + 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, + 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, + 0,122,27,67,97,110,110,111,116,32,115,101,116,32,97,110, + 32,97,116,116,114,105,98,117,116,101,32,111,110,32,122,18, + 32,102,111,114,32,99,104,105,108,100,32,109,111,100,117,108, + 101,32,41,15,114,128,0,0,0,114,15,0,0,0,114,91, + 0,0,0,114,66,0,0,0,114,140,0,0,0,114,105,0, + 0,0,218,8,95,69,82,82,95,77,83,71,114,44,0,0, + 0,218,19,77,111,100,117,108,101,78,111,116,70,111,117,110, + 100,69,114,114,111,114,114,194,0,0,0,114,158,0,0,0, + 114,5,0,0,0,114,191,0,0,0,114,192,0,0,0,114, + 193,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, + 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, + 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, + 0,0,114,94,0,0,0,114,95,0,0,0,90,5,99,104, + 105,108,100,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,23,95,102,105,110,100,95,97,110,100,95,108,111, + 97,100,95,117,110,108,111,99,107,101,100,190,3,0,0,115, + 52,0,0,0,0,1,4,1,14,1,4,1,10,1,10,2, + 10,1,10,1,10,1,2,1,10,1,12,1,16,1,20,1, + 10,1,8,1,20,2,8,1,6,2,10,1,14,1,2,1, + 16,1,14,1,16,1,18,1,114,205,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, + 0,0,67,0,0,0,115,128,0,0,0,116,0,124,0,131, + 1,143,62,1,0,116,1,106,2,160,3,124,0,116,4,161, + 2,125,2,124,2,116,4,117,0,114,56,116,5,124,0,124, + 1,131,2,87,0,2,0,100,1,4,0,4,0,131,3,1, + 0,83,0,87,0,100,1,4,0,4,0,131,3,1,0,110, + 16,49,0,115,76,48,0,1,0,1,0,1,0,89,0,1, + 0,124,2,100,1,117,0,114,116,100,2,160,6,124,0,161, + 1,125,3,116,7,124,3,124,0,100,3,141,2,130,1,116, + 8,124,0,131,1,1,0,124,2,83,0,41,4,122,25,70, + 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101, + 32,109,111,100,117,108,101,46,78,122,40,105,109,112,111,114, + 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, + 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,114,16,0,0,0,41,9,114,49,0,0,0,114, + 15,0,0,0,114,91,0,0,0,114,34,0,0,0,218,14, + 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,205, + 0,0,0,114,44,0,0,0,114,203,0,0,0,114,64,0, + 0,0,41,4,114,17,0,0,0,114,204,0,0,0,114,95, + 0,0,0,114,74,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,14,95,102,105,110,100,95,97, + 110,100,95,108,111,97,100,225,3,0,0,115,22,0,0,0, + 0,2,10,1,14,1,8,1,54,2,8,1,4,1,2,255, + 4,2,12,2,8,1,114,207,0,0,0,114,22,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, + 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, + 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, + 124,0,116,3,131,2,83,0,41,2,97,50,1,0,0,73, + 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, + 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, + 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, + 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, + 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, + 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, + 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, + 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, + 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, + 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, + 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, + 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, + 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, + 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, + 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, + 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, + 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, + 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, + 32,114,22,0,0,0,41,4,114,200,0,0,0,114,187,0, + 0,0,114,207,0,0,0,218,11,95,103,99,100,95,105,109, + 112,111,114,116,114,199,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,208,0,0,0,241,3,0, + 0,115,8,0,0,0,0,9,12,1,8,1,12,1,114,208, + 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, + 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,11,0,0,0,67,0,0,0,115,232,0,0,0,124,1, + 68,0,93,222,125,4,116,0,124,4,116,1,131,2,115,66, + 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, + 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, + 124,4,131,1,106,2,155,0,157,4,131,1,130,1,113,4, + 124,4,100,5,107,2,114,108,124,3,115,226,116,5,124,0, + 100,6,131,2,114,226,116,6,124,0,124,0,106,7,124,2, + 100,7,100,8,141,4,1,0,113,4,116,5,124,0,124,4, + 131,2,115,4,100,9,160,8,124,0,106,2,124,4,161,2, + 125,6,122,14,116,9,124,2,124,6,131,2,1,0,87,0, + 113,4,4,0,116,10,121,224,1,0,125,7,1,0,122,54, + 124,7,106,11,124,6,107,2,114,202,116,12,106,13,160,14, + 124,6,116,15,161,2,100,10,117,1,114,202,87,0,89,0, + 100,10,125,7,126,7,113,4,130,0,87,0,89,0,100,10, + 125,7,126,7,113,4,100,10,125,7,126,7,48,0,48,0, + 113,4,124,0,83,0,41,11,122,238,70,105,103,117,114,101, + 32,111,117,116,32,119,104,97,116,32,95,95,105,109,112,111, + 114,116,95,95,32,115,104,111,117,108,100,32,114,101,116,117, + 114,110,46,10,10,32,32,32,32,84,104,101,32,105,109,112, + 111,114,116,95,32,112,97,114,97,109,101,116,101,114,32,105, + 115,32,97,32,99,97,108,108,97,98,108,101,32,119,104,105, + 99,104,32,116,97,107,101,115,32,116,104,101,32,110,97,109, + 101,32,111,102,32,109,111,100,117,108,101,32,116,111,10,32, + 32,32,32,105,109,112,111,114,116,46,32,73,116,32,105,115, + 32,114,101,113,117,105,114,101,100,32,116,111,32,100,101,99, + 111,117,112,108,101,32,116,104,101,32,102,117,110,99,116,105, + 111,110,32,102,114,111,109,32,97,115,115,117,109,105,110,103, + 32,105,109,112,111,114,116,108,105,98,39,115,10,32,32,32, + 32,105,109,112,111,114,116,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,105,115,32,100,101,115,105,114,101, + 100,46,10,10,32,32,32,32,122,8,46,95,95,97,108,108, + 95,95,122,13,96,96,102,114,111,109,32,108,105,115,116,39, + 39,122,8,73,116,101,109,32,105,110,32,122,18,32,109,117, + 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,250, + 1,42,218,7,95,95,97,108,108,95,95,84,114,209,0,0, + 0,114,182,0,0,0,78,41,16,114,195,0,0,0,114,196, + 0,0,0,114,1,0,0,0,114,197,0,0,0,114,14,0, + 0,0,114,4,0,0,0,218,16,95,104,97,110,100,108,101, + 95,102,114,111,109,108,105,115,116,114,212,0,0,0,114,44, + 0,0,0,114,66,0,0,0,114,203,0,0,0,114,17,0, 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,218,14,95,78,69,69,68,83,95,76,79,65,68,73,78, - 71,114,205,0,0,0,114,44,0,0,0,114,203,0,0,0, - 114,64,0,0,0,41,4,114,17,0,0,0,114,204,0,0, - 0,114,95,0,0,0,114,74,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,14,95,102,105,110, - 100,95,97,110,100,95,108,111,97,100,220,3,0,0,115,22, - 0,0,0,0,2,10,1,14,1,8,1,54,2,8,1,4, - 1,2,255,4,2,12,2,8,1,114,207,0,0,0,114,22, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, - 0,116,0,124,0,124,1,124,2,131,3,1,0,124,2,100, - 1,107,4,114,32,116,1,124,0,124,1,124,2,131,3,125, - 0,116,2,124,0,116,3,131,2,83,0,41,2,97,50,1, - 0,0,73,109,112,111,114,116,32,97,110,100,32,114,101,116, - 117,114,110,32,116,104,101,32,109,111,100,117,108,101,32,98, - 97,115,101,100,32,111,110,32,105,116,115,32,110,97,109,101, - 44,32,116,104,101,32,112,97,99,107,97,103,101,32,116,104, - 101,32,99,97,108,108,32,105,115,10,32,32,32,32,98,101, - 105,110,103,32,109,97,100,101,32,102,114,111,109,44,32,97, - 110,100,32,116,104,101,32,108,101,118,101,108,32,97,100,106, - 117,115,116,109,101,110,116,46,10,10,32,32,32,32,84,104, - 105,115,32,102,117,110,99,116,105,111,110,32,114,101,112,114, - 101,115,101,110,116,115,32,116,104,101,32,103,114,101,97,116, - 101,115,116,32,99,111,109,109,111,110,32,100,101,110,111,109, - 105,110,97,116,111,114,32,111,102,32,102,117,110,99,116,105, - 111,110,97,108,105,116,121,10,32,32,32,32,98,101,116,119, - 101,101,110,32,105,109,112,111,114,116,95,109,111,100,117,108, - 101,32,97,110,100,32,95,95,105,109,112,111,114,116,95,95, - 46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32, - 115,101,116,116,105,110,103,32,95,95,112,97,99,107,97,103, - 101,95,95,32,105,102,10,32,32,32,32,116,104,101,32,108, - 111,97,100,101,114,32,100,105,100,32,110,111,116,46,10,10, - 32,32,32,32,114,22,0,0,0,41,4,114,200,0,0,0, - 114,187,0,0,0,114,207,0,0,0,218,11,95,103,99,100, - 95,105,109,112,111,114,116,114,199,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,208,0,0,0, - 236,3,0,0,115,8,0,0,0,0,9,12,1,8,1,12, - 1,114,208,0,0,0,169,1,218,9,114,101,99,117,114,115, - 105,118,101,99,3,0,0,0,0,0,0,0,1,0,0,0, - 8,0,0,0,11,0,0,0,67,0,0,0,115,232,0,0, - 0,124,1,68,0,93,222,125,4,116,0,124,4,116,1,131, - 2,115,66,124,3,114,34,124,0,106,2,100,1,23,0,125, - 5,110,4,100,2,125,5,116,3,100,3,124,5,155,0,100, - 4,116,4,124,4,131,1,106,2,155,0,157,4,131,1,130, - 1,113,4,124,4,100,5,107,2,114,108,124,3,115,226,116, - 5,124,0,100,6,131,2,114,226,116,6,124,0,124,0,106, - 7,124,2,100,7,100,8,141,4,1,0,113,4,116,5,124, - 0,124,4,131,2,115,4,100,9,160,8,124,0,106,2,124, - 4,161,2,125,6,122,14,116,9,124,2,124,6,131,2,1, - 0,87,0,113,4,4,0,116,10,121,224,1,0,125,7,1, - 0,122,54,124,7,106,11,124,6,107,2,114,202,116,12,106, - 13,160,14,124,6,116,15,161,2,100,10,117,1,114,202,87, - 0,89,0,100,10,125,7,126,7,113,4,130,0,87,0,89, - 0,100,10,125,7,126,7,113,4,100,10,125,7,126,7,48, - 0,48,0,113,4,124,0,83,0,41,11,122,238,70,105,103, - 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, - 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, - 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, - 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, - 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, - 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, - 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, - 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, - 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, - 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, - 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, - 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, - 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, - 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, - 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, - 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, - 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, - 209,0,0,0,114,182,0,0,0,78,41,16,114,195,0,0, - 0,114,196,0,0,0,114,1,0,0,0,114,197,0,0,0, - 114,14,0,0,0,114,4,0,0,0,218,16,95,104,97,110, - 100,108,101,95,102,114,111,109,108,105,115,116,114,212,0,0, - 0,114,44,0,0,0,114,66,0,0,0,114,203,0,0,0, - 114,17,0,0,0,114,15,0,0,0,114,91,0,0,0,114, - 34,0,0,0,114,206,0,0,0,41,8,114,95,0,0,0, - 218,8,102,114,111,109,108,105,115,116,114,204,0,0,0,114, - 210,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, - 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,213,0, - 0,0,251,3,0,0,115,44,0,0,0,0,10,8,1,10, - 1,4,1,12,2,4,1,28,2,8,1,14,1,10,1,2, - 255,8,2,10,1,14,1,2,1,14,1,14,4,10,1,16, - 255,2,2,12,1,26,1,114,213,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,6,0,0, - 0,67,0,0,0,115,146,0,0,0,124,0,160,0,100,1, - 161,1,125,1,124,0,160,0,100,2,161,1,125,2,124,1, - 100,3,117,1,114,82,124,2,100,3,117,1,114,78,124,1, - 124,2,106,1,107,3,114,78,116,2,106,3,100,4,124,1, - 155,2,100,5,124,2,106,1,155,2,100,6,157,5,116,4, - 100,7,100,8,141,3,1,0,124,1,83,0,124,2,100,3, - 117,1,114,96,124,2,106,1,83,0,116,2,106,3,100,9, - 116,4,100,7,100,8,141,3,1,0,124,0,100,10,25,0, - 125,1,100,11,124,0,118,1,114,142,124,1,160,5,100,12, - 161,1,100,13,25,0,125,1,124,1,83,0,41,14,122,167, - 67,97,108,99,117,108,97,116,101,32,119,104,97,116,32,95, - 95,112,97,99,107,97,103,101,95,95,32,115,104,111,117,108, - 100,32,98,101,46,10,10,32,32,32,32,95,95,112,97,99, - 107,97,103,101,95,95,32,105,115,32,110,111,116,32,103,117, - 97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100, - 101,102,105,110,101,100,32,111,114,32,99,111,117,108,100,32, - 98,101,32,115,101,116,32,116,111,32,78,111,110,101,10,32, - 32,32,32,116,111,32,114,101,112,114,101,115,101,110,116,32, - 116,104,97,116,32,105,116,115,32,112,114,111,112,101,114,32, - 118,97,108,117,101,32,105,115,32,117,110,107,110,111,119,110, - 46,10,10,32,32,32,32,114,144,0,0,0,114,104,0,0, - 0,78,122,32,95,95,112,97,99,107,97,103,101,95,95,32, - 33,61,32,95,95,115,112,101,99,95,95,46,112,97,114,101, - 110,116,32,40,122,4,32,33,61,32,250,1,41,233,3,0, - 0,0,41,1,90,10,115,116,97,99,107,108,101,118,101,108, - 122,89,99,97,110,39,116,32,114,101,115,111,108,118,101,32, - 112,97,99,107,97,103,101,32,102,114,111,109,32,95,95,115, - 112,101,99,95,95,32,111,114,32,95,95,112,97,99,107,97, - 103,101,95,95,44,32,102,97,108,108,105,110,103,32,98,97, - 99,107,32,111,110,32,95,95,110,97,109,101,95,95,32,97, - 110,100,32,95,95,112,97,116,104,95,95,114,1,0,0,0, - 114,140,0,0,0,114,127,0,0,0,114,22,0,0,0,41, - 6,114,34,0,0,0,114,129,0,0,0,114,191,0,0,0, - 114,192,0,0,0,114,193,0,0,0,114,128,0,0,0,41, - 3,218,7,103,108,111,98,97,108,115,114,185,0,0,0,114, - 94,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,17,95,99,97,108,99,95,95,95,112,97,99, - 107,97,103,101,95,95,32,4,0,0,115,38,0,0,0,0, - 7,10,1,10,1,8,1,18,1,22,2,2,0,2,254,6, - 3,4,1,8,1,6,2,6,2,2,0,2,254,6,3,8, - 1,8,1,14,1,114,219,0,0,0,114,10,0,0,0,99, - 5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 5,0,0,0,67,0,0,0,115,180,0,0,0,124,4,100, - 1,107,2,114,18,116,0,124,0,131,1,125,5,110,36,124, - 1,100,2,117,1,114,30,124,1,110,2,105,0,125,6,116, - 1,124,6,131,1,125,7,116,0,124,0,124,7,124,4,131, - 3,125,5,124,3,115,150,124,4,100,1,107,2,114,84,116, - 0,124,0,160,2,100,3,161,1,100,1,25,0,131,1,83, - 0,124,0,115,92,124,5,83,0,116,3,124,0,131,1,116, - 3,124,0,160,2,100,3,161,1,100,1,25,0,131,1,24, - 0,125,8,116,4,106,5,124,5,106,6,100,2,116,3,124, - 5,106,6,131,1,124,8,24,0,133,2,25,0,25,0,83, - 0,110,26,116,7,124,5,100,4,131,2,114,172,116,8,124, - 5,124,3,116,0,131,3,83,0,124,5,83,0,100,2,83, - 0,41,5,97,215,1,0,0,73,109,112,111,114,116,32,97, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,84,104, - 101,32,39,103,108,111,98,97,108,115,39,32,97,114,103,117, - 109,101,110,116,32,105,115,32,117,115,101,100,32,116,111,32, - 105,110,102,101,114,32,119,104,101,114,101,32,116,104,101,32, - 105,109,112,111,114,116,32,105,115,32,111,99,99,117,114,114, - 105,110,103,32,102,114,111,109,10,32,32,32,32,116,111,32, - 104,97,110,100,108,101,32,114,101,108,97,116,105,118,101,32, - 105,109,112,111,114,116,115,46,32,84,104,101,32,39,108,111, - 99,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105, - 115,32,105,103,110,111,114,101,100,46,32,84,104,101,10,32, - 32,32,32,39,102,114,111,109,108,105,115,116,39,32,97,114, - 103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,115, - 32,119,104,97,116,32,115,104,111,117,108,100,32,101,120,105, - 115,116,32,97,115,32,97,116,116,114,105,98,117,116,101,115, - 32,111,110,32,116,104,101,32,109,111,100,117,108,101,10,32, - 32,32,32,98,101,105,110,103,32,105,109,112,111,114,116,101, - 100,32,40,101,46,103,46,32,96,96,102,114,111,109,32,109, - 111,100,117,108,101,32,105,109,112,111,114,116,32,60,102,114, - 111,109,108,105,115,116,62,96,96,41,46,32,32,84,104,101, - 32,39,108,101,118,101,108,39,10,32,32,32,32,97,114,103, - 117,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115, - 32,116,104,101,32,112,97,99,107,97,103,101,32,108,111,99, - 97,116,105,111,110,32,116,111,32,105,109,112,111,114,116,32, - 102,114,111,109,32,105,110,32,97,32,114,101,108,97,116,105, - 118,101,10,32,32,32,32,105,109,112,111,114,116,32,40,101, - 46,103,46,32,96,96,102,114,111,109,32,46,46,112,107,103, - 32,105,109,112,111,114,116,32,109,111,100,96,96,32,119,111, - 117,108,100,32,104,97,118,101,32,97,32,39,108,101,118,101, - 108,39,32,111,102,32,50,41,46,10,10,32,32,32,32,114, - 22,0,0,0,78,114,127,0,0,0,114,140,0,0,0,41, - 9,114,208,0,0,0,114,219,0,0,0,218,9,112,97,114, - 116,105,116,105,111,110,114,184,0,0,0,114,15,0,0,0, - 114,91,0,0,0,114,1,0,0,0,114,4,0,0,0,114, - 213,0,0,0,41,9,114,17,0,0,0,114,218,0,0,0, - 218,6,108,111,99,97,108,115,114,214,0,0,0,114,186,0, - 0,0,114,95,0,0,0,90,8,103,108,111,98,97,108,115, - 95,114,185,0,0,0,90,7,99,117,116,95,111,102,102,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,10, - 95,95,105,109,112,111,114,116,95,95,59,4,0,0,115,30, - 0,0,0,0,11,8,1,10,2,16,1,8,1,12,1,4, - 3,8,1,18,1,4,1,4,4,26,3,32,1,10,1,12, - 2,114,222,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,116,0,160,1,124,0,161,1,125,1,124,1, - 100,0,117,0,114,30,116,2,100,1,124,0,23,0,131,1, - 130,1,116,3,124,1,131,1,83,0,41,2,78,122,25,110, - 111,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,32,110,97,109,101,100,32,41,4,114,159,0,0,0,114, - 166,0,0,0,114,78,0,0,0,114,158,0,0,0,41,2, - 114,17,0,0,0,114,94,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,18,95,98,117,105,108, - 116,105,110,95,102,114,111,109,95,110,97,109,101,96,4,0, - 0,115,8,0,0,0,0,1,10,1,8,1,12,1,114,223, + 0,114,206,0,0,0,41,8,114,95,0,0,0,218,8,102, + 114,111,109,108,105,115,116,114,204,0,0,0,114,210,0,0, + 0,218,1,120,90,5,119,104,101,114,101,90,9,102,114,111, + 109,95,110,97,109,101,90,3,101,120,99,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,213,0,0,0,0, + 4,0,0,115,44,0,0,0,0,10,8,1,10,1,4,1, + 12,2,4,1,28,2,8,1,14,1,10,1,2,255,8,2, + 10,1,14,1,2,1,14,1,14,4,10,1,16,255,2,2, + 12,1,26,1,114,213,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,6,0,0,0,67,0, + 0,0,115,146,0,0,0,124,0,160,0,100,1,161,1,125, + 1,124,0,160,0,100,2,161,1,125,2,124,1,100,3,117, + 1,114,82,124,2,100,3,117,1,114,78,124,1,124,2,106, + 1,107,3,114,78,116,2,106,3,100,4,124,1,155,2,100, + 5,124,2,106,1,155,2,100,6,157,5,116,4,100,7,100, + 8,141,3,1,0,124,1,83,0,124,2,100,3,117,1,114, + 96,124,2,106,1,83,0,116,2,106,3,100,9,116,4,100, + 7,100,8,141,3,1,0,124,0,100,10,25,0,125,1,100, + 11,124,0,118,1,114,142,124,1,160,5,100,12,161,1,100, + 13,25,0,125,1,124,1,83,0,41,14,122,167,67,97,108, + 99,117,108,97,116,101,32,119,104,97,116,32,95,95,112,97, + 99,107,97,103,101,95,95,32,115,104,111,117,108,100,32,98, + 101,46,10,10,32,32,32,32,95,95,112,97,99,107,97,103, + 101,95,95,32,105,115,32,110,111,116,32,103,117,97,114,97, + 110,116,101,101,100,32,116,111,32,98,101,32,100,101,102,105, + 110,101,100,32,111,114,32,99,111,117,108,100,32,98,101,32, + 115,101,116,32,116,111,32,78,111,110,101,10,32,32,32,32, + 116,111,32,114,101,112,114,101,115,101,110,116,32,116,104,97, + 116,32,105,116,115,32,112,114,111,112,101,114,32,118,97,108, + 117,101,32,105,115,32,117,110,107,110,111,119,110,46,10,10, + 32,32,32,32,114,144,0,0,0,114,104,0,0,0,78,122, + 32,95,95,112,97,99,107,97,103,101,95,95,32,33,61,32, + 95,95,115,112,101,99,95,95,46,112,97,114,101,110,116,32, + 40,122,4,32,33,61,32,250,1,41,233,3,0,0,0,41, + 1,90,10,115,116,97,99,107,108,101,118,101,108,122,89,99, + 97,110,39,116,32,114,101,115,111,108,118,101,32,112,97,99, + 107,97,103,101,32,102,114,111,109,32,95,95,115,112,101,99, + 95,95,32,111,114,32,95,95,112,97,99,107,97,103,101,95, + 95,44,32,102,97,108,108,105,110,103,32,98,97,99,107,32, + 111,110,32,95,95,110,97,109,101,95,95,32,97,110,100,32, + 95,95,112,97,116,104,95,95,114,1,0,0,0,114,140,0, + 0,0,114,127,0,0,0,114,22,0,0,0,41,6,114,34, + 0,0,0,114,129,0,0,0,114,191,0,0,0,114,192,0, + 0,0,114,193,0,0,0,114,128,0,0,0,41,3,218,7, + 103,108,111,98,97,108,115,114,185,0,0,0,114,94,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,103, + 101,95,95,37,4,0,0,115,38,0,0,0,0,7,10,1, + 10,1,8,1,18,1,22,2,2,0,2,254,6,3,4,1, + 8,1,6,2,6,2,2,0,2,254,6,3,8,1,8,1, + 14,1,114,219,0,0,0,114,10,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,9,0,0,0,5,0,0, + 0,67,0,0,0,115,180,0,0,0,124,4,100,1,107,2, + 114,18,116,0,124,0,131,1,125,5,110,36,124,1,100,2, + 117,1,114,30,124,1,110,2,105,0,125,6,116,1,124,6, + 131,1,125,7,116,0,124,0,124,7,124,4,131,3,125,5, + 124,3,115,150,124,4,100,1,107,2,114,84,116,0,124,0, + 160,2,100,3,161,1,100,1,25,0,131,1,83,0,124,0, + 115,92,124,5,83,0,116,3,124,0,131,1,116,3,124,0, + 160,2,100,3,161,1,100,1,25,0,131,1,24,0,125,8, + 116,4,106,5,124,5,106,6,100,2,116,3,124,5,106,6, + 131,1,124,8,24,0,133,2,25,0,25,0,83,0,110,26, + 116,7,124,5,100,4,131,2,114,172,116,8,124,5,124,3, + 116,0,131,3,83,0,124,5,83,0,100,2,83,0,41,5, + 97,215,1,0,0,73,109,112,111,114,116,32,97,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,84,104,101,32,39, + 103,108,111,98,97,108,115,39,32,97,114,103,117,109,101,110, + 116,32,105,115,32,117,115,101,100,32,116,111,32,105,110,102, + 101,114,32,119,104,101,114,101,32,116,104,101,32,105,109,112, + 111,114,116,32,105,115,32,111,99,99,117,114,114,105,110,103, + 32,102,114,111,109,10,32,32,32,32,116,111,32,104,97,110, + 100,108,101,32,114,101,108,97,116,105,118,101,32,105,109,112, + 111,114,116,115,46,32,84,104,101,32,39,108,111,99,97,108, + 115,39,32,97,114,103,117,109,101,110,116,32,105,115,32,105, + 103,110,111,114,101,100,46,32,84,104,101,10,32,32,32,32, + 39,102,114,111,109,108,105,115,116,39,32,97,114,103,117,109, + 101,110,116,32,115,112,101,99,105,102,105,101,115,32,119,104, + 97,116,32,115,104,111,117,108,100,32,101,120,105,115,116,32, + 97,115,32,97,116,116,114,105,98,117,116,101,115,32,111,110, + 32,116,104,101,32,109,111,100,117,108,101,10,32,32,32,32, + 98,101,105,110,103,32,105,109,112,111,114,116,101,100,32,40, + 101,46,103,46,32,96,96,102,114,111,109,32,109,111,100,117, + 108,101,32,105,109,112,111,114,116,32,60,102,114,111,109,108, + 105,115,116,62,96,96,41,46,32,32,84,104,101,32,39,108, + 101,118,101,108,39,10,32,32,32,32,97,114,103,117,109,101, + 110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104, + 101,32,112,97,99,107,97,103,101,32,108,111,99,97,116,105, + 111,110,32,116,111,32,105,109,112,111,114,116,32,102,114,111, + 109,32,105,110,32,97,32,114,101,108,97,116,105,118,101,10, + 32,32,32,32,105,109,112,111,114,116,32,40,101,46,103,46, + 32,96,96,102,114,111,109,32,46,46,112,107,103,32,105,109, + 112,111,114,116,32,109,111,100,96,96,32,119,111,117,108,100, + 32,104,97,118,101,32,97,32,39,108,101,118,101,108,39,32, + 111,102,32,50,41,46,10,10,32,32,32,32,114,22,0,0, + 0,78,114,127,0,0,0,114,140,0,0,0,41,9,114,208, + 0,0,0,114,219,0,0,0,218,9,112,97,114,116,105,116, + 105,111,110,114,184,0,0,0,114,15,0,0,0,114,91,0, + 0,0,114,1,0,0,0,114,4,0,0,0,114,213,0,0, + 0,41,9,114,17,0,0,0,114,218,0,0,0,218,6,108, + 111,99,97,108,115,114,214,0,0,0,114,186,0,0,0,114, + 95,0,0,0,90,8,103,108,111,98,97,108,115,95,114,185, + 0,0,0,90,7,99,117,116,95,111,102,102,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,10,95,95,105, + 109,112,111,114,116,95,95,64,4,0,0,115,30,0,0,0, + 0,11,8,1,10,2,16,1,8,1,12,1,4,3,8,1, + 18,1,4,1,4,4,26,3,32,1,10,1,12,2,114,222, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,116,0,160,1,124,0,161,1,125,1,124,1,100,0,117, + 0,114,30,116,2,100,1,124,0,23,0,131,1,130,1,116, + 3,124,1,131,1,83,0,41,2,78,122,25,110,111,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,32,110, + 97,109,101,100,32,41,4,114,159,0,0,0,114,166,0,0, + 0,114,78,0,0,0,114,158,0,0,0,41,2,114,17,0, + 0,0,114,94,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,18,95,98,117,105,108,116,105,110, + 95,102,114,111,109,95,110,97,109,101,101,4,0,0,115,8, + 0,0,0,0,1,10,1,8,1,12,1,114,223,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,10,0,0, + 0,5,0,0,0,67,0,0,0,115,166,0,0,0,124,1, + 97,0,124,0,97,1,116,2,116,1,131,1,125,2,116,1, + 106,3,160,4,161,0,68,0,93,72,92,2,125,3,125,4, + 116,5,124,4,124,2,131,2,114,26,124,3,116,1,106,6, + 118,0,114,60,116,7,125,5,110,18,116,0,160,8,124,3, + 161,1,114,26,116,9,125,5,110,2,113,26,116,10,124,4, + 124,5,131,2,125,6,116,11,124,6,124,4,131,2,1,0, + 113,26,116,1,106,3,116,12,25,0,125,7,100,1,68,0, + 93,46,125,8,124,8,116,1,106,3,118,1,114,138,116,13, + 124,8,131,1,125,9,110,10,116,1,106,3,124,8,25,0, + 125,9,116,14,124,7,124,8,124,9,131,3,1,0,113,114, + 100,2,83,0,41,3,122,250,83,101,116,117,112,32,105,109, + 112,111,114,116,108,105,98,32,98,121,32,105,109,112,111,114, + 116,105,110,103,32,110,101,101,100,101,100,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,97,110,100, + 32,105,110,106,101,99,116,105,110,103,32,116,104,101,109,10, + 32,32,32,32,105,110,116,111,32,116,104,101,32,103,108,111, + 98,97,108,32,110,97,109,101,115,112,97,99,101,46,10,10, + 32,32,32,32,65,115,32,115,121,115,32,105,115,32,110,101, + 101,100,101,100,32,102,111,114,32,115,121,115,46,109,111,100, + 117,108,101,115,32,97,99,99,101,115,115,32,97,110,100,32, + 95,105,109,112,32,105,115,32,110,101,101,100,101,100,32,116, + 111,32,108,111,97,100,32,98,117,105,108,116,45,105,110,10, + 32,32,32,32,109,111,100,117,108,101,115,44,32,116,104,111, + 115,101,32,116,119,111,32,109,111,100,117,108,101,115,32,109, + 117,115,116,32,98,101,32,101,120,112,108,105,99,105,116,108, + 121,32,112,97,115,115,101,100,32,105,110,46,10,10,32,32, + 32,32,41,3,114,23,0,0,0,114,191,0,0,0,114,63, + 0,0,0,78,41,15,114,56,0,0,0,114,15,0,0,0, + 114,14,0,0,0,114,91,0,0,0,218,5,105,116,101,109, + 115,114,195,0,0,0,114,77,0,0,0,114,159,0,0,0, + 114,87,0,0,0,114,173,0,0,0,114,141,0,0,0,114, + 147,0,0,0,114,1,0,0,0,114,223,0,0,0,114,5, + 0,0,0,41,10,218,10,115,121,115,95,109,111,100,117,108, + 101,218,11,95,105,109,112,95,109,111,100,117,108,101,90,11, + 109,111,100,117,108,101,95,116,121,112,101,114,17,0,0,0, + 114,95,0,0,0,114,108,0,0,0,114,94,0,0,0,90, + 11,115,101,108,102,95,109,111,100,117,108,101,90,12,98,117, + 105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108, + 116,105,110,95,109,111,100,117,108,101,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,6,95,115,101,116,117, + 112,108,4,0,0,115,36,0,0,0,0,9,4,1,4,3, + 8,1,18,1,10,1,10,1,6,1,10,1,6,2,2,1, + 10,1,12,3,10,1,8,1,10,1,10,2,10,1,114,227, 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, - 0,124,1,97,0,124,0,97,1,116,2,116,1,131,1,125, - 2,116,1,106,3,160,4,161,0,68,0,93,72,92,2,125, - 3,125,4,116,5,124,4,124,2,131,2,114,26,124,3,116, - 1,106,6,118,0,114,60,116,7,125,5,110,18,116,0,160, - 8,124,3,161,1,114,26,116,9,125,5,110,2,113,26,116, - 10,124,4,124,5,131,2,125,6,116,11,124,6,124,4,131, - 2,1,0,113,26,116,1,106,3,116,12,25,0,125,7,100, - 1,68,0,93,46,125,8,124,8,116,1,106,3,118,1,114, - 138,116,13,124,8,131,1,125,9,110,10,116,1,106,3,124, - 8,25,0,125,9,116,14,124,7,124,8,124,9,131,3,1, - 0,113,114,100,2,83,0,41,3,122,250,83,101,116,117,112, - 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, - 112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,104, - 101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,32, - 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, - 46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,115, - 32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,46, - 109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,97, - 110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,101, - 100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,45, - 105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,32, - 116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,101, - 115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,99, - 105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,10, - 10,32,32,32,32,41,3,114,23,0,0,0,114,191,0,0, - 0,114,63,0,0,0,78,41,15,114,56,0,0,0,114,15, - 0,0,0,114,14,0,0,0,114,91,0,0,0,218,5,105, - 116,101,109,115,114,195,0,0,0,114,77,0,0,0,114,159, - 0,0,0,114,87,0,0,0,114,173,0,0,0,114,141,0, - 0,0,114,147,0,0,0,114,1,0,0,0,114,223,0,0, - 0,114,5,0,0,0,41,10,218,10,115,121,115,95,109,111, - 100,117,108,101,218,11,95,105,109,112,95,109,111,100,117,108, - 101,90,11,109,111,100,117,108,101,95,116,121,112,101,114,17, - 0,0,0,114,95,0,0,0,114,108,0,0,0,114,94,0, - 0,0,90,11,115,101,108,102,95,109,111,100,117,108,101,90, - 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, - 117,105,108,116,105,110,95,109,111,100,117,108,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,6,95,115, - 101,116,117,112,103,4,0,0,115,36,0,0,0,0,9,4, - 1,4,3,8,1,18,1,10,1,10,1,6,1,10,1,6, - 2,2,1,10,1,12,3,10,1,8,1,10,1,10,2,10, - 1,114,227,0,0,0,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, - 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, - 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, - 6,114,227,0,0,0,114,15,0,0,0,114,190,0,0,0, - 114,118,0,0,0,114,159,0,0,0,114,173,0,0,0,41, - 2,114,225,0,0,0,114,226,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,8,95,105,110,115, - 116,97,108,108,138,4,0,0,115,6,0,0,0,0,2,10, - 2,12,1,114,228,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, - 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, - 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, - 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, - 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, - 101,115,115,114,22,0,0,0,78,41,6,218,26,95,102,114, - 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, - 120,116,101,114,110,97,108,114,125,0,0,0,114,228,0,0, - 0,114,15,0,0,0,114,91,0,0,0,114,1,0,0,0, - 41,1,114,229,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,27,95,105,110,115,116,97,108,108, - 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, - 101,114,115,146,4,0,0,115,6,0,0,0,0,3,8,1, - 4,1,114,230,0,0,0,41,2,78,78,41,1,78,41,2, - 78,114,22,0,0,0,41,4,78,78,114,10,0,0,0,114, - 22,0,0,0,41,50,114,3,0,0,0,114,125,0,0,0, - 114,12,0,0,0,114,18,0,0,0,114,58,0,0,0,114, - 33,0,0,0,114,42,0,0,0,114,19,0,0,0,114,20, - 0,0,0,114,48,0,0,0,114,49,0,0,0,114,52,0, - 0,0,114,64,0,0,0,114,66,0,0,0,114,75,0,0, - 0,114,85,0,0,0,114,89,0,0,0,114,96,0,0,0, - 114,110,0,0,0,114,111,0,0,0,114,90,0,0,0,114, - 141,0,0,0,114,147,0,0,0,114,151,0,0,0,114,106, - 0,0,0,114,92,0,0,0,114,157,0,0,0,114,158,0, - 0,0,114,93,0,0,0,114,159,0,0,0,114,173,0,0, - 0,114,178,0,0,0,114,187,0,0,0,114,189,0,0,0, - 114,194,0,0,0,114,200,0,0,0,90,15,95,69,82,82, - 95,77,83,71,95,80,82,69,70,73,88,114,202,0,0,0, - 114,205,0,0,0,218,6,111,98,106,101,99,116,114,206,0, - 0,0,114,207,0,0,0,114,208,0,0,0,114,213,0,0, - 0,114,219,0,0,0,114,222,0,0,0,114,223,0,0,0, - 114,227,0,0,0,114,228,0,0,0,114,230,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, - 0,115,94,0,0,0,4,24,4,2,8,8,8,8,4,2, - 4,3,16,4,14,68,14,21,14,16,8,37,8,17,8,11, - 14,8,8,11,8,12,8,16,8,36,14,101,16,26,10,45, - 14,72,8,17,8,17,8,30,8,37,8,42,8,15,14,75, - 14,79,14,13,8,9,8,9,10,47,8,16,4,1,8,2, - 8,27,6,3,8,16,10,15,14,37,8,27,10,37,8,7, - 8,35,8,8, + 2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,116,0,124,0,124,1,131,2,1,0,116,1,106,2,160, + 3,116,4,161,1,1,0,116,1,106,2,160,3,116,5,161, + 1,1,0,100,1,83,0,41,2,122,48,73,110,115,116,97, + 108,108,32,105,109,112,111,114,116,101,114,115,32,102,111,114, + 32,98,117,105,108,116,105,110,32,97,110,100,32,102,114,111, + 122,101,110,32,109,111,100,117,108,101,115,78,41,6,114,227, + 0,0,0,114,15,0,0,0,114,190,0,0,0,114,118,0, + 0,0,114,159,0,0,0,114,173,0,0,0,41,2,114,225, + 0,0,0,114,226,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,8,95,105,110,115,116,97,108, + 108,143,4,0,0,115,6,0,0,0,0,2,10,2,12,1, + 114,228,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,32, + 0,0,0,100,1,100,2,108,0,125,0,124,0,97,1,124, + 0,160,2,116,3,106,4,116,5,25,0,161,1,1,0,100, + 2,83,0,41,3,122,57,73,110,115,116,97,108,108,32,105, + 109,112,111,114,116,101,114,115,32,116,104,97,116,32,114,101, + 113,117,105,114,101,32,101,120,116,101,114,110,97,108,32,102, + 105,108,101,115,121,115,116,101,109,32,97,99,99,101,115,115, + 114,22,0,0,0,78,41,6,218,26,95,102,114,111,122,101, + 110,95,105,109,112,111,114,116,108,105,98,95,101,120,116,101, + 114,110,97,108,114,125,0,0,0,114,228,0,0,0,114,15, + 0,0,0,114,91,0,0,0,114,1,0,0,0,41,1,114, + 229,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,27,95,105,110,115,116,97,108,108,95,101,120, + 116,101,114,110,97,108,95,105,109,112,111,114,116,101,114,115, + 151,4,0,0,115,6,0,0,0,0,3,8,1,4,1,114, + 230,0,0,0,41,2,78,78,41,1,78,41,2,78,114,22, + 0,0,0,41,4,78,78,114,10,0,0,0,114,22,0,0, + 0,41,50,114,3,0,0,0,114,125,0,0,0,114,12,0, + 0,0,114,18,0,0,0,114,58,0,0,0,114,33,0,0, + 0,114,42,0,0,0,114,19,0,0,0,114,20,0,0,0, + 114,48,0,0,0,114,49,0,0,0,114,52,0,0,0,114, + 64,0,0,0,114,66,0,0,0,114,75,0,0,0,114,85, + 0,0,0,114,89,0,0,0,114,96,0,0,0,114,110,0, + 0,0,114,111,0,0,0,114,90,0,0,0,114,141,0,0, + 0,114,147,0,0,0,114,151,0,0,0,114,106,0,0,0, + 114,92,0,0,0,114,157,0,0,0,114,158,0,0,0,114, + 93,0,0,0,114,159,0,0,0,114,173,0,0,0,114,178, + 0,0,0,114,187,0,0,0,114,189,0,0,0,114,194,0, + 0,0,114,200,0,0,0,90,15,95,69,82,82,95,77,83, + 71,95,80,82,69,70,73,88,114,202,0,0,0,114,205,0, + 0,0,218,6,111,98,106,101,99,116,114,206,0,0,0,114, + 207,0,0,0,114,208,0,0,0,114,213,0,0,0,114,219, + 0,0,0,114,222,0,0,0,114,223,0,0,0,114,227,0, + 0,0,114,228,0,0,0,114,230,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,94, + 0,0,0,4,24,4,2,8,8,8,8,4,2,4,3,16, + 4,14,68,14,21,14,16,8,37,8,17,8,11,14,8,8, + 11,8,12,8,16,8,36,14,101,16,26,10,45,14,72,8, + 17,8,17,8,30,8,37,8,42,8,15,14,75,14,79,14, + 13,8,9,8,9,10,47,8,16,4,1,8,2,8,32,6, + 3,8,16,10,15,14,37,8,27,10,37,8,7,8,35,8, + 8, }; From webhook-mailer at python.org Wed Jan 22 20:03:09 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 01:03:09 -0000 Subject: [Python-checkins] bpo-39427: Document -X opt options in the CLI --help and the man page (GH-18131) Message-ID: https://github.com/python/cpython/commit/41f0ef6abbd304409c55612a08788cdd59fbc8a3 commit: 41f0ef6abbd304409c55612a08788cdd59fbc8a3 branch: master author: Pablo Galindo committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-22T17:03:04-08:00 summary: bpo-39427: Document -X opt options in the CLI --help and the man page (GH-18131) https://bugs.python.org/issue39427 Automerge-Triggered-By: @pablogsal files: A Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst M Misc/python.man M Python/initconfig.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst new file mode 100644 index 0000000000000..a3915a4d81c79 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst @@ -0,0 +1,2 @@ +Document all possibilities for the ``-X`` options in the command line help +section. Patch by Pablo Galindo. diff --git a/Misc/python.man b/Misc/python.man index 3aa9f1f9c7eac..3645b0206eb2b 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -273,7 +273,45 @@ field matches the line number, where zero matches all line numbers and is thus equivalent to an omitted line number. .TP .BI "\-X " option -Set implementation specific option. +Set implementation specific option. The following options are available: + + -X faulthandler: enable faulthandler + + -X showrefcount: output the total reference count and number of used + memory blocks when the program finishes or after each statement in the + interactive interpreter. This only works on debug builds + + -X tracemalloc: start tracing Python memory allocations using the + tracemalloc module. By default, only the most recent frame is stored in a + traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a + traceback limit of NFRAME frames + + -X showalloccount: output the total count of allocated objects for each + type when the program finishes. This only works when Python was built with + COUNT_ALLOCS defined + + -X importtime: show how long each import takes. It shows module name, + cumulative time (including nested imports) and self time (excluding + nested imports). Note that its output may be broken in multi-threaded + application. Typical usage is python3 -X importtime -c 'import asyncio' + + -X dev: enable CPython?s ?development mode?, introducing additional runtime + checks which are too expensive to be enabled by default. It will not be + more verbose than the default if the code is correct: new warnings are + only emitted when an issue is detected. Effect of the developer mode: + * Add default warning filter, as -W default + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function + * Enable the faulthandler module to dump the Python traceback on a crash + * Enable asyncio debug mode + * Set the dev_mode attribute of sys.flags to True + * io.IOBase destructor logs close() exceptions + + -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default + locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would + otherwise activate automatically). See PYTHONUTF8 for more details + + -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the + given directory instead of to the code tree. .TP .B \-x Skip the first line of the source. This is intended for a DOS diff --git a/Python/initconfig.c b/Python/initconfig.c index 2e46999932f8a..9a784c75116aa 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -63,7 +63,38 @@ static const char usage_3[] = "\ -W arg : warning control; arg is action:message:category:module:lineno\n\ also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ --X opt : set implementation-specific option\n\ +-X opt : set implementation-specific option. The following options are available:\n\ +\n\ + -X faulthandler: enable faulthandler\n\ + -X showrefcount: output the total reference count and number of used\n\ + memory blocks when the program finishes or after each statement in the\n\ + interactive interpreter. This only works on debug builds\n\ + -X tracemalloc: start tracing Python memory allocations using the\n\ + tracemalloc module. By default, only the most recent frame is stored in a\n\ + traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a\n\ + traceback limit of NFRAME frames\n\ + -X showalloccount: output the total count of allocated objects for each\n\ + type when the program finishes. This only works when Python was built with\n\ + COUNT_ALLOCS defined\n\ + -X importtime: show how long each import takes. It shows module name,\n\ + cumulative time (including nested imports) and self time (excluding\n\ + nested imports). Note that its output may be broken in multi-threaded\n\ + application. Typical usage is python3 -X importtime -c 'import asyncio'\n\ + -X dev: enable CPython?s ?development mode?, introducing additional runtime\n\ + checks which are too expensive to be enabled by default. Effect of the\n\ + developer mode:\n\ + * Add default warning filter, as -W default\n\ + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function\n\ + * Enable the faulthandler module to dump the Python traceback on a crash\n\ + * Enable asyncio debug mode\n\ + * Set the dev_mode attribute of sys.flags to True\n\ + * io.IOBase destructor logs close() exceptions\n\ + -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default\n\ + locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would\n\ + otherwise activate automatically)\n\ + -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the\n\ + given directory instead of to the code tree\n\ +\n\ --check-hash-based-pycs always|default|never:\n\ control how Python invalidates hash-based .pyc files\n\ "; From webhook-mailer at python.org Wed Jan 22 21:24:30 2020 From: webhook-mailer at python.org (Ethan Furman) Date: Thu, 23 Jan 2020 02:24:30 -0000 Subject: [Python-checkins] bpo-29435: Allow is_tarfile to take a filelike obj (GH-18090) Message-ID: https://github.com/python/cpython/commit/dd754caf144009f0569dda5053465ba2accb7b4d commit: dd754caf144009f0569dda5053465ba2accb7b4d branch: master author: William Woodruff committer: Ethan Furman date: 2020-01-22T18:24:16-08:00 summary: bpo-29435: Allow is_tarfile to take a filelike obj (GH-18090) `is_tarfile()` now supports `name` being a file or file-like object. files: A Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst M Doc/library/tarfile.rst M Lib/tarfile.py M Lib/test/test_tarfile.py M Misc/ACKS diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index c34f2c4a57024..459e4ad991d9d 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -159,7 +159,10 @@ Some facts and figures: .. function:: is_tarfile(name) Return :const:`True` if *name* is a tar archive file, that the :mod:`tarfile` - module can read. + module can read. *name* may be a :class:`str`, file, or file-like object. + + .. versionchanged:: 3.9 + Support for file and file-like objects. The :mod:`tarfile` module defines the following exceptions: diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 2c06f9160c658..d0b748cea1723 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2461,9 +2461,14 @@ def __exit__(self, type, value, traceback): def is_tarfile(name): """Return True if name points to a tar archive that we are able to handle, else return False. + + 'name' should be a string, file, or file-like object. """ try: - t = open(name) + if hasattr(name, "read"): + t = open(fileobj=name) + else: + t = open(name) t.close() return True except TarError: diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 15324a4e48819..6a901089611cd 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -319,6 +319,38 @@ class LzmaListTest(LzmaTest, ListTest): class CommonReadTest(ReadTest): + def test_is_tarfile_erroneous(self): + with open(tmpname, "wb"): + pass + + # is_tarfile works on filenames + self.assertFalse(tarfile.is_tarfile(tmpname)) + + # is_tarfile works on path-like objects + self.assertFalse(tarfile.is_tarfile(pathlib.Path(tmpname))) + + # is_tarfile works on file objects + with open(tmpname, "rb") as fobj: + self.assertFalse(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + self.assertFalse(tarfile.is_tarfile(io.BytesIO(b"invalid"))) + + def test_is_tarfile_valid(self): + # is_tarfile works on filenames + self.assertTrue(tarfile.is_tarfile(self.tarname)) + + # is_tarfile works on path-like objects + self.assertTrue(tarfile.is_tarfile(pathlib.Path(self.tarname))) + + # is_tarfile works on file objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(io.BytesIO(fobj.read()))) + def test_empty_tarfile(self): # Test for issue6123: Allow opening empty archives. # This test checks if tarfile.open() is able to open an empty tar diff --git a/Misc/ACKS b/Misc/ACKS index 3e45d5d0f7f29..7e4b81bfdee62 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1856,6 +1856,7 @@ Klaus-Juergen Wolf Dan Wolfe Richard Wolff Adam Woodbeck +William Woodruff Steven Work Gordon Worley Darren Worrall diff --git a/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst b/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst new file mode 100644 index 0000000000000..eabc94242c813 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst @@ -0,0 +1,2 @@ +Allow :func:`tarfile.is_tarfile` to be used with file and file-like +objects, like :func:`zipfile.is_zipfile`. Patch by William Woodruff. From webhook-mailer at python.org Wed Jan 22 22:54:34 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Thu, 23 Jan 2020 03:54:34 -0000 Subject: [Python-checkins] bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Message-ID: https://github.com/python/cpython/commit/2e43b64c94e49f7133b9c26e84c9519935c49063 commit: 2e43b64c94e49f7133b9c26e84c9519935c49063 branch: master author: Zackery Spytz committer: Terry Jan Reedy date: 2020-01-22T22:54:30-05:00 summary: bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 9f8894e517b76..69bf5603068d6 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2020-10-05? ====================================== +bpo-39050: Make Settings dialog Help button work again. + bpo-32989: Add tests for editor newline_and_indent_event method. Remove dead code from pyparse find_good_parse_start method. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index aaf319bbe1bef..0e007b516ea5e 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -210,7 +210,7 @@ def help(self): """ page = self.note.tab(self.note.select(), option='text').strip() view_text(self, title='Help for IDLE preferences', - text=help_common+help_pages.get(page, '')) + contents=help_common+help_pages.get(page, '')) def deactivate_current_config(self): """Remove current key bindings. diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 1f14ed1f26473..7c575d0e5992c 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,6 +47,17 @@ def tearDownModule(): root.destroy() root = dialog = None +class ConfigDialogTest(unittest.TestCase): + + def test_help(self): + dialog.note.select(dialog.keyspage) + saved = configdialog.view_text + view = configdialog.view_text = Func() + dialog.help() + s = view.kwds['contents'] + self.assertTrue(s.startswith('When you click')) + self.assertTrue(s.endswith('a different name.\n')) + configdialog.view_text = saved class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst new file mode 100644 index 0000000000000..e71265cdf109b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst @@ -0,0 +1 @@ +Make IDLE Settings dialog Help button work again. From webhook-mailer at python.org Wed Jan 22 23:11:57 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 04:11:57 -0000 Subject: [Python-checkins] bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Message-ID: https://github.com/python/cpython/commit/ba83d1eb1c7b5e8eab17da364a6324b0b0e0932b commit: ba83d1eb1c7b5e8eab17da364a6324b0b0e0932b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-22T20:11:53-08:00 summary: bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Co-authored-by: Terry Jan Reedy (cherry picked from commit 2e43b64c94e49f7133b9c26e84c9519935c49063) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 817bb2e0261c2..379e8c102d948 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-12-16? ====================================== +bpo-39050: Make Settings dialog Help button work again. + bpo-32989: Add tests for editor newline_and_indent_event method. Remove dead code from pyparse find_good_parse_start method. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index aaf319bbe1bef..0e007b516ea5e 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -210,7 +210,7 @@ def help(self): """ page = self.note.tab(self.note.select(), option='text').strip() view_text(self, title='Help for IDLE preferences', - text=help_common+help_pages.get(page, '')) + contents=help_common+help_pages.get(page, '')) def deactivate_current_config(self): """Remove current key bindings. diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 1f14ed1f26473..7c575d0e5992c 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,6 +47,17 @@ def tearDownModule(): root.destroy() root = dialog = None +class ConfigDialogTest(unittest.TestCase): + + def test_help(self): + dialog.note.select(dialog.keyspage) + saved = configdialog.view_text + view = configdialog.view_text = Func() + dialog.help() + s = view.kwds['contents'] + self.assertTrue(s.startswith('When you click')) + self.assertTrue(s.endswith('a different name.\n')) + configdialog.view_text = saved class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst new file mode 100644 index 0000000000000..e71265cdf109b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst @@ -0,0 +1 @@ +Make IDLE Settings dialog Help button work again. From webhook-mailer at python.org Wed Jan 22 23:13:34 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 04:13:34 -0000 Subject: [Python-checkins] bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Message-ID: https://github.com/python/cpython/commit/3b7618809df647574e8aad4c2d869a1d55df147c commit: 3b7618809df647574e8aad4c2d869a1d55df147c branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-22T20:13:29-08:00 summary: bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Co-authored-by: Terry Jan Reedy (cherry picked from commit 2e43b64c94e49f7133b9c26e84c9519935c49063) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 6e30ef35081f2..b0bcacdf58604 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-12-16? ====================================== +bpo-39050: Make Settings dialog Help button work again. + bpo-32989: Add tests for editor newline_and_indent_event method. Remove dead code from pyparse find_good_parse_start method. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index aaf319bbe1bef..0e007b516ea5e 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -210,7 +210,7 @@ def help(self): """ page = self.note.tab(self.note.select(), option='text').strip() view_text(self, title='Help for IDLE preferences', - text=help_common+help_pages.get(page, '')) + contents=help_common+help_pages.get(page, '')) def deactivate_current_config(self): """Remove current key bindings. diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 1f14ed1f26473..7c575d0e5992c 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,6 +47,17 @@ def tearDownModule(): root.destroy() root = dialog = None +class ConfigDialogTest(unittest.TestCase): + + def test_help(self): + dialog.note.select(dialog.keyspage) + saved = configdialog.view_text + view = configdialog.view_text = Func() + dialog.help() + s = view.kwds['contents'] + self.assertTrue(s.startswith('When you click')) + self.assertTrue(s.endswith('a different name.\n')) + configdialog.view_text = saved class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst new file mode 100644 index 0000000000000..e71265cdf109b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst @@ -0,0 +1 @@ +Make IDLE Settings dialog Help button work again. From webhook-mailer at python.org Wed Jan 22 23:55:12 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Thu, 23 Jan 2020 04:55:12 -0000 Subject: [Python-checkins] bpo-32989: IDLE - remove unneeded parameter (GH-18138) Message-ID: https://github.com/python/cpython/commit/f9e07e116c32b6dc4561d0bdeb452ccde13b0e7c commit: f9e07e116c32b6dc4561d0bdeb452ccde13b0e7c branch: master author: Terry Jan Reedy committer: GitHub date: 2020-01-22T23:55:07-05:00 summary: bpo-32989: IDLE - remove unneeded parameter (GH-18138) IDLE does not pass a non-default _synchre in any of its calls to pyparse.find_good_parse_start. files: M Lib/idlelib/NEWS.txt M Lib/idlelib/pyparse.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 69bf5603068d6..708292ebee9f1 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -6,7 +6,8 @@ Released on 2020-10-05? bpo-39050: Make Settings dialog Help button work again. bpo-32989: Add tests for editor newline_and_indent_event method. -Remove dead code from pyparse find_good_parse_start method. +Remove unneeded arguments and dead code from pyparse +find_good_parse_start method. bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 9fa2010896071..d34872b4396e1 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,7 +133,7 @@ def set_code(self, s): self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some From webhook-mailer at python.org Thu Jan 23 00:13:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 05:13:05 -0000 Subject: [Python-checkins] bpo-32989: IDLE - remove unneeded parameter (GH-18138) Message-ID: https://github.com/python/cpython/commit/36968c13cb9800559dbb90686933da7daf52c788 commit: 36968c13cb9800559dbb90686933da7daf52c788 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-22T21:12:58-08:00 summary: bpo-32989: IDLE - remove unneeded parameter (GH-18138) IDLE does not pass a non-default _synchre in any of its calls to pyparse.find_good_parse_start. (cherry picked from commit f9e07e116c32b6dc4561d0bdeb452ccde13b0e7c) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/NEWS.txt M Lib/idlelib/pyparse.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 379e8c102d948..f3c3cbad5a98f 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -6,7 +6,8 @@ Released on 2019-12-16? bpo-39050: Make Settings dialog Help button work again. bpo-32989: Add tests for editor newline_and_indent_event method. -Remove dead code from pyparse find_good_parse_start method. +Remove unneeded arguments and dead code from pyparse +find_good_parse_start method. bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 9fa2010896071..d34872b4396e1 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,7 +133,7 @@ def set_code(self, s): self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some From webhook-mailer at python.org Thu Jan 23 00:13:45 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 05:13:45 -0000 Subject: [Python-checkins] bpo-32989: IDLE - remove unneeded parameter (GH-18138) Message-ID: https://github.com/python/cpython/commit/545fc51d950558ecec9ff64cb2f9c11469051524 commit: 545fc51d950558ecec9ff64cb2f9c11469051524 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-22T21:13:41-08:00 summary: bpo-32989: IDLE - remove unneeded parameter (GH-18138) IDLE does not pass a non-default _synchre in any of its calls to pyparse.find_good_parse_start. (cherry picked from commit f9e07e116c32b6dc4561d0bdeb452ccde13b0e7c) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/NEWS.txt M Lib/idlelib/pyparse.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index b0bcacdf58604..729d405116a3d 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -6,7 +6,8 @@ Released on 2019-12-16? bpo-39050: Make Settings dialog Help button work again. bpo-32989: Add tests for editor newline_and_indent_event method. -Remove dead code from pyparse find_good_parse_start method. +Remove unneeded arguments and dead code from pyparse +find_good_parse_start method. bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 9fa2010896071..d34872b4396e1 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,7 +133,7 @@ def set_code(self, s): self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some From webhook-mailer at python.org Thu Jan 23 04:25:22 2020 From: webhook-mailer at python.org (Mark Shannon) Date: Thu, 23 Jan 2020 09:25:22 -0000 Subject: [Python-checkins] bpo-39320: Handle unpacking of *values in compiler (GH-17984) Message-ID: https://github.com/python/cpython/commit/13bc13960cc83dbd1cb5701d9a59ac9b9144b205 commit: 13bc13960cc83dbd1cb5701d9a59ac9b9144b205 branch: master author: Mark Shannon committer: GitHub date: 2020-01-23T09:25:17Z summary: bpo-39320: Handle unpacking of *values in compiler (GH-17984) * Add three new bytecodes: LIST_TO_TUPLE, LIST_EXTEND, SET_UPDATE. Use them to implement star unpacking expressions. * Remove four bytecodes BUILD_LIST_UNPACK, BUILD_TUPLE_UNPACK, BUILD_SET_UNPACK and BUILD_TUPLE_UNPACK_WITH_CALL opcodes as they are now unused. * Update magic number and dis.rst for new bytecodes. files: A Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst M Doc/library/dis.rst M Include/opcode.h M Lib/importlib/_bootstrap_external.py M Lib/opcode.py M Lib/test/test_extcall.py M Python/ceval.c M Python/compile.c M Python/importlib_external.h M Python/opcode_targets.h diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index aef5c7e8bf261..d5d30a03aeadd 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -859,40 +859,25 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 -.. opcode:: BUILD_TUPLE_UNPACK (count) +.. opcode:: LIST_TO_TUPLE - Pops *count* iterables from the stack, joins them in a single tuple, - and pushes the result. Implements iterable unpacking in tuple - displays ``(*x, *y, *z)``. + Pops a list from the stack and pushes a tuple containing the same values. - .. versionadded:: 3.5 - - -.. opcode:: BUILD_TUPLE_UNPACK_WITH_CALL (count) - - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, - but is used for ``f(*x, *y, *z)`` call syntax. The stack item at position - ``count + 1`` should be the corresponding callable ``f``. - - .. versionadded:: 3.6 + .. versionadded:: 3.9 -.. opcode:: BUILD_LIST_UNPACK (count) +.. opcode:: LIST_EXTEND (i) - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list - instead of tuple. Implements iterable unpacking in list - displays ``[*x, *y, *z]``. + Calls ``list.extend(TOS1[-i], TOS)``. Used to build lists. - .. versionadded:: 3.5 + .. versionadded:: 3.9 -.. opcode:: BUILD_SET_UNPACK (count) +.. opcode:: SET_UPDATE - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a set - instead of tuple. Implements iterable unpacking in set - displays ``{*x, *y, *z}``. + Calls ``set.update(TOS1[-i], TOS)``. Used to build sets. - .. versionadded:: 3.5 + .. versionadded:: 3.9 .. opcode:: BUILD_MAP_UNPACK (count) @@ -1124,10 +1109,6 @@ All of the following opcodes use their arguments. Calls a callable object with variable set of positional and keyword arguments. If the lowest bit of *flags* is set, the top of the stack contains a mapping object containing additional keyword arguments. - Below that is an iterable object containing positional arguments and - a callable object to call. :opcode:`BUILD_MAP_UNPACK_WITH_CALL` and - :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` can be used for merging multiple - mapping objects and iterables containing arguments. Before the callable is called, the mapping object and iterable object are each "unpacked" and their contents passed in as keyword and positional arguments respectively. diff --git a/Include/opcode.h b/Include/opcode.h index 05354847958f7..1c5cd335f3622 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -60,6 +60,7 @@ extern "C" { #define INPLACE_AND 77 #define INPLACE_XOR 78 #define INPLACE_OR 79 +#define LIST_TO_TUPLE 82 #define RETURN_VALUE 83 #define IMPORT_STAR 84 #define SETUP_ANNOTATIONS 85 @@ -116,18 +117,16 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 -#define BUILD_LIST_UNPACK 149 #define BUILD_MAP_UNPACK 150 #define BUILD_MAP_UNPACK_WITH_CALL 151 -#define BUILD_TUPLE_UNPACK 152 -#define BUILD_SET_UNPACK 153 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 #define BUILD_STRING 157 -#define BUILD_TUPLE_UNPACK_WITH_CALL 158 #define LOAD_METHOD 160 #define CALL_METHOD 161 +#define LIST_EXTEND 162 +#define SET_UPDATE 163 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index b86612beac841..6c703fa3f75fa 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -275,6 +275,8 @@ def _write_atomic(path, data, mode=0o666): # Python 3.9a0 3421 (simplified bytecode for with blocks #32949) # Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) # Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) +# Python 3.9a2 3424 (simplify bytecodes for *value unpacking) + # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -283,7 +285,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3423).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3424).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/opcode.py b/Lib/opcode.py index e31563bfbcb43..5bc2ddc357163 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -117,6 +117,7 @@ def jabs_op(name, op): def_op('INPLACE_XOR', 78) def_op('INPLACE_OR', 79) +def_op('LIST_TO_TUPLE', 82) def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) def_op('SETUP_ANNOTATIONS', 85) @@ -199,20 +200,19 @@ def jabs_op(name, op): def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 -def_op('BUILD_LIST_UNPACK', 149) def_op('BUILD_MAP_UNPACK', 150) def_op('BUILD_MAP_UNPACK_WITH_CALL', 151) -def_op('BUILD_TUPLE_UNPACK', 152) -def_op('BUILD_SET_UNPACK', 153) jrel_op('SETUP_ASYNC_WITH', 154) def_op('FORMAT_VALUE', 155) def_op('BUILD_CONST_KEY_MAP', 156) def_op('BUILD_STRING', 157) -def_op('BUILD_TUPLE_UNPACK_WITH_CALL', 158) name_op('LOAD_METHOD', 160) def_op('CALL_METHOD', 161) +def_op('LIST_EXTEND', 162) +def_op('SET_UPDATE', 163) + del def_op, name_op, jrel_op, jabs_op diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index 4edb6680e0f98..1faf29e01d3ca 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -252,12 +252,12 @@ >>> h(1, *h) Traceback (most recent call last): ... - TypeError: test.test_extcall.h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> h(*[1], *h) Traceback (most recent call last): ... - TypeError: test.test_extcall.h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> dir(*h) Traceback (most recent call last): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst new file mode 100644 index 0000000000000..1e7235b7e6f7f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst @@ -0,0 +1,15 @@ +Replace four complex bytecodes for building sequences with three simpler ones. + + +The following four bytecodes have been removed: + +* BUILD_LIST_UNPACK +* BUILD_TUPLE_UNPACK +* BUILD_SET_UNPACK +* BUILD_TUPLE_UNPACK_WITH_CALL + +The following three bytecodes have been added: + +* LIST_TO_TUPLE +* LIST_EXTEND +* SET_UPDATE diff --git a/Python/ceval.c b/Python/ceval.c index 5e586589e9618..528ad7fdd1e20 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2621,46 +2621,46 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL): - case TARGET(BUILD_TUPLE_UNPACK): - case TARGET(BUILD_LIST_UNPACK): { - int convert_to_tuple = opcode != BUILD_LIST_UNPACK; - Py_ssize_t i; - PyObject *sum = PyList_New(0); - PyObject *return_value; - - if (sum == NULL) + case TARGET(LIST_TO_TUPLE): { + PyObject *list = POP(); + PyObject *tuple = PyList_AsTuple(list); + Py_DECREF(list); + if (tuple == NULL) { goto error; + } + PUSH(tuple); + DISPATCH(); + } - for (i = oparg; i > 0; i--) { - PyObject *none_val; - - none_val = _PyList_Extend((PyListObject *)sum, PEEK(i)); - if (none_val == NULL) { - if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL && - _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) - { - check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i)); - } - Py_DECREF(sum); - goto error; + case TARGET(LIST_EXTEND): { + PyObject *iterable = POP(); + PyObject *list = PEEK(oparg); + PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); + if (none_val == NULL) { + if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && + (iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable))) + { + PyErr_Clear(); + _PyErr_Format(tstate, PyExc_TypeError, + "Value after * must be an iterable, not %.200s", + Py_TYPE(iterable)->tp_name); } - Py_DECREF(none_val); + Py_DECREF(iterable); + goto error; } + Py_DECREF(none_val); + Py_DECREF(iterable); + DISPATCH(); + } - if (convert_to_tuple) { - return_value = PyList_AsTuple(sum); - Py_DECREF(sum); - if (return_value == NULL) - goto error; - } - else { - return_value = sum; + case TARGET(SET_UPDATE): { + PyObject *iterable = POP(); + PyObject *set = PEEK(oparg); + int err = _PySet_Update(set, iterable); + Py_DECREF(iterable); + if (err < 0) { + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(return_value); DISPATCH(); } @@ -2685,25 +2685,6 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(BUILD_SET_UNPACK): { - Py_ssize_t i; - PyObject *sum = PySet_New(NULL); - if (sum == NULL) - goto error; - - for (i = oparg; i > 0; i--) { - if (_PySet_Update(sum, PEEK(i)) < 0) { - Py_DECREF(sum); - goto error; - } - } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); - DISPATCH(); - } - case TARGET(BUILD_MAP): { Py_ssize_t i; PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); diff --git a/Python/compile.c b/Python/compile.c index 1d16e69a08556..9ed29f4a1f9e5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1007,10 +1007,6 @@ stack_effect(int opcode, int oparg, int jump) case BUILD_SET: case BUILD_STRING: return 1-oparg; - case BUILD_LIST_UNPACK: - case BUILD_TUPLE_UNPACK: - case BUILD_TUPLE_UNPACK_WITH_CALL: - case BUILD_SET_UNPACK: case BUILD_MAP_UNPACK: case BUILD_MAP_UNPACK_WITH_CALL: return 1 - oparg; @@ -1125,6 +1121,11 @@ stack_effect(int opcode, int oparg, int jump) return 1; case LOAD_ASSERTION_ERROR: return 1; + case LIST_TO_TUPLE: + return 0; + case LIST_EXTEND: + case SET_UPDATE: + return -1; default: return PY_INVALID_STACK_EFFECT; } @@ -1705,7 +1706,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, compiler_pop_fblock(c, POP_VALUE, NULL); } return 1; - + case FINALLY_END: if (preserve_tos) { ADDOP(c, ROT_FOUR); @@ -3675,11 +3676,11 @@ compiler_boolop(struct compiler *c, expr_ty e) } static int -starunpack_helper(struct compiler *c, asdl_seq *elts, - int single_op, int inner_op, int outer_op) +starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed, + int build, int add, int extend, int tuple) { Py_ssize_t n = asdl_seq_LEN(elts); - Py_ssize_t i, nsubitems = 0, nseen = 0; + Py_ssize_t i, seen_star = 0; if (n > 2 && are_all_items_const(elts, 0, n)) { PyObject *folded = PyTuple_New(n); if (folded == NULL) { @@ -3691,41 +3692,63 @@ starunpack_helper(struct compiler *c, asdl_seq *elts, Py_INCREF(val); PyTuple_SET_ITEM(folded, i, val); } - if (outer_op == BUILD_SET_UNPACK) { - Py_SETREF(folded, PyFrozenSet_New(folded)); - if (folded == NULL) { - return 0; + if (tuple) { + ADDOP_LOAD_CONST_NEW(c, folded); + } else { + if (add == SET_ADD) { + Py_SETREF(folded, PyFrozenSet_New(folded)); + if (folded == NULL) { + return 0; + } } + ADDOP_I(c, build, pushed); + ADDOP_LOAD_CONST_NEW(c, folded); + ADDOP_I(c, extend, 1); } - ADDOP_LOAD_CONST_NEW(c, folded); - ADDOP_I(c, outer_op, 1); return 1; } + for (i = 0; i < n; i++) { expr_ty elt = asdl_seq_GET(elts, i); if (elt->kind == Starred_kind) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nseen = 0; - nsubitems++; + seen_star = 1; + } + } + if (seen_star) { + seen_star = 0; + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + if (elt->kind == Starred_kind) { + if (seen_star == 0) { + ADDOP_I(c, build, i+pushed); + seen_star = 1; + } + VISIT(c, expr, elt->v.Starred.value); + ADDOP_I(c, extend, 1); + } + else { + VISIT(c, expr, elt); + if (seen_star) { + ADDOP_I(c, add, 1); + } } - VISIT(c, expr, elt->v.Starred.value); - nsubitems++; } - else { - VISIT(c, expr, elt); - nseen++; + assert(seen_star); + if (tuple) { + ADDOP(c, LIST_TO_TUPLE); } } - if (nsubitems) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nsubitems++; + else { + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + VISIT(c, expr, elt); + } + if (tuple) { + ADDOP_I(c, BUILD_TUPLE, n+pushed); + } else { + ADDOP_I(c, build, n+pushed); } - ADDOP_I(c, outer_op, nsubitems); } - else - ADDOP_I(c, single_op, nseen); return 1; } @@ -3767,8 +3790,8 @@ compiler_list(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.List.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 0); } else VISIT_SEQ(c, expr, elts); @@ -3783,8 +3806,8 @@ compiler_tuple(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.Tuple.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1); } else VISIT_SEQ(c, expr, elts); @@ -3794,8 +3817,8 @@ compiler_tuple(struct compiler *c, expr_ty e) static int compiler_set(struct compiler *c, expr_ty e) { - return starunpack_helper(c, e->v.Set.elts, BUILD_SET, - BUILD_SET, BUILD_SET_UNPACK); + return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET, + SET_ADD, SET_UPDATE, 0); } static int @@ -4184,57 +4207,65 @@ compiler_call_helper(struct compiler *c, asdl_seq *keywords) { Py_ssize_t i, nseen, nelts, nkwelts; - int mustdictunpack = 0; - - /* the number of tuples and dictionaries on the stack */ - Py_ssize_t nsubargs = 0, nsubkwargs = 0; nelts = asdl_seq_LEN(args); nkwelts = asdl_seq_LEN(keywords); + for (i = 0; i < nelts; i++) { + expr_ty elt = asdl_seq_GET(args, i); + if (elt->kind == Starred_kind) { + goto ex_call; + } + } for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); if (kw->arg == NULL) { - mustdictunpack = 1; - break; + goto ex_call; } } - nseen = n; /* the number of positional arguments on the stack */ + /* No * or ** args, so can use faster calling sequence */ for (i = 0; i < nelts; i++) { expr_ty elt = asdl_seq_GET(args, i); - if (elt->kind == Starred_kind) { - /* A star-arg. If we've seen positional arguments, - pack the positional arguments into a tuple. */ - if (nseen) { - ADDOP_I(c, BUILD_TUPLE, nseen); - nseen = 0; - nsubargs++; - } - VISIT(c, expr, elt->v.Starred.value); - nsubargs++; + assert(elt->kind != Starred_kind); + VISIT(c, expr, elt); + } + if (nkwelts) { + PyObject *names; + VISIT_SEQ(c, keyword, keywords); + names = PyTuple_New(nkwelts); + if (names == NULL) { + return 0; } - else { - VISIT(c, expr, elt); - nseen++; + for (i = 0; i < nkwelts; i++) { + keyword_ty kw = asdl_seq_GET(keywords, i); + Py_INCREF(kw->arg); + PyTuple_SET_ITEM(names, i, kw->arg); } + ADDOP_LOAD_CONST_NEW(c, names); + ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); + return 1; + } + else { + ADDOP_I(c, CALL_FUNCTION, n + nelts); + return 1; } - /* Same dance again for keyword arguments */ - if (nsubargs || mustdictunpack) { - if (nseen) { - /* Pack up any trailing positional arguments. */ - ADDOP_I(c, BUILD_TUPLE, nseen); - nsubargs++; - } - if (nsubargs > 1) { - /* If we ended up with more than one stararg, we need - to concatenate them into a single sequence. */ - ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs); - } - else if (nsubargs == 0) { - ADDOP_I(c, BUILD_TUPLE, 0); - } +ex_call: + + /* Do positional arguments. */ + if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) { + VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value); + } + else if (starunpack_helper(c, args, n, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1) == 0) { + return 0; + } + /* Then keyword arguments */ + if (nkwelts) { + /* the number of dictionaries on the stack */ + Py_ssize_t nsubkwargs = 0; + nseen = 0; /* the number of keyword arguments on the stack following */ for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); @@ -4263,29 +4294,9 @@ compiler_call_helper(struct compiler *c, /* Pack it all up */ ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs); } - ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0); - return 1; - } - else if (nkwelts) { - PyObject *names; - VISIT_SEQ(c, keyword, keywords); - names = PyTuple_New(nkwelts); - if (names == NULL) { - return 0; - } - for (i = 0; i < nkwelts; i++) { - keyword_ty kw = asdl_seq_GET(keywords, i); - Py_INCREF(kw->arg); - PyTuple_SET_ITEM(names, i, kw->arg); - } - ADDOP_LOAD_CONST_NEW(c, names); - ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); - return 1; - } - else { - ADDOP_I(c, CALL_FUNCTION, n + nelts); - return 1; } + ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0); + return 1; } @@ -4860,9 +4871,9 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) ADDOP(c, POP_BLOCK); compiler_pop_fblock(c, WITH, block); - + /* End of body; start the cleanup. */ - + /* For successful outcome: * call __exit__(None, None, None) */ @@ -5984,7 +5995,7 @@ makecode(struct compiler *c, struct assembler *a) goto error; } co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount, - posonlyargcount, kwonlyargcount, nlocals_int, + posonlyargcount, kwonlyargcount, nlocals_int, maxdepth, flags, bytecode, consts, names, varnames, freevars, cellvars, c->c_filename, c->u->u_name, c->u->u_firstlineno, a->a_lnotab); diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 52783fc62138d..e8e99da093d13 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -278,7 +278,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,111,109,105,99,120,0,0,0,115,30,0,0,0,0,5, 16,1,6,1,16,0,6,255,4,2,2,3,14,1,40,1, 16,1,12,1,2,1,14,1,12,1,6,1,114,68,0,0, - 0,105,95,13,0,0,114,27,0,0,0,114,16,0,0,0, + 0,105,96,13,0,0,114,27,0,0,0,114,16,0,0,0, 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, 4,46,112,121,99,78,41,1,218,12,111,112,116,105,109,105, @@ -392,7 +392,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,102,105,108,101,110,97,109,101,218,8,102,105,108,101, 110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6, 0,0,0,218,17,99,97,99,104,101,95,102,114,111,109,95, - 115,111,117,114,99,101,42,1,0,0,115,72,0,0,0,0, + 115,111,117,114,99,101,44,1,0,0,115,72,0,0,0,0, 18,8,1,6,1,2,255,4,2,8,1,4,1,8,1,12, 1,10,1,12,1,16,1,8,1,8,1,8,1,24,1,8, 1,12,1,6,2,8,1,8,1,8,1,8,1,14,1,14, @@ -473,7 +473,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,108,101,118,101,108,90,13,98,97,115,101,95,102,105,108, 101,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, 6,0,0,0,218,17,115,111,117,114,99,101,95,102,114,111, - 109,95,99,97,99,104,101,113,1,0,0,115,52,0,0,0, + 109,95,99,97,99,104,101,115,1,0,0,115,52,0,0,0, 0,9,12,1,8,1,10,1,12,1,4,1,10,1,12,1, 14,1,16,1,4,1,4,1,12,1,8,1,18,2,10,1, 8,1,16,1,10,1,16,1,10,1,14,2,16,1,10,1, @@ -508,7 +508,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,120,116,101,110,115,105,111,110,218,11,115,111,117,114,99, 101,95,112,97,116,104,114,3,0,0,0,114,3,0,0,0, 114,6,0,0,0,218,15,95,103,101,116,95,115,111,117,114, - 99,101,102,105,108,101,153,1,0,0,115,20,0,0,0,0, + 99,101,102,105,108,101,155,1,0,0,115,20,0,0,0,0, 7,12,1,4,1,16,1,24,1,4,1,2,1,12,1,16, 1,18,1,114,108,0,0,0,99,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, @@ -521,7 +521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,112,108,101,114,101,0,0,0,114,97,0,0,0,114,81, 0,0,0,114,88,0,0,0,41,1,114,96,0,0,0,114, 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, - 95,103,101,116,95,99,97,99,104,101,100,172,1,0,0,115, + 95,103,101,116,95,99,97,99,104,101,100,174,1,0,0,115, 16,0,0,0,0,1,14,1,2,1,10,1,12,1,8,1, 14,1,4,2,114,112,0,0,0,99,1,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, @@ -536,7 +536,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,50,0,0,0,114,49,0,0,0,41,2,114,43,0, 0,0,114,51,0,0,0,114,3,0,0,0,114,3,0,0, 0,114,6,0,0,0,218,10,95,99,97,108,99,95,109,111, - 100,101,184,1,0,0,115,12,0,0,0,0,2,2,1,14, + 100,101,186,1,0,0,115,12,0,0,0,0,2,2,1,14, 1,12,1,10,3,8,1,114,114,0,0,0,99,1,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, 0,3,0,0,0,115,66,0,0,0,100,6,135,0,102,1, @@ -561,2173 +561,2173 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, 97,105,115,101,100,46,10,10,32,32,32,32,78,99,2,0, 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,31,0,0,0,115,66,0,0,0,124,1,100,0,117, + 0,0,31,0,0,0,115,68,0,0,0,124,1,100,0,117, 0,114,16,124,0,106,0,125,1,110,32,124,0,106,0,124, 1,107,3,114,48,116,1,100,1,124,0,106,0,124,1,102, 2,22,0,124,1,100,2,141,2,130,1,136,0,124,0,124, - 1,102,2,124,2,158,2,124,3,142,1,83,0,41,3,78, - 122,30,108,111,97,100,101,114,32,102,111,114,32,37,115,32, - 99,97,110,110,111,116,32,104,97,110,100,108,101,32,37,115, - 169,1,218,4,110,97,109,101,41,2,114,116,0,0,0,218, - 11,73,109,112,111,114,116,69,114,114,111,114,41,4,218,4, - 115,101,108,102,114,116,0,0,0,218,4,97,114,103,115,218, - 6,107,119,97,114,103,115,169,1,218,6,109,101,116,104,111, - 100,114,3,0,0,0,114,6,0,0,0,218,19,95,99,104, - 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, - 204,1,0,0,115,18,0,0,0,0,1,8,1,8,1,10, - 1,4,1,8,255,2,1,2,255,6,2,122,40,95,99,104, - 101,99,107,95,110,97,109,101,46,60,108,111,99,97,108,115, - 62,46,95,99,104,101,99,107,95,110,97,109,101,95,119,114, - 97,112,112,101,114,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,7,0,0,0,83,0,0,0,115,56, - 0,0,0,100,1,68,0,93,32,125,2,116,0,124,1,124, - 2,131,2,114,4,116,1,124,0,124,2,116,2,124,1,124, - 2,131,2,131,3,1,0,113,4,124,0,106,3,160,4,124, - 1,106,3,161,1,1,0,100,0,83,0,41,2,78,41,4, - 218,10,95,95,109,111,100,117,108,101,95,95,218,8,95,95, - 110,97,109,101,95,95,218,12,95,95,113,117,97,108,110,97, - 109,101,95,95,218,7,95,95,100,111,99,95,95,41,5,218, - 7,104,97,115,97,116,116,114,218,7,115,101,116,97,116,116, - 114,218,7,103,101,116,97,116,116,114,218,8,95,95,100,105, - 99,116,95,95,218,6,117,112,100,97,116,101,41,3,90,3, - 110,101,119,90,3,111,108,100,114,66,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,5,95,119, - 114,97,112,215,1,0,0,115,8,0,0,0,0,1,8,1, - 10,1,20,1,122,26,95,99,104,101,99,107,95,110,97,109, - 101,46,60,108,111,99,97,108,115,62,46,95,119,114,97,112, - 41,1,78,41,3,218,10,95,98,111,111,116,115,116,114,97, - 112,114,133,0,0,0,218,9,78,97,109,101,69,114,114,111, - 114,41,3,114,122,0,0,0,114,123,0,0,0,114,133,0, - 0,0,114,3,0,0,0,114,121,0,0,0,114,6,0,0, - 0,218,11,95,99,104,101,99,107,95,110,97,109,101,196,1, - 0,0,115,14,0,0,0,0,8,14,7,2,1,10,1,12, - 2,14,5,10,1,114,136,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, - 0,0,0,115,60,0,0,0,124,0,160,0,124,1,161,1, - 92,2,125,2,125,3,124,2,100,1,117,0,114,56,116,1, - 124,3,131,1,114,56,100,2,125,4,116,2,160,3,124,4, - 160,4,124,3,100,3,25,0,161,1,116,5,161,2,1,0, - 124,2,83,0,41,4,122,155,84,114,121,32,116,111,32,102, - 105,110,100,32,97,32,108,111,97,100,101,114,32,102,111,114, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, - 111,100,117,108,101,32,98,121,32,100,101,108,101,103,97,116, - 105,110,103,32,116,111,10,32,32,32,32,115,101,108,102,46, - 102,105,110,100,95,108,111,97,100,101,114,40,41,46,10,10, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,32,105,110, - 32,102,97,118,111,114,32,111,102,32,102,105,110,100,101,114, - 46,102,105,110,100,95,115,112,101,99,40,41,46,10,10,32, - 32,32,32,78,122,44,78,111,116,32,105,109,112,111,114,116, - 105,110,103,32,100,105,114,101,99,116,111,114,121,32,123,125, - 58,32,109,105,115,115,105,110,103,32,95,95,105,110,105,116, - 95,95,114,72,0,0,0,41,6,218,11,102,105,110,100,95, - 108,111,97,100,101,114,114,22,0,0,0,114,74,0,0,0, - 114,75,0,0,0,114,61,0,0,0,218,13,73,109,112,111, - 114,116,87,97,114,110,105,110,103,41,5,114,118,0,0,0, - 218,8,102,117,108,108,110,97,109,101,218,6,108,111,97,100, - 101,114,218,8,112,111,114,116,105,111,110,115,218,3,109,115, - 103,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,17,95,102,105,110,100,95,109,111,100,117,108,101,95,115, - 104,105,109,224,1,0,0,115,10,0,0,0,0,10,14,1, - 16,1,4,1,22,1,114,143,0,0,0,99,3,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, - 67,0,0,0,115,158,0,0,0,124,0,100,1,100,2,133, - 2,25,0,125,3,124,3,116,0,107,3,114,60,100,3,124, - 1,155,2,100,4,124,3,155,2,157,4,125,4,116,1,160, - 2,100,5,124,4,161,2,1,0,116,3,124,4,102,1,124, - 2,142,1,130,1,116,4,124,0,131,1,100,6,107,0,114, - 102,100,7,124,1,155,2,157,2,125,4,116,1,160,2,100, - 5,124,4,161,2,1,0,116,5,124,4,131,1,130,1,116, - 6,124,0,100,2,100,8,133,2,25,0,131,1,125,5,124, - 5,100,9,64,0,114,154,100,10,124,5,155,2,100,11,124, - 1,155,2,157,4,125,4,116,3,124,4,102,1,124,2,142, - 1,130,1,124,5,83,0,41,12,97,84,2,0,0,80,101, - 114,102,111,114,109,32,98,97,115,105,99,32,118,97,108,105, - 100,105,116,121,32,99,104,101,99,107,105,110,103,32,111,102, - 32,97,32,112,121,99,32,104,101,97,100,101,114,32,97,110, - 100,32,114,101,116,117,114,110,32,116,104,101,32,102,108,97, - 103,115,32,102,105,101,108,100,44,10,32,32,32,32,119,104, - 105,99,104,32,100,101,116,101,114,109,105,110,101,115,32,104, - 111,119,32,116,104,101,32,112,121,99,32,115,104,111,117,108, - 100,32,98,101,32,102,117,114,116,104,101,114,32,118,97,108, - 105,100,97,116,101,100,32,97,103,97,105,110,115,116,32,116, - 104,101,32,115,111,117,114,99,101,46,10,10,32,32,32,32, - 42,100,97,116,97,42,32,105,115,32,116,104,101,32,99,111, - 110,116,101,110,116,115,32,111,102,32,116,104,101,32,112,121, - 99,32,102,105,108,101,46,32,40,79,110,108,121,32,116,104, - 101,32,102,105,114,115,116,32,49,54,32,98,121,116,101,115, - 32,97,114,101,10,32,32,32,32,114,101,113,117,105,114,101, - 100,44,32,116,104,111,117,103,104,46,41,10,10,32,32,32, - 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110, - 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, - 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100, - 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114, - 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42, - 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32, - 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115, - 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114, - 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32, - 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100, - 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32, + 1,103,2,124,2,162,1,82,0,124,3,142,1,83,0,41, + 3,78,122,30,108,111,97,100,101,114,32,102,111,114,32,37, + 115,32,99,97,110,110,111,116,32,104,97,110,100,108,101,32, + 37,115,169,1,218,4,110,97,109,101,41,2,114,116,0,0, + 0,218,11,73,109,112,111,114,116,69,114,114,111,114,41,4, + 218,4,115,101,108,102,114,116,0,0,0,218,4,97,114,103, + 115,218,6,107,119,97,114,103,115,169,1,218,6,109,101,116, + 104,111,100,114,3,0,0,0,114,6,0,0,0,218,19,95, + 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, + 101,114,206,1,0,0,115,18,0,0,0,0,1,8,1,8, + 1,10,1,4,1,8,255,2,1,2,255,6,2,122,40,95, + 99,104,101,99,107,95,110,97,109,101,46,60,108,111,99,97, + 108,115,62,46,95,99,104,101,99,107,95,110,97,109,101,95, + 119,114,97,112,112,101,114,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,7,0,0,0,83,0,0,0, + 115,56,0,0,0,100,1,68,0,93,32,125,2,116,0,124, + 1,124,2,131,2,114,4,116,1,124,0,124,2,116,2,124, + 1,124,2,131,2,131,3,1,0,113,4,124,0,106,3,160, + 4,124,1,106,3,161,1,1,0,100,0,83,0,41,2,78, + 41,4,218,10,95,95,109,111,100,117,108,101,95,95,218,8, + 95,95,110,97,109,101,95,95,218,12,95,95,113,117,97,108, + 110,97,109,101,95,95,218,7,95,95,100,111,99,95,95,41, + 5,218,7,104,97,115,97,116,116,114,218,7,115,101,116,97, + 116,116,114,218,7,103,101,116,97,116,116,114,218,8,95,95, + 100,105,99,116,95,95,218,6,117,112,100,97,116,101,41,3, + 90,3,110,101,119,90,3,111,108,100,114,66,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,5, + 95,119,114,97,112,217,1,0,0,115,8,0,0,0,0,1, + 8,1,10,1,20,1,122,26,95,99,104,101,99,107,95,110, + 97,109,101,46,60,108,111,99,97,108,115,62,46,95,119,114, + 97,112,41,1,78,41,3,218,10,95,98,111,111,116,115,116, + 114,97,112,114,133,0,0,0,218,9,78,97,109,101,69,114, + 114,111,114,41,3,114,122,0,0,0,114,123,0,0,0,114, + 133,0,0,0,114,3,0,0,0,114,121,0,0,0,114,6, + 0,0,0,218,11,95,99,104,101,99,107,95,110,97,109,101, + 198,1,0,0,115,14,0,0,0,0,8,14,7,2,1,10, + 1,12,2,14,5,10,1,114,136,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0, + 0,67,0,0,0,115,60,0,0,0,124,0,160,0,124,1, + 161,1,92,2,125,2,125,3,124,2,100,1,117,0,114,56, + 116,1,124,3,131,1,114,56,100,2,125,4,116,2,160,3, + 124,4,160,4,124,3,100,3,25,0,161,1,116,5,161,2, + 1,0,124,2,83,0,41,4,122,155,84,114,121,32,116,111, + 32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102, + 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 32,109,111,100,117,108,101,32,98,121,32,100,101,108,101,103, + 97,116,105,110,103,32,116,111,10,32,32,32,32,115,101,108, + 102,46,102,105,110,100,95,108,111,97,100,101,114,40,41,46, + 10,10,32,32,32,32,84,104,105,115,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32, + 105,110,32,102,97,118,111,114,32,111,102,32,102,105,110,100, + 101,114,46,102,105,110,100,95,115,112,101,99,40,41,46,10, + 10,32,32,32,32,78,122,44,78,111,116,32,105,109,112,111, + 114,116,105,110,103,32,100,105,114,101,99,116,111,114,121,32, + 123,125,58,32,109,105,115,115,105,110,103,32,95,95,105,110, + 105,116,95,95,114,72,0,0,0,41,6,218,11,102,105,110, + 100,95,108,111,97,100,101,114,114,22,0,0,0,114,74,0, + 0,0,114,75,0,0,0,114,61,0,0,0,218,13,73,109, + 112,111,114,116,87,97,114,110,105,110,103,41,5,114,118,0, + 0,0,218,8,102,117,108,108,110,97,109,101,218,6,108,111, + 97,100,101,114,218,8,112,111,114,116,105,111,110,115,218,3, + 109,115,103,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,17,95,102,105,110,100,95,109,111,100,117,108,101, + 95,115,104,105,109,226,1,0,0,115,10,0,0,0,0,10, + 14,1,16,1,4,1,22,1,114,143,0,0,0,99,3,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0, + 0,0,67,0,0,0,115,158,0,0,0,124,0,100,1,100, + 2,133,2,25,0,125,3,124,3,116,0,107,3,114,60,100, + 3,124,1,155,2,100,4,124,3,155,2,157,4,125,4,116, + 1,160,2,100,5,124,4,161,2,1,0,116,3,124,4,102, + 1,124,2,142,1,130,1,116,4,124,0,131,1,100,6,107, + 0,114,102,100,7,124,1,155,2,157,2,125,4,116,1,160, + 2,100,5,124,4,161,2,1,0,116,5,124,4,131,1,130, + 1,116,6,124,0,100,2,100,8,133,2,25,0,131,1,125, + 5,124,5,100,9,64,0,114,154,100,10,124,5,155,2,100, + 11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,124, + 2,142,1,130,1,124,5,83,0,41,12,97,84,2,0,0, + 80,101,114,102,111,114,109,32,98,97,115,105,99,32,118,97, + 108,105,100,105,116,121,32,99,104,101,99,107,105,110,103,32, + 111,102,32,97,32,112,121,99,32,104,101,97,100,101,114,32, + 97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,102, + 108,97,103,115,32,102,105,101,108,100,44,10,32,32,32,32, + 119,104,105,99,104,32,100,101,116,101,114,109,105,110,101,115, + 32,104,111,119,32,116,104,101,32,112,121,99,32,115,104,111, + 117,108,100,32,98,101,32,102,117,114,116,104,101,114,32,118, + 97,108,105,100,97,116,101,100,32,97,103,97,105,110,115,116, + 32,116,104,101,32,115,111,117,114,99,101,46,10,10,32,32, + 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, + 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, + 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, + 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, + 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, + 114,101,100,44,32,116,104,111,117,103,104,46,41,10,10,32, + 32,32,32,42,110,97,109,101,42,32,105,115,32,116,104,101, + 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, + 117,108,101,32,98,101,105,110,103,32,105,109,112,111,114,116, + 101,100,46,32,73,116,32,105,115,32,117,115,101,100,32,102, + 111,114,32,108,111,103,103,105,110,103,46,10,10,32,32,32, + 32,42,101,120,99,95,100,101,116,97,105,108,115,42,32,105, + 115,32,97,32,100,105,99,116,105,111,110,97,114,121,32,112, + 97,115,115,101,100,32,116,111,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,102,32,105,116,32,114,97,105,115,101, + 100,32,102,111,114,10,32,32,32,32,105,109,112,114,111,118, + 101,100,32,100,101,98,117,103,103,105,110,103,46,10,10,32, + 32,32,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,104, + 101,32,109,97,103,105,99,32,110,117,109,98,101,114,32,105, + 115,32,105,110,99,111,114,114,101,99,116,32,111,114,32,119, + 104,101,110,32,116,104,101,32,102,108,97,103,115,10,32,32, + 32,32,102,105,101,108,100,32,105,115,32,105,110,118,97,108, + 105,100,46,32,69,79,70,69,114,114,111,114,32,105,115,32, 114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32, - 109,97,103,105,99,32,110,117,109,98,101,114,32,105,115,32, - 105,110,99,111,114,114,101,99,116,32,111,114,32,119,104,101, - 110,32,116,104,101,32,102,108,97,103,115,10,32,32,32,32, - 102,105,101,108,100,32,105,115,32,105,110,118,97,108,105,100, - 46,32,69,79,70,69,114,114,111,114,32,105,115,32,114,97, - 105,115,101,100,32,119,104,101,110,32,116,104,101,32,100,97, - 116,97,32,105,115,32,102,111,117,110,100,32,116,111,32,98, - 101,32,116,114,117,110,99,97,116,101,100,46,10,10,32,32, - 32,32,78,114,15,0,0,0,122,20,98,97,100,32,109,97, - 103,105,99,32,110,117,109,98,101,114,32,105,110,32,122,2, - 58,32,250,2,123,125,233,16,0,0,0,122,40,114,101,97, - 99,104,101,100,32,69,79,70,32,119,104,105,108,101,32,114, - 101,97,100,105,110,103,32,112,121,99,32,104,101,97,100,101, - 114,32,111,102,32,233,8,0,0,0,233,252,255,255,255,122, - 14,105,110,118,97,108,105,100,32,102,108,97,103,115,32,122, - 4,32,105,110,32,41,7,218,12,77,65,71,73,67,95,78, - 85,77,66,69,82,114,134,0,0,0,218,16,95,118,101,114, - 98,111,115,101,95,109,101,115,115,97,103,101,114,117,0,0, - 0,114,22,0,0,0,218,8,69,79,70,69,114,114,111,114, - 114,26,0,0,0,41,6,114,25,0,0,0,114,116,0,0, - 0,218,11,101,120,99,95,100,101,116,97,105,108,115,90,5, - 109,97,103,105,99,114,92,0,0,0,114,82,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, - 95,99,108,97,115,115,105,102,121,95,112,121,99,241,1,0, - 0,115,28,0,0,0,0,16,12,1,8,1,16,1,12,1, - 12,1,12,1,10,1,12,1,8,1,16,2,8,1,16,1, - 12,1,114,152,0,0,0,99,5,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,4,0,0,0,67,0,0,0, - 115,112,0,0,0,116,0,124,0,100,1,100,2,133,2,25, - 0,131,1,124,1,100,3,64,0,107,3,114,58,100,4,124, - 3,155,2,157,2,125,5,116,1,160,2,100,5,124,5,161, - 2,1,0,116,3,124,5,102,1,124,4,142,1,130,1,124, - 2,100,6,117,1,114,108,116,0,124,0,100,2,100,7,133, - 2,25,0,131,1,124,2,100,3,64,0,107,3,114,108,116, - 3,100,4,124,3,155,2,157,2,102,1,124,4,142,1,130, - 1,100,6,83,0,41,8,97,7,2,0,0,86,97,108,105, - 100,97,116,101,32,97,32,112,121,99,32,97,103,97,105,110, - 115,116,32,116,104,101,32,115,111,117,114,99,101,32,108,97, - 115,116,45,109,111,100,105,102,105,101,100,32,116,105,109,101, - 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115, - 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102, - 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40, - 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49, - 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32, - 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32, - 42,115,111,117,114,99,101,95,109,116,105,109,101,42,32,105, - 115,32,116,104,101,32,108,97,115,116,32,109,111,100,105,102, - 105,101,100,32,116,105,109,101,115,116,97,109,112,32,111,102, - 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, - 46,10,10,32,32,32,32,42,115,111,117,114,99,101,95,115, - 105,122,101,42,32,105,115,32,78,111,110,101,32,111,114,32, - 116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,32,105,110,32,98, - 121,116,101,115,46,10,10,32,32,32,32,42,110,97,109,101, - 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, - 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, - 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, - 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, - 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, - 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, - 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, - 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, - 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99, - 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32, - 32,32,32,114,146,0,0,0,233,12,0,0,0,114,14,0, - 0,0,122,22,98,121,116,101,99,111,100,101,32,105,115,32, - 115,116,97,108,101,32,102,111,114,32,114,144,0,0,0,78, - 114,145,0,0,0,41,4,114,26,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,117,0,0,0,41,6,114,25,0, - 0,0,218,12,115,111,117,114,99,101,95,109,116,105,109,101, - 218,11,115,111,117,114,99,101,95,115,105,122,101,114,116,0, - 0,0,114,151,0,0,0,114,92,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,23,95,118,97, - 108,105,100,97,116,101,95,116,105,109,101,115,116,97,109,112, - 95,112,121,99,18,2,0,0,115,16,0,0,0,0,19,24, - 1,10,1,12,1,12,1,8,1,22,255,2,2,114,156,0, - 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,100,1,100,2,133,2,25,0,124,1,107,3,114,34, - 116,0,100,3,124,2,155,2,157,2,102,1,124,3,142,1, - 130,1,100,4,83,0,41,5,97,243,1,0,0,86,97,108, - 105,100,97,116,101,32,97,32,104,97,115,104,45,98,97,115, - 101,100,32,112,121,99,32,98,121,32,99,104,101,99,107,105, - 110,103,32,116,104,101,32,114,101,97,108,32,115,111,117,114, - 99,101,32,104,97,115,104,32,97,103,97,105,110,115,116,32, - 116,104,101,32,111,110,101,32,105,110,10,32,32,32,32,116, - 104,101,32,112,121,99,32,104,101,97,100,101,114,46,10,10, - 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, - 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, - 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, - 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, - 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, - 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, - 117,114,99,101,95,104,97,115,104,42,32,105,115,32,116,104, - 101,32,105,109,112,111,114,116,108,105,98,46,117,116,105,108, - 46,115,111,117,114,99,101,95,104,97,115,104,40,41,32,111, - 102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, - 101,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, - 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, - 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, - 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, - 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, - 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, - 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, - 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, - 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, - 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, - 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, - 114,146,0,0,0,114,145,0,0,0,122,46,104,97,115,104, - 32,105,110,32,98,121,116,101,99,111,100,101,32,100,111,101, - 115,110,39,116,32,109,97,116,99,104,32,104,97,115,104,32, - 111,102,32,115,111,117,114,99,101,32,78,41,1,114,117,0, - 0,0,41,4,114,25,0,0,0,218,11,115,111,117,114,99, - 101,95,104,97,115,104,114,116,0,0,0,114,151,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 18,95,118,97,108,105,100,97,116,101,95,104,97,115,104,95, - 112,121,99,46,2,0,0,115,12,0,0,0,0,17,16,1, - 2,1,8,255,2,2,2,254,114,158,0,0,0,99,4,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,80,0,0,0,116,0,160,1,124, - 0,161,1,125,4,116,2,124,4,116,3,131,2,114,56,116, - 4,160,5,100,1,124,2,161,2,1,0,124,3,100,2,117, - 1,114,52,116,6,160,7,124,4,124,3,161,2,1,0,124, - 4,83,0,116,8,100,3,160,9,124,2,161,1,124,1,124, - 2,100,4,141,3,130,1,100,2,83,0,41,5,122,35,67, - 111,109,112,105,108,101,32,98,121,116,101,99,111,100,101,32, - 97,115,32,102,111,117,110,100,32,105,110,32,97,32,112,121, - 99,46,122,21,99,111,100,101,32,111,98,106,101,99,116,32, - 102,114,111,109,32,123,33,114,125,78,122,23,78,111,110,45, - 99,111,100,101,32,111,98,106,101,99,116,32,105,110,32,123, - 33,114,125,169,2,114,116,0,0,0,114,43,0,0,0,41, - 10,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, - 115,218,10,105,115,105,110,115,116,97,110,99,101,218,10,95, - 99,111,100,101,95,116,121,112,101,114,134,0,0,0,114,149, - 0,0,0,218,4,95,105,109,112,90,16,95,102,105,120,95, - 99,111,95,102,105,108,101,110,97,109,101,114,117,0,0,0, - 114,61,0,0,0,41,5,114,25,0,0,0,114,116,0,0, - 0,114,106,0,0,0,114,107,0,0,0,218,4,99,111,100, - 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,99, - 111,100,101,70,2,0,0,115,20,0,0,0,0,2,10,1, - 10,1,12,1,8,1,12,1,4,2,10,1,2,0,2,255, - 114,165,0,0,0,114,72,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, - 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3, - 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3, - 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2, - 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4, - 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,2, - 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97, - 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97, - 109,112,45,98,97,115,101,100,32,112,121,99,46,114,72,0, - 0,0,41,6,218,9,98,121,116,101,97,114,114,97,121,114, - 148,0,0,0,218,6,101,120,116,101,110,100,114,20,0,0, - 0,114,160,0,0,0,218,5,100,117,109,112,115,41,4,114, - 164,0,0,0,218,5,109,116,105,109,101,114,155,0,0,0, - 114,25,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,22,95,99,111,100,101,95,116,111,95,116, - 105,109,101,115,116,97,109,112,95,112,121,99,83,2,0,0, - 115,12,0,0,0,0,2,8,1,14,1,14,1,14,1,16, - 1,114,170,0,0,0,84,99,3,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, - 115,80,0,0,0,116,0,116,1,131,1,125,3,100,1,124, - 2,100,1,62,0,66,0,125,4,124,3,160,2,116,3,124, - 4,131,1,161,1,1,0,116,4,124,1,131,1,100,2,107, - 2,115,50,74,0,130,1,124,3,160,2,124,1,161,1,1, - 0,124,3,160,2,116,5,160,6,124,0,161,1,161,1,1, - 0,124,3,83,0,41,3,122,38,80,114,111,100,117,99,101, - 32,116,104,101,32,100,97,116,97,32,102,111,114,32,97,32, - 104,97,115,104,45,98,97,115,101,100,32,112,121,99,46,114, - 38,0,0,0,114,146,0,0,0,41,7,114,166,0,0,0, - 114,148,0,0,0,114,167,0,0,0,114,20,0,0,0,114, - 22,0,0,0,114,160,0,0,0,114,168,0,0,0,41,5, - 114,164,0,0,0,114,157,0,0,0,90,7,99,104,101,99, - 107,101,100,114,25,0,0,0,114,82,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,17,95,99, - 111,100,101,95,116,111,95,104,97,115,104,95,112,121,99,93, - 2,0,0,115,14,0,0,0,0,2,8,1,12,1,14,1, - 16,1,10,1,16,1,114,171,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0, - 67,0,0,0,115,62,0,0,0,100,1,100,2,108,0,125, - 1,116,1,160,2,124,0,161,1,106,3,125,2,124,1,160, - 4,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161, - 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25, - 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100, - 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, - 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, - 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, - 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, - 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, - 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, - 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, - 32,32,32,32,114,72,0,0,0,78,84,41,7,218,8,116, - 111,107,101,110,105,122,101,114,63,0,0,0,90,7,66,121, - 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, - 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, - 90,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119, - 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99, - 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121, - 116,101,115,114,172,0,0,0,90,21,115,111,117,114,99,101, - 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218, - 8,101,110,99,111,100,105,110,103,90,15,110,101,119,108,105, - 110,101,95,100,101,99,111,100,101,114,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,13,100,101,99,111,100, - 101,95,115,111,117,114,99,101,104,2,0,0,115,10,0,0, - 0,0,5,8,1,12,1,10,1,12,1,114,176,0,0,0, - 169,2,114,140,0,0,0,218,26,115,117,98,109,111,100,117, - 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, - 111,110,115,99,2,0,0,0,0,0,0,0,2,0,0,0, - 9,0,0,0,8,0,0,0,67,0,0,0,115,12,1,0, - 0,124,1,100,1,117,0,114,58,100,2,125,1,116,0,124, - 2,100,3,131,2,114,68,122,14,124,2,160,1,124,0,161, - 1,125,1,87,0,113,68,4,0,116,2,121,54,1,0,1, - 0,1,0,89,0,113,68,48,0,110,10,116,3,160,4,124, - 1,161,1,125,1,116,5,106,6,124,0,124,2,124,1,100, - 4,141,3,125,4,100,5,124,4,95,7,124,2,100,1,117, - 0,114,152,116,8,131,0,68,0,93,42,92,2,125,5,125, - 6,124,1,160,9,116,10,124,6,131,1,161,1,114,104,124, - 5,124,0,124,1,131,2,125,2,124,2,124,4,95,11,1, - 0,113,152,113,104,100,1,83,0,124,3,116,12,117,0,114, - 216,116,0,124,2,100,6,131,2,114,222,122,14,124,2,160, - 13,124,0,161,1,125,7,87,0,110,18,4,0,116,2,121, - 202,1,0,1,0,1,0,89,0,113,222,48,0,124,7,114, - 222,103,0,124,4,95,14,110,6,124,3,124,4,95,14,124, - 4,106,14,103,0,107,2,144,1,114,8,124,1,144,1,114, - 8,116,15,124,1,131,1,100,7,25,0,125,8,124,4,106, - 14,160,16,124,8,161,1,1,0,124,4,83,0,41,8,97, - 61,1,0,0,82,101,116,117,114,110,32,97,32,109,111,100, - 117,108,101,32,115,112,101,99,32,98,97,115,101,100,32,111, - 110,32,97,32,102,105,108,101,32,108,111,99,97,116,105,111, - 110,46,10,10,32,32,32,32,84,111,32,105,110,100,105,99, - 97,116,101,32,116,104,97,116,32,116,104,101,32,109,111,100, - 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101, - 44,32,115,101,116,10,32,32,32,32,115,117,98,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,32,116,111,32,97,32,108,105,115,116,32,111, - 102,32,100,105,114,101,99,116,111,114,121,32,112,97,116,104, - 115,46,32,32,65,110,10,32,32,32,32,101,109,112,116,121, - 32,108,105,115,116,32,105,115,32,115,117,102,102,105,99,105, - 101,110,116,44,32,116,104,111,117,103,104,32,105,116,115,32, - 110,111,116,32,111,116,104,101,114,119,105,115,101,32,117,115, - 101,102,117,108,32,116,111,32,116,104,101,10,32,32,32,32, - 105,109,112,111,114,116,32,115,121,115,116,101,109,46,10,10, - 32,32,32,32,84,104,101,32,108,111,97,100,101,114,32,109, - 117,115,116,32,116,97,107,101,32,97,32,115,112,101,99,32, - 97,115,32,105,116,115,32,111,110,108,121,32,95,95,105,110, - 105,116,95,95,40,41,32,97,114,103,46,10,10,32,32,32, - 32,78,122,9,60,117,110,107,110,111,119,110,62,218,12,103, - 101,116,95,102,105,108,101,110,97,109,101,169,1,218,6,111, - 114,105,103,105,110,84,218,10,105,115,95,112,97,99,107,97, - 103,101,114,72,0,0,0,41,17,114,128,0,0,0,114,179, - 0,0,0,114,117,0,0,0,114,2,0,0,0,114,78,0, - 0,0,114,134,0,0,0,218,10,77,111,100,117,108,101,83, - 112,101,99,90,13,95,115,101,116,95,102,105,108,101,97,116, - 116,114,218,27,95,103,101,116,95,115,117,112,112,111,114,116, - 101,100,95,102,105,108,101,95,108,111,97,100,101,114,115,114, - 110,0,0,0,114,111,0,0,0,114,140,0,0,0,218,9, - 95,80,79,80,85,76,65,84,69,114,182,0,0,0,114,178, - 0,0,0,114,46,0,0,0,218,6,97,112,112,101,110,100, - 41,9,114,116,0,0,0,90,8,108,111,99,97,116,105,111, - 110,114,140,0,0,0,114,178,0,0,0,218,4,115,112,101, - 99,218,12,108,111,97,100,101,114,95,99,108,97,115,115,218, - 8,115,117,102,102,105,120,101,115,114,182,0,0,0,90,7, - 100,105,114,110,97,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,23,115,112,101,99,95,102,114,111, - 109,95,102,105,108,101,95,108,111,99,97,116,105,111,110,121, - 2,0,0,115,62,0,0,0,0,12,8,4,4,1,10,2, - 2,1,14,1,12,1,8,2,10,8,16,1,6,3,8,1, - 14,1,14,1,10,1,6,1,6,2,4,3,8,2,10,1, - 2,1,14,1,12,1,6,2,4,1,8,2,6,1,12,1, - 6,1,12,1,12,2,114,190,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 64,0,0,0,115,80,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,90,4,100,3,90,5,100,4,90, - 6,101,7,100,5,100,6,132,0,131,1,90,8,101,7,100, - 7,100,8,132,0,131,1,90,9,101,7,100,14,100,10,100, - 11,132,1,131,1,90,10,101,7,100,15,100,12,100,13,132, - 1,131,1,90,11,100,9,83,0,41,16,218,21,87,105,110, - 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, - 101,114,122,62,77,101,116,97,32,112,97,116,104,32,102,105, - 110,100,101,114,32,102,111,114,32,109,111,100,117,108,101,115, - 32,100,101,99,108,97,114,101,100,32,105,110,32,116,104,101, - 32,87,105,110,100,111,119,115,32,114,101,103,105,115,116,114, - 121,46,122,59,83,111,102,116,119,97,114,101,92,80,121,116, - 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, - 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, - 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,122, - 65,83,111,102,116,119,97,114,101,92,80,121,116,104,111,110, - 92,80,121,116,104,111,110,67,111,114,101,92,123,115,121,115, - 95,118,101,114,115,105,111,110,125,92,77,111,100,117,108,101, - 115,92,123,102,117,108,108,110,97,109,101,125,92,68,101,98, - 117,103,70,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,54,0,0, - 0,122,16,116,0,160,1,116,0,106,2,124,1,161,2,87, - 0,83,0,4,0,116,3,121,48,1,0,1,0,1,0,116, - 0,160,1,116,0,106,4,124,1,161,2,6,0,89,0,83, - 0,48,0,100,0,83,0,114,109,0,0,0,41,5,218,7, - 95,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, - 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, - 83,69,82,114,49,0,0,0,90,18,72,75,69,89,95,76, - 79,67,65,76,95,77,65,67,72,73,78,69,41,2,218,3, - 99,108,115,114,5,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,14,95,111,112,101,110,95,114, - 101,103,105,115,116,114,121,201,2,0,0,115,8,0,0,0, - 0,2,2,1,16,1,12,1,122,36,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 95,111,112,101,110,95,114,101,103,105,115,116,114,121,99,2, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,132,0,0,0,124,0,106,0, - 114,14,124,0,106,1,125,2,110,6,124,0,106,2,125,2, - 124,2,106,3,124,1,100,1,116,4,106,5,100,0,100,2, - 133,2,25,0,22,0,100,3,141,2,125,3,122,58,124,0, - 160,6,124,3,161,1,143,28,125,4,116,7,160,8,124,4, - 100,4,161,2,125,5,87,0,100,0,4,0,4,0,131,3, - 1,0,110,16,49,0,115,94,48,0,1,0,1,0,1,0, - 89,0,1,0,87,0,110,20,4,0,116,9,121,126,1,0, - 1,0,1,0,89,0,100,0,83,0,48,0,124,5,83,0, - 41,5,78,122,5,37,100,46,37,100,114,27,0,0,0,41, - 2,114,139,0,0,0,90,11,115,121,115,95,118,101,114,115, - 105,111,110,114,39,0,0,0,41,10,218,11,68,69,66,85, - 71,95,66,85,73,76,68,218,18,82,69,71,73,83,84,82, - 89,95,75,69,89,95,68,69,66,85,71,218,12,82,69,71, - 73,83,84,82,89,95,75,69,89,114,61,0,0,0,114,8, - 0,0,0,218,12,118,101,114,115,105,111,110,95,105,110,102, - 111,114,194,0,0,0,114,192,0,0,0,90,10,81,117,101, - 114,121,86,97,108,117,101,114,49,0,0,0,41,6,114,193, - 0,0,0,114,139,0,0,0,90,12,114,101,103,105,115,116, - 114,121,95,107,101,121,114,5,0,0,0,90,4,104,107,101, - 121,218,8,102,105,108,101,112,97,116,104,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,16,95,115,101,97, - 114,99,104,95,114,101,103,105,115,116,114,121,208,2,0,0, - 115,24,0,0,0,0,2,6,1,8,2,6,1,6,1,16, - 255,6,2,2,1,12,1,46,1,12,1,8,1,122,38,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,95,115,101,97,114,99,104,95,114,101,103, - 105,115,116,114,121,78,99,4,0,0,0,0,0,0,0,0, - 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, - 120,0,0,0,124,0,160,0,124,1,161,1,125,4,124,4, - 100,0,117,0,114,22,100,0,83,0,122,12,116,1,124,4, - 131,1,1,0,87,0,110,20,4,0,116,2,121,54,1,0, - 1,0,1,0,89,0,100,0,83,0,48,0,116,3,131,0, - 68,0,93,52,92,2,125,5,125,6,124,4,160,4,116,5, - 124,6,131,1,161,1,114,62,116,6,106,7,124,1,124,5, - 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7, - 2,0,1,0,83,0,113,62,100,0,83,0,41,2,78,114, - 180,0,0,0,41,8,114,200,0,0,0,114,48,0,0,0, - 114,49,0,0,0,114,184,0,0,0,114,110,0,0,0,114, - 111,0,0,0,114,134,0,0,0,218,16,115,112,101,99,95, - 102,114,111,109,95,108,111,97,100,101,114,41,8,114,193,0, - 0,0,114,139,0,0,0,114,43,0,0,0,218,6,116,97, - 114,103,101,116,114,199,0,0,0,114,140,0,0,0,114,189, - 0,0,0,114,187,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,223,2,0,0,115,28,0,0,0,0,2,10,1,8, - 1,4,1,2,1,12,1,12,1,8,1,14,1,14,1,6, - 1,8,1,2,254,6,3,122,31,87,105,110,100,111,119,115, - 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,34,0,0,0,124,0,160,0,124,1,124,2,161,2, - 125,3,124,3,100,1,117,1,114,26,124,3,106,1,83,0, - 100,1,83,0,100,1,83,0,41,2,122,108,70,105,110,100, - 32,109,111,100,117,108,101,32,110,97,109,101,100,32,105,110, - 32,116,104,101,32,114,101,103,105,115,116,114,121,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,169,2,114,203,0,0,0, - 114,140,0,0,0,169,4,114,193,0,0,0,114,139,0,0, - 0,114,43,0,0,0,114,187,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,11,102,105,110,100, - 95,109,111,100,117,108,101,239,2,0,0,115,8,0,0,0, - 0,7,12,1,8,1,6,2,122,33,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 102,105,110,100,95,109,111,100,117,108,101,41,2,78,78,41, - 1,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,197,0,0,0,114,196,0, - 0,0,114,195,0,0,0,218,11,99,108,97,115,115,109,101, - 116,104,111,100,114,194,0,0,0,114,200,0,0,0,114,203, - 0,0,0,114,206,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,191,0,0, - 0,189,2,0,0,115,28,0,0,0,8,2,4,3,2,255, - 2,4,2,255,2,3,4,2,2,1,10,6,2,1,10,14, - 2,1,12,15,2,1,114,191,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 64,0,0,0,115,48,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, - 9,132,0,90,7,100,10,83,0,41,11,218,13,95,76,111, - 97,100,101,114,66,97,115,105,99,115,122,83,66,97,115,101, - 32,99,108,97,115,115,32,111,102,32,99,111,109,109,111,110, - 32,99,111,100,101,32,110,101,101,100,101,100,32,98,121,32, - 98,111,116,104,32,83,111,117,114,99,101,76,111,97,100,101, - 114,32,97,110,100,10,32,32,32,32,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,124, - 0,160,1,124,1,161,1,131,1,100,1,25,0,125,2,124, - 2,160,2,100,2,100,1,161,2,100,3,25,0,125,3,124, - 1,160,3,100,2,161,1,100,4,25,0,125,4,124,3,100, - 5,107,2,111,62,124,4,100,5,107,3,83,0,41,6,122, - 141,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,112, - 101,99,116,76,111,97,100,101,114,46,105,115,95,112,97,99, - 107,97,103,101,32,98,121,32,99,104,101,99,107,105,110,103, - 32,105,102,10,32,32,32,32,32,32,32,32,116,104,101,32, - 112,97,116,104,32,114,101,116,117,114,110,101,100,32,98,121, - 32,103,101,116,95,102,105,108,101,110,97,109,101,32,104,97, - 115,32,97,32,102,105,108,101,110,97,109,101,32,111,102,32, - 39,95,95,105,110,105,116,95,95,46,112,121,39,46,114,38, - 0,0,0,114,70,0,0,0,114,72,0,0,0,114,27,0, - 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,46, - 0,0,0,114,179,0,0,0,114,42,0,0,0,114,40,0, - 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,96, - 0,0,0,90,13,102,105,108,101,110,97,109,101,95,98,97, - 115,101,90,9,116,97,105,108,95,110,97,109,101,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,2,3,0,0,115,8,0,0,0,0,3,18,1,16,1, - 14,1,122,24,95,76,111,97,100,101,114,66,97,115,105,99, - 115,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,169,2, - 122,42,85,115,101,32,100,101,102,97,117,108,116,32,115,101, - 109,97,110,116,105,99,115,32,102,111,114,32,109,111,100,117, - 108,101,32,99,114,101,97,116,105,111,110,46,78,114,3,0, - 0,0,169,2,114,118,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,99, - 114,101,97,116,101,95,109,111,100,117,108,101,10,3,0,0, - 115,2,0,0,0,0,1,122,27,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,56,0, - 0,0,124,0,160,0,124,1,106,1,161,1,125,2,124,2, - 100,1,117,0,114,36,116,2,100,2,160,3,124,1,106,1, - 161,1,131,1,130,1,116,4,160,5,116,6,124,2,124,1, - 106,7,161,3,1,0,100,1,83,0,41,3,122,19,69,120, - 101,99,117,116,101,32,116,104,101,32,109,111,100,117,108,101, - 46,78,122,52,99,97,110,110,111,116,32,108,111,97,100,32, - 109,111,100,117,108,101,32,123,33,114,125,32,119,104,101,110, - 32,103,101,116,95,99,111,100,101,40,41,32,114,101,116,117, - 114,110,115,32,78,111,110,101,41,8,218,8,103,101,116,95, - 99,111,100,101,114,125,0,0,0,114,117,0,0,0,114,61, - 0,0,0,114,134,0,0,0,218,25,95,99,97,108,108,95, - 119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111, - 118,101,100,218,4,101,120,101,99,114,131,0,0,0,41,3, - 114,118,0,0,0,218,6,109,111,100,117,108,101,114,164,0, + 100,97,116,97,32,105,115,32,102,111,117,110,100,32,116,111, + 32,98,101,32,116,114,117,110,99,97,116,101,100,46,10,10, + 32,32,32,32,78,114,15,0,0,0,122,20,98,97,100,32, + 109,97,103,105,99,32,110,117,109,98,101,114,32,105,110,32, + 122,2,58,32,250,2,123,125,233,16,0,0,0,122,40,114, + 101,97,99,104,101,100,32,69,79,70,32,119,104,105,108,101, + 32,114,101,97,100,105,110,103,32,112,121,99,32,104,101,97, + 100,101,114,32,111,102,32,233,8,0,0,0,233,252,255,255, + 255,122,14,105,110,118,97,108,105,100,32,102,108,97,103,115, + 32,122,4,32,105,110,32,41,7,218,12,77,65,71,73,67, + 95,78,85,77,66,69,82,114,134,0,0,0,218,16,95,118, + 101,114,98,111,115,101,95,109,101,115,115,97,103,101,114,117, + 0,0,0,114,22,0,0,0,218,8,69,79,70,69,114,114, + 111,114,114,26,0,0,0,41,6,114,25,0,0,0,114,116, + 0,0,0,218,11,101,120,99,95,100,101,116,97,105,108,115, + 90,5,109,97,103,105,99,114,92,0,0,0,114,82,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,13,95,99,108,97,115,115,105,102,121,95,112,121,99,243, + 1,0,0,115,28,0,0,0,0,16,12,1,8,1,16,1, + 12,1,12,1,12,1,10,1,12,1,8,1,16,2,8,1, + 16,1,12,1,114,152,0,0,0,99,5,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, + 0,0,115,112,0,0,0,116,0,124,0,100,1,100,2,133, + 2,25,0,131,1,124,1,100,3,64,0,107,3,114,58,100, + 4,124,3,155,2,157,2,125,5,116,1,160,2,100,5,124, + 5,161,2,1,0,116,3,124,5,102,1,124,4,142,1,130, + 1,124,2,100,6,117,1,114,108,116,0,124,0,100,2,100, + 7,133,2,25,0,131,1,124,2,100,3,64,0,107,3,114, + 108,116,3,100,4,124,3,155,2,157,2,102,1,124,4,142, + 1,130,1,100,6,83,0,41,8,97,7,2,0,0,86,97, + 108,105,100,97,116,101,32,97,32,112,121,99,32,97,103,97, + 105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,32, + 108,97,115,116,45,109,111,100,105,102,105,101,100,32,116,105, + 109,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, + 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, + 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, + 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, + 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, + 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, + 32,32,42,115,111,117,114,99,101,95,109,116,105,109,101,42, + 32,105,115,32,116,104,101,32,108,97,115,116,32,109,111,100, + 105,102,105,101,100,32,116,105,109,101,115,116,97,109,112,32, + 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, + 108,101,46,10,10,32,32,32,32,42,115,111,117,114,99,101, + 95,115,105,122,101,42,32,105,115,32,78,111,110,101,32,111, + 114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,32,105,110, + 32,98,121,116,101,115,46,10,10,32,32,32,32,42,110,97, + 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, + 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, + 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, + 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, + 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, + 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, + 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, + 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, + 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, + 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, + 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, + 10,32,32,32,32,114,146,0,0,0,233,12,0,0,0,114, + 14,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105, + 115,32,115,116,97,108,101,32,102,111,114,32,114,144,0,0, + 0,78,114,145,0,0,0,41,4,114,26,0,0,0,114,134, + 0,0,0,114,149,0,0,0,114,117,0,0,0,41,6,114, + 25,0,0,0,218,12,115,111,117,114,99,101,95,109,116,105, + 109,101,218,11,115,111,117,114,99,101,95,115,105,122,101,114, + 116,0,0,0,114,151,0,0,0,114,92,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,23,95, + 118,97,108,105,100,97,116,101,95,116,105,109,101,115,116,97, + 109,112,95,112,121,99,20,2,0,0,115,16,0,0,0,0, + 19,24,1,10,1,12,1,12,1,8,1,22,255,2,2,114, + 156,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,124,0,100,1,100,2,133,2,25,0,124,1,107,3, + 114,34,116,0,100,3,124,2,155,2,157,2,102,1,124,3, + 142,1,130,1,100,4,83,0,41,5,97,243,1,0,0,86, + 97,108,105,100,97,116,101,32,97,32,104,97,115,104,45,98, + 97,115,101,100,32,112,121,99,32,98,121,32,99,104,101,99, + 107,105,110,103,32,116,104,101,32,114,101,97,108,32,115,111, + 117,114,99,101,32,104,97,115,104,32,97,103,97,105,110,115, + 116,32,116,104,101,32,111,110,101,32,105,110,10,32,32,32, + 32,116,104,101,32,112,121,99,32,104,101,97,100,101,114,46, + 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32, + 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32, + 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79, + 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54, + 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114, + 101,113,117,105,114,101,100,46,41,10,10,32,32,32,32,42, + 115,111,117,114,99,101,95,104,97,115,104,42,32,105,115,32, + 116,104,101,32,105,109,112,111,114,116,108,105,98,46,117,116, + 105,108,46,115,111,117,114,99,101,95,104,97,115,104,40,41, + 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102, + 105,108,101,46,10,10,32,32,32,32,42,110,97,109,101,42, + 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, + 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, + 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, + 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, + 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, + 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, + 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, + 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, + 105,110,103,46,10,10,32,32,32,32,65,110,32,73,109,112, + 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115, + 101,100,32,105,102,32,116,104,101,32,98,121,116,101,99,111, + 100,101,32,105,115,32,115,116,97,108,101,46,10,10,32,32, + 32,32,114,146,0,0,0,114,145,0,0,0,122,46,104,97, + 115,104,32,105,110,32,98,121,116,101,99,111,100,101,32,100, + 111,101,115,110,39,116,32,109,97,116,99,104,32,104,97,115, + 104,32,111,102,32,115,111,117,114,99,101,32,78,41,1,114, + 117,0,0,0,41,4,114,25,0,0,0,218,11,115,111,117, + 114,99,101,95,104,97,115,104,114,116,0,0,0,114,151,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,101,120,101,99,95,109,111,100,117,108,101,13,3, - 0,0,115,12,0,0,0,0,2,12,1,8,1,6,1,4, - 255,6,2,122,25,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,101,120,101,99,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,160,1, - 124,0,124,1,161,2,83,0,41,1,122,26,84,104,105,115, - 32,109,111,100,117,108,101,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,41,2,114,134,0,0,0,218,17,95, - 108,111,97,100,95,109,111,100,117,108,101,95,115,104,105,109, - 169,2,114,118,0,0,0,114,139,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,108,111,97, - 100,95,109,111,100,117,108,101,21,3,0,0,115,2,0,0, - 0,0,2,122,25,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 8,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,182,0,0,0,114,212,0,0,0,114, - 217,0,0,0,114,220,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,208,0, - 0,0,253,2,0,0,115,10,0,0,0,8,2,4,3,8, - 8,8,3,8,8,114,208,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,74,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, - 100,5,100,6,132,0,90,5,100,7,100,8,132,0,90,6, - 100,9,100,10,132,0,90,7,100,11,100,12,156,1,100,13, - 100,14,132,2,90,8,100,15,100,16,132,0,90,9,100,17, - 83,0,41,18,218,12,83,111,117,114,99,101,76,111,97,100, - 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,8,0,0,0, - 116,0,130,1,100,1,83,0,41,2,122,165,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, - 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, - 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, - 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, - 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, - 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, - 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, - 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, - 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, - 32,78,41,1,114,49,0,0,0,169,2,114,118,0,0,0, - 114,43,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 28,3,0,0,115,2,0,0,0,0,6,122,23,83,111,117, - 114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,109, - 116,105,109,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,67,0,0,0,115,14,0, - 0,0,100,1,124,0,160,0,124,1,161,1,105,1,83,0, - 41,2,97,158,1,0,0,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,114,101,116,117,114,110,105,110,103, - 32,97,32,109,101,116,97,100,97,116,97,32,100,105,99,116, - 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,10,32,32,32,32,32,32,32,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,80,111,115,115,105,98,108,101,32,107,101,121,115,58, - 10,32,32,32,32,32,32,32,32,45,32,39,109,116,105,109, - 101,39,32,40,109,97,110,100,97,116,111,114,121,41,32,105, - 115,32,116,104,101,32,110,117,109,101,114,105,99,32,116,105, - 109,101,115,116,97,109,112,32,111,102,32,108,97,115,116,32, - 115,111,117,114,99,101,10,32,32,32,32,32,32,32,32,32, - 32,99,111,100,101,32,109,111,100,105,102,105,99,97,116,105, - 111,110,59,10,32,32,32,32,32,32,32,32,45,32,39,115, - 105,122,101,39,32,40,111,112,116,105,111,110,97,108,41,32, - 105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98, - 121,116,101,115,32,111,102,32,116,104,101,32,115,111,117,114, - 99,101,32,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,116,104,101,32,108,111,97,100,101,114,32,116,111,32, - 114,101,97,100,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,82,97,105, - 115,101,115,32,79,83,69,114,114,111,114,32,119,104,101,110, - 32,116,104,101,32,112,97,116,104,32,99,97,110,110,111,116, - 32,98,101,32,104,97,110,100,108,101,100,46,10,32,32,32, - 32,32,32,32,32,114,169,0,0,0,41,1,114,223,0,0, - 0,114,222,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,112,97,116,104,95,115,116,97,116, - 115,36,3,0,0,115,2,0,0,0,0,12,122,23,83,111, - 117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,95, - 115,116,97,116,115,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,12, - 0,0,0,124,0,160,0,124,2,124,3,161,2,83,0,41, - 1,122,228,79,112,116,105,111,110,97,108,32,109,101,116,104, - 111,100,32,119,104,105,99,104,32,119,114,105,116,101,115,32, - 100,97,116,97,32,40,98,121,116,101,115,41,32,116,111,32, - 97,32,102,105,108,101,32,112,97,116,104,32,40,97,32,115, - 116,114,41,46,10,10,32,32,32,32,32,32,32,32,73,109, - 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32, - 109,101,116,104,111,100,32,97,108,108,111,119,115,32,102,111, - 114,32,116,104,101,32,119,114,105,116,105,110,103,32,111,102, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,111, - 117,114,99,101,32,112,97,116,104,32,105,115,32,110,101,101, - 100,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32, - 99,111,114,114,101,99,116,108,121,32,116,114,97,110,115,102, - 101,114,32,112,101,114,109,105,115,115,105,111,110,115,10,32, - 32,32,32,32,32,32,32,41,1,218,8,115,101,116,95,100, - 97,116,97,41,4,114,118,0,0,0,114,107,0,0,0,90, - 10,99,97,99,104,101,95,112,97,116,104,114,25,0,0,0, + 0,218,18,95,118,97,108,105,100,97,116,101,95,104,97,115, + 104,95,112,121,99,48,2,0,0,115,12,0,0,0,0,17, + 16,1,2,1,8,255,2,2,2,254,114,158,0,0,0,99, + 4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,80,0,0,0,116,0,160, + 1,124,0,161,1,125,4,116,2,124,4,116,3,131,2,114, + 56,116,4,160,5,100,1,124,2,161,2,1,0,124,3,100, + 2,117,1,114,52,116,6,160,7,124,4,124,3,161,2,1, + 0,124,4,83,0,116,8,100,3,160,9,124,2,161,1,124, + 1,124,2,100,4,141,3,130,1,100,2,83,0,41,5,122, + 35,67,111,109,112,105,108,101,32,98,121,116,101,99,111,100, + 101,32,97,115,32,102,111,117,110,100,32,105,110,32,97,32, + 112,121,99,46,122,21,99,111,100,101,32,111,98,106,101,99, + 116,32,102,114,111,109,32,123,33,114,125,78,122,23,78,111, + 110,45,99,111,100,101,32,111,98,106,101,99,116,32,105,110, + 32,123,33,114,125,169,2,114,116,0,0,0,114,43,0,0, + 0,41,10,218,7,109,97,114,115,104,97,108,90,5,108,111, + 97,100,115,218,10,105,115,105,110,115,116,97,110,99,101,218, + 10,95,99,111,100,101,95,116,121,112,101,114,134,0,0,0, + 114,149,0,0,0,218,4,95,105,109,112,90,16,95,102,105, + 120,95,99,111,95,102,105,108,101,110,97,109,101,114,117,0, + 0,0,114,61,0,0,0,41,5,114,25,0,0,0,114,116, + 0,0,0,114,106,0,0,0,114,107,0,0,0,218,4,99, + 111,100,101,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,17,95,99,111,109,112,105,108,101,95,98,121,116, + 101,99,111,100,101,72,2,0,0,115,20,0,0,0,0,2, + 10,1,10,1,12,1,8,1,12,1,4,2,10,1,2,0, + 2,255,114,165,0,0,0,114,72,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, + 0,67,0,0,0,115,70,0,0,0,116,0,116,1,131,1, + 125,3,124,3,160,2,116,3,100,1,131,1,161,1,1,0, + 124,3,160,2,116,3,124,1,131,1,161,1,1,0,124,3, + 160,2,116,3,124,2,131,1,161,1,1,0,124,3,160,2, + 116,4,160,5,124,0,161,1,161,1,1,0,124,3,83,0, + 41,2,122,43,80,114,111,100,117,99,101,32,116,104,101,32, + 100,97,116,97,32,102,111,114,32,97,32,116,105,109,101,115, + 116,97,109,112,45,98,97,115,101,100,32,112,121,99,46,114, + 72,0,0,0,41,6,218,9,98,121,116,101,97,114,114,97, + 121,114,148,0,0,0,218,6,101,120,116,101,110,100,114,20, + 0,0,0,114,160,0,0,0,218,5,100,117,109,112,115,41, + 4,114,164,0,0,0,218,5,109,116,105,109,101,114,155,0, + 0,0,114,25,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,22,95,99,111,100,101,95,116,111, + 95,116,105,109,101,115,116,97,109,112,95,112,121,99,85,2, + 0,0,115,12,0,0,0,0,2,8,1,14,1,14,1,14, + 1,16,1,114,170,0,0,0,84,99,3,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, + 0,0,115,80,0,0,0,116,0,116,1,131,1,125,3,100, + 1,124,2,100,1,62,0,66,0,125,4,124,3,160,2,116, + 3,124,4,131,1,161,1,1,0,116,4,124,1,131,1,100, + 2,107,2,115,50,74,0,130,1,124,3,160,2,124,1,161, + 1,1,0,124,3,160,2,116,5,160,6,124,0,161,1,161, + 1,1,0,124,3,83,0,41,3,122,38,80,114,111,100,117, + 99,101,32,116,104,101,32,100,97,116,97,32,102,111,114,32, + 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, + 46,114,38,0,0,0,114,146,0,0,0,41,7,114,166,0, + 0,0,114,148,0,0,0,114,167,0,0,0,114,20,0,0, + 0,114,22,0,0,0,114,160,0,0,0,114,168,0,0,0, + 41,5,114,164,0,0,0,114,157,0,0,0,90,7,99,104, + 101,99,107,101,100,114,25,0,0,0,114,82,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, + 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, + 99,95,2,0,0,115,14,0,0,0,0,2,8,1,12,1, + 14,1,16,1,10,1,16,1,114,171,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, + 0,0,67,0,0,0,115,62,0,0,0,100,1,100,2,108, + 0,125,1,116,1,160,2,124,0,161,1,106,3,125,2,124, + 1,160,4,124,2,161,1,125,3,116,1,160,5,100,2,100, + 3,161,2,125,4,124,4,160,6,124,0,160,6,124,3,100, + 1,25,0,161,1,161,1,83,0,41,4,122,121,68,101,99, + 111,100,101,32,98,121,116,101,115,32,114,101,112,114,101,115, + 101,110,116,105,110,103,32,115,111,117,114,99,101,32,99,111, + 100,101,32,97,110,100,32,114,101,116,117,114,110,32,116,104, + 101,32,115,116,114,105,110,103,46,10,10,32,32,32,32,85, + 110,105,118,101,114,115,97,108,32,110,101,119,108,105,110,101, + 32,115,117,112,112,111,114,116,32,105,115,32,117,115,101,100, + 32,105,110,32,116,104,101,32,100,101,99,111,100,105,110,103, + 46,10,32,32,32,32,114,72,0,0,0,78,84,41,7,218, + 8,116,111,107,101,110,105,122,101,114,63,0,0,0,90,7, + 66,121,116,101,115,73,79,90,8,114,101,97,100,108,105,110, + 101,90,15,100,101,116,101,99,116,95,101,110,99,111,100,105, + 110,103,90,25,73,110,99,114,101,109,101,110,116,97,108,78, + 101,119,108,105,110,101,68,101,99,111,100,101,114,218,6,100, + 101,99,111,100,101,41,5,218,12,115,111,117,114,99,101,95, + 98,121,116,101,115,114,172,0,0,0,90,21,115,111,117,114, + 99,101,95,98,121,116,101,115,95,114,101,97,100,108,105,110, + 101,218,8,101,110,99,111,100,105,110,103,90,15,110,101,119, + 108,105,110,101,95,100,101,99,111,100,101,114,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,13,100,101,99, + 111,100,101,95,115,111,117,114,99,101,106,2,0,0,115,10, + 0,0,0,0,5,8,1,12,1,10,1,12,1,114,176,0, + 0,0,169,2,114,140,0,0,0,218,26,115,117,98,109,111, + 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, + 116,105,111,110,115,99,2,0,0,0,0,0,0,0,2,0, + 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,12, + 1,0,0,124,1,100,1,117,0,114,58,100,2,125,1,116, + 0,124,2,100,3,131,2,114,68,122,14,124,2,160,1,124, + 0,161,1,125,1,87,0,113,68,4,0,116,2,121,54,1, + 0,1,0,1,0,89,0,113,68,48,0,110,10,116,3,160, + 4,124,1,161,1,125,1,116,5,106,6,124,0,124,2,124, + 1,100,4,141,3,125,4,100,5,124,4,95,7,124,2,100, + 1,117,0,114,152,116,8,131,0,68,0,93,42,92,2,125, + 5,125,6,124,1,160,9,116,10,124,6,131,1,161,1,114, + 104,124,5,124,0,124,1,131,2,125,2,124,2,124,4,95, + 11,1,0,113,152,113,104,100,1,83,0,124,3,116,12,117, + 0,114,216,116,0,124,2,100,6,131,2,114,222,122,14,124, + 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, + 2,121,202,1,0,1,0,1,0,89,0,113,222,48,0,124, + 7,114,222,103,0,124,4,95,14,110,6,124,3,124,4,95, + 14,124,4,106,14,103,0,107,2,144,1,114,8,124,1,144, + 1,114,8,116,15,124,1,131,1,100,7,25,0,125,8,124, + 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,41, + 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, + 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, + 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, + 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, + 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, + 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, + 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, + 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, + 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, + 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, + 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, + 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, + 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, + 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, + 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, + 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, + 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, + 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, + 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, + 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, + 107,97,103,101,114,72,0,0,0,41,17,114,128,0,0,0, + 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, + 78,0,0,0,114,134,0,0,0,218,10,77,111,100,117,108, + 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, + 97,116,116,114,218,27,95,103,101,116,95,115,117,112,112,111, + 114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114, + 115,114,110,0,0,0,114,111,0,0,0,114,140,0,0,0, + 218,9,95,80,79,80,85,76,65,84,69,114,182,0,0,0, + 114,178,0,0,0,114,46,0,0,0,218,6,97,112,112,101, + 110,100,41,9,114,116,0,0,0,90,8,108,111,99,97,116, + 105,111,110,114,140,0,0,0,114,178,0,0,0,218,4,115, + 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, + 115,218,8,115,117,102,102,105,120,101,115,114,182,0,0,0, + 90,7,100,105,114,110,97,109,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,23,115,112,101,99,95,102, + 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, + 110,123,2,0,0,115,62,0,0,0,0,12,8,4,4,1, + 10,2,2,1,14,1,12,1,8,2,10,8,16,1,6,3, + 8,1,14,1,14,1,10,1,6,1,6,2,4,3,8,2, + 10,1,2,1,14,1,12,1,6,2,4,1,8,2,6,1, + 12,1,6,1,12,1,12,2,114,190,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,80,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,90,4,100,3,90,5,100, + 4,90,6,101,7,100,5,100,6,132,0,131,1,90,8,101, + 7,100,7,100,8,132,0,131,1,90,9,101,7,100,14,100, + 10,100,11,132,1,131,1,90,10,101,7,100,15,100,12,100, + 13,132,1,131,1,90,11,100,9,83,0,41,16,218,21,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, + 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, + 101,115,32,100,101,99,108,97,114,101,100,32,105,110,32,116, + 104,101,32,87,105,110,100,111,119,115,32,114,101,103,105,115, + 116,114,121,46,122,59,83,111,102,116,119,97,114,101,92,80, + 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, + 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, + 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, + 125,122,65,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, + 101,98,117,103,70,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,54, + 0,0,0,122,16,116,0,160,1,116,0,106,2,124,1,161, + 2,87,0,83,0,4,0,116,3,121,48,1,0,1,0,1, + 0,116,0,160,1,116,0,106,4,124,1,161,2,6,0,89, + 0,83,0,48,0,100,0,83,0,114,109,0,0,0,41,5, + 218,7,95,119,105,110,114,101,103,90,7,79,112,101,110,75, + 101,121,90,17,72,75,69,89,95,67,85,82,82,69,78,84, + 95,85,83,69,82,114,49,0,0,0,90,18,72,75,69,89, + 95,76,79,67,65,76,95,77,65,67,72,73,78,69,41,2, + 218,3,99,108,115,114,5,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,14,95,111,112,101,110, + 95,114,101,103,105,115,116,114,121,203,2,0,0,115,8,0, + 0,0,0,2,2,1,16,1,12,1,122,36,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, + 114,46,95,111,112,101,110,95,114,101,103,105,115,116,114,121, + 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,8,0,0,0,67,0,0,0,115,132,0,0,0,124,0, + 106,0,114,14,124,0,106,1,125,2,110,6,124,0,106,2, + 125,2,124,2,106,3,124,1,100,1,116,4,106,5,100,0, + 100,2,133,2,25,0,22,0,100,3,141,2,125,3,122,58, + 124,0,160,6,124,3,161,1,143,28,125,4,116,7,160,8, + 124,4,100,4,161,2,125,5,87,0,100,0,4,0,4,0, + 131,3,1,0,110,16,49,0,115,94,48,0,1,0,1,0, + 1,0,89,0,1,0,87,0,110,20,4,0,116,9,121,126, + 1,0,1,0,1,0,89,0,100,0,83,0,48,0,124,5, + 83,0,41,5,78,122,5,37,100,46,37,100,114,27,0,0, + 0,41,2,114,139,0,0,0,90,11,115,121,115,95,118,101, + 114,115,105,111,110,114,39,0,0,0,41,10,218,11,68,69, + 66,85,71,95,66,85,73,76,68,218,18,82,69,71,73,83, + 84,82,89,95,75,69,89,95,68,69,66,85,71,218,12,82, + 69,71,73,83,84,82,89,95,75,69,89,114,61,0,0,0, + 114,8,0,0,0,218,12,118,101,114,115,105,111,110,95,105, + 110,102,111,114,194,0,0,0,114,192,0,0,0,90,10,81, + 117,101,114,121,86,97,108,117,101,114,49,0,0,0,41,6, + 114,193,0,0,0,114,139,0,0,0,90,12,114,101,103,105, + 115,116,114,121,95,107,101,121,114,5,0,0,0,90,4,104, + 107,101,121,218,8,102,105,108,101,112,97,116,104,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,16,95,115, + 101,97,114,99,104,95,114,101,103,105,115,116,114,121,210,2, + 0,0,115,24,0,0,0,0,2,6,1,8,2,6,1,6, + 1,16,255,6,2,2,1,12,1,46,1,12,1,8,1,122, + 38,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, + 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,114, + 101,103,105,115,116,114,121,78,99,4,0,0,0,0,0,0, + 0,0,0,0,0,8,0,0,0,8,0,0,0,67,0,0, + 0,115,120,0,0,0,124,0,160,0,124,1,161,1,125,4, + 124,4,100,0,117,0,114,22,100,0,83,0,122,12,116,1, + 124,4,131,1,1,0,87,0,110,20,4,0,116,2,121,54, + 1,0,1,0,1,0,89,0,100,0,83,0,48,0,116,3, + 131,0,68,0,93,52,92,2,125,5,125,6,124,4,160,4, + 116,5,124,6,131,1,161,1,114,62,116,6,106,7,124,1, + 124,5,124,1,124,4,131,2,124,4,100,1,141,3,125,7, + 124,7,2,0,1,0,83,0,113,62,100,0,83,0,41,2, + 78,114,180,0,0,0,41,8,114,200,0,0,0,114,48,0, + 0,0,114,49,0,0,0,114,184,0,0,0,114,110,0,0, + 0,114,111,0,0,0,114,134,0,0,0,218,16,115,112,101, + 99,95,102,114,111,109,95,108,111,97,100,101,114,41,8,114, + 193,0,0,0,114,139,0,0,0,114,43,0,0,0,218,6, + 116,97,114,103,101,116,114,199,0,0,0,114,140,0,0,0, + 114,189,0,0,0,114,187,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,9,102,105,110,100,95, + 115,112,101,99,225,2,0,0,115,28,0,0,0,0,2,10, + 1,8,1,4,1,2,1,12,1,12,1,8,1,14,1,14, + 1,6,1,8,1,2,254,6,3,122,31,87,105,110,100,111, + 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, + 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,34,0,0,0,124,0,160,0,124,1,124,2, + 161,2,125,3,124,3,100,1,117,1,114,26,124,3,106,1, + 83,0,100,1,83,0,100,1,83,0,41,2,122,108,70,105, + 110,100,32,109,111,100,117,108,101,32,110,97,109,101,100,32, + 105,110,32,116,104,101,32,114,101,103,105,115,116,114,121,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,78,169,2,114,203,0, + 0,0,114,140,0,0,0,169,4,114,193,0,0,0,114,139, + 0,0,0,114,43,0,0,0,114,187,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,11,102,105, + 110,100,95,109,111,100,117,108,101,241,2,0,0,115,8,0, + 0,0,0,7,12,1,8,1,6,2,122,33,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,41,2,78, + 78,41,1,78,41,12,114,125,0,0,0,114,124,0,0,0, + 114,126,0,0,0,114,127,0,0,0,114,197,0,0,0,114, + 196,0,0,0,114,195,0,0,0,218,11,99,108,97,115,115, + 109,101,116,104,111,100,114,194,0,0,0,114,200,0,0,0, + 114,203,0,0,0,114,206,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,191, + 0,0,0,191,2,0,0,115,28,0,0,0,8,2,4,3, + 2,255,2,4,2,255,2,3,4,2,2,1,10,6,2,1, + 10,14,2,1,12,15,2,1,114,191,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, + 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95, + 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97, + 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109, + 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98, + 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97, + 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114, + 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, + 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, + 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125, + 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125, + 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124, + 3,100,5,107,2,111,62,124,4,100,5,107,3,83,0,41, + 6,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, + 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112, + 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105, + 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104, + 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32, + 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32, + 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111, + 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46, + 114,38,0,0,0,114,70,0,0,0,114,72,0,0,0,114, + 27,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4, + 114,46,0,0,0,114,179,0,0,0,114,42,0,0,0,114, + 40,0,0,0,41,5,114,118,0,0,0,114,139,0,0,0, + 114,96,0,0,0,90,13,102,105,108,101,110,97,109,101,95, + 98,97,115,101,90,9,116,97,105,108,95,110,97,109,101,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,182, + 0,0,0,4,3,0,0,115,8,0,0,0,0,3,18,1, + 16,1,14,1,122,24,95,76,111,97,100,101,114,66,97,115, + 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32, + 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111, + 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114, + 3,0,0,0,169,2,114,118,0,0,0,114,187,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 15,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, - 50,3,0,0,115,2,0,0,0,0,8,122,28,83,111,117, - 114,99,101,76,111,97,100,101,114,46,95,99,97,99,104,101, - 95,98,121,116,101,99,111,100,101,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, - 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, - 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, - 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,78,114,3,0,0,0,41,3,114,118,0, - 0,0,114,43,0,0,0,114,25,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,0, - 60,3,0,0,115,2,0,0,0,0,1,122,21,83,111,117, - 114,99,101,76,111,97,100,101,114,46,115,101,116,95,100,97, - 116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,10,0,0,0,67,0,0,0,115,84,0,0,0, - 124,0,160,0,124,1,161,1,125,2,122,14,124,0,160,1, - 124,2,161,1,125,3,87,0,110,50,4,0,116,2,121,74, - 1,0,125,4,1,0,122,26,116,3,100,1,124,1,100,2, - 141,2,124,4,130,2,87,0,89,0,100,3,125,4,126,4, - 110,10,100,3,125,4,126,4,48,0,48,0,116,4,124,3, - 131,1,83,0,41,4,122,52,67,111,110,99,114,101,116,101, - 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, - 111,102,32,73,110,115,112,101,99,116,76,111,97,100,101,114, - 46,103,101,116,95,115,111,117,114,99,101,46,122,39,115,111, - 117,114,99,101,32,110,111,116,32,97,118,97,105,108,97,98, - 108,101,32,116,104,114,111,117,103,104,32,103,101,116,95,100, - 97,116,97,40,41,114,115,0,0,0,78,41,5,114,179,0, - 0,0,218,8,103,101,116,95,100,97,116,97,114,49,0,0, - 0,114,117,0,0,0,114,176,0,0,0,41,5,114,118,0, - 0,0,114,139,0,0,0,114,43,0,0,0,114,174,0,0, - 0,218,3,101,120,99,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, - 101,67,3,0,0,115,20,0,0,0,0,2,10,1,2,1, - 14,1,14,1,4,1,2,255,4,1,2,255,24,2,122,23, - 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,114,104,0,0,0,41,1,218,9, - 95,111,112,116,105,109,105,122,101,99,3,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,8,0,0,0,67,0, - 0,0,115,22,0,0,0,116,0,106,1,116,2,124,1,124, - 2,100,1,100,2,124,3,100,3,141,6,83,0,41,4,122, - 130,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, - 32,111,98,106,101,99,116,32,99,111,109,112,105,108,101,100, - 32,102,114,111,109,32,115,111,117,114,99,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,39,100,97,116,97, - 39,32,97,114,103,117,109,101,110,116,32,99,97,110,32,98, - 101,32,97,110,121,32,111,98,106,101,99,116,32,116,121,112, - 101,32,116,104,97,116,32,99,111,109,112,105,108,101,40,41, - 32,115,117,112,112,111,114,116,115,46,10,32,32,32,32,32, - 32,32,32,114,215,0,0,0,84,41,2,218,12,100,111,110, - 116,95,105,110,104,101,114,105,116,114,83,0,0,0,41,3, - 114,134,0,0,0,114,214,0,0,0,218,7,99,111,109,112, - 105,108,101,41,4,114,118,0,0,0,114,25,0,0,0,114, - 43,0,0,0,114,230,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,14,115,111,117,114,99,101, - 95,116,111,95,99,111,100,101,77,3,0,0,115,8,0,0, - 0,0,5,12,1,2,0,2,255,122,27,83,111,117,114,99, - 101,76,111,97,100,101,114,46,115,111,117,114,99,101,95,116, - 111,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,15,0,0,0,9,0,0,0,67,0,0,0,115, - 24,2,0,0,124,0,160,0,124,1,161,1,125,2,100,1, - 125,3,100,1,125,4,100,1,125,5,100,2,125,6,100,3, - 125,7,122,12,116,1,124,2,131,1,125,8,87,0,110,24, - 4,0,116,2,121,66,1,0,1,0,1,0,100,1,125,8, - 89,0,144,1,110,42,48,0,122,14,124,0,160,3,124,2, - 161,1,125,9,87,0,110,20,4,0,116,4,121,102,1,0, - 1,0,1,0,89,0,144,1,110,6,48,0,116,5,124,9, - 100,4,25,0,131,1,125,3,122,14,124,0,160,6,124,8, - 161,1,125,10,87,0,110,18,4,0,116,4,121,148,1,0, - 1,0,1,0,89,0,110,216,48,0,124,1,124,8,100,5, - 156,2,125,11,122,148,116,7,124,10,124,1,124,11,131,3, - 125,12,116,8,124,10,131,1,100,6,100,1,133,2,25,0, - 125,13,124,12,100,7,64,0,100,8,107,3,125,6,124,6, - 144,1,114,30,124,12,100,9,64,0,100,8,107,3,125,7, - 116,9,106,10,100,10,107,3,144,1,114,50,124,7,115,248, - 116,9,106,10,100,11,107,2,144,1,114,50,124,0,160,6, - 124,2,161,1,125,4,116,9,160,11,116,12,124,4,161,2, - 125,5,116,13,124,10,124,5,124,1,124,11,131,4,1,0, - 110,20,116,14,124,10,124,3,124,9,100,12,25,0,124,1, - 124,11,131,5,1,0,87,0,110,24,4,0,116,15,116,16, - 102,2,144,1,121,76,1,0,1,0,1,0,89,0,110,32, - 48,0,116,17,160,18,100,13,124,8,124,2,161,3,1,0, - 116,19,124,13,124,1,124,8,124,2,100,14,141,4,83,0, - 124,4,100,1,117,0,144,1,114,128,124,0,160,6,124,2, - 161,1,125,4,124,0,160,20,124,4,124,2,161,2,125,14, - 116,17,160,18,100,15,124,2,161,2,1,0,116,21,106,22, - 144,2,115,20,124,8,100,1,117,1,144,2,114,20,124,3, - 100,1,117,1,144,2,114,20,124,6,144,1,114,220,124,5, - 100,1,117,0,144,1,114,206,116,9,160,11,124,4,161,1, - 125,5,116,23,124,14,124,5,124,7,131,3,125,10,110,16, - 116,24,124,14,124,3,116,25,124,4,131,1,131,3,125,10, - 122,18,124,0,160,26,124,2,124,8,124,10,161,3,1,0, - 87,0,110,20,4,0,116,2,144,2,121,18,1,0,1,0, - 1,0,89,0,110,2,48,0,124,14,83,0,41,16,122,190, - 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,32,111,102,32,73,110,115,112,101, - 99,116,76,111,97,100,101,114,46,103,101,116,95,99,111,100, - 101,46,10,10,32,32,32,32,32,32,32,32,82,101,97,100, - 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, - 114,101,113,117,105,114,101,115,32,112,97,116,104,95,115,116, - 97,116,115,32,116,111,32,98,101,32,105,109,112,108,101,109, - 101,110,116,101,100,46,32,84,111,32,119,114,105,116,101,10, - 32,32,32,32,32,32,32,32,98,121,116,101,99,111,100,101, - 44,32,115,101,116,95,100,97,116,97,32,109,117,115,116,32, - 97,108,115,111,32,98,101,32,105,109,112,108,101,109,101,110, - 116,101,100,46,10,10,32,32,32,32,32,32,32,32,78,70, - 84,114,169,0,0,0,114,159,0,0,0,114,145,0,0,0, - 114,38,0,0,0,114,72,0,0,0,114,27,0,0,0,90, - 5,110,101,118,101,114,90,6,97,108,119,97,121,115,218,4, - 115,105,122,101,122,13,123,125,32,109,97,116,99,104,101,115, - 32,123,125,41,3,114,116,0,0,0,114,106,0,0,0,114, - 107,0,0,0,122,19,99,111,100,101,32,111,98,106,101,99, - 116,32,102,114,111,109,32,123,125,41,27,114,179,0,0,0, - 114,97,0,0,0,114,81,0,0,0,114,224,0,0,0,114, - 49,0,0,0,114,17,0,0,0,114,227,0,0,0,114,152, - 0,0,0,218,10,109,101,109,111,114,121,118,105,101,119,114, - 163,0,0,0,90,21,99,104,101,99,107,95,104,97,115,104, - 95,98,97,115,101,100,95,112,121,99,115,114,157,0,0,0, - 218,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,114,158,0,0,0,114,156,0,0,0,114,117,0, - 0,0,114,150,0,0,0,114,134,0,0,0,114,149,0,0, - 0,114,165,0,0,0,114,233,0,0,0,114,8,0,0,0, - 218,19,100,111,110,116,95,119,114,105,116,101,95,98,121,116, - 101,99,111,100,101,114,171,0,0,0,114,170,0,0,0,114, - 22,0,0,0,114,226,0,0,0,41,15,114,118,0,0,0, - 114,139,0,0,0,114,107,0,0,0,114,154,0,0,0,114, - 174,0,0,0,114,157,0,0,0,90,10,104,97,115,104,95, - 98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,117, - 114,99,101,114,106,0,0,0,218,2,115,116,114,25,0,0, - 0,114,151,0,0,0,114,82,0,0,0,90,10,98,121,116, - 101,115,95,100,97,116,97,90,11,99,111,100,101,95,111,98, - 106,101,99,116,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,213,0,0,0,85,3,0,0,115,152,0,0, - 0,0,7,10,1,4,1,4,1,4,1,4,1,4,1,2, - 1,12,1,12,1,12,2,2,1,14,1,12,1,8,2,12, - 1,2,1,14,1,12,1,6,3,2,1,2,254,6,4,2, - 1,12,1,16,1,12,1,6,1,12,1,12,1,2,255,2, - 2,8,254,4,3,10,1,4,1,2,1,2,254,4,4,8, - 1,2,255,6,3,2,1,2,1,2,1,6,1,2,1,2, - 251,8,7,18,1,6,2,8,1,2,255,4,2,6,1,2, - 1,2,254,6,3,10,1,10,1,12,1,12,1,18,1,6, - 255,4,2,6,1,10,1,10,1,14,2,6,1,6,255,4, - 2,2,1,18,1,14,1,6,1,122,21,83,111,117,114,99, - 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, - 78,41,10,114,125,0,0,0,114,124,0,0,0,114,126,0, - 0,0,114,223,0,0,0,114,224,0,0,0,114,226,0,0, - 0,114,225,0,0,0,114,229,0,0,0,114,233,0,0,0, - 114,213,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,221,0,0,0,26,3, - 0,0,115,14,0,0,0,8,2,8,8,8,14,8,10,8, - 7,8,10,14,8,114,221,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, - 0,0,0,115,124,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,100,7,132,0,90,6,101,7,135,0, - 102,1,100,8,100,9,132,8,131,1,90,8,101,7,100,10, - 100,11,132,0,131,1,90,9,100,12,100,13,132,0,90,10, - 101,7,100,14,100,15,132,0,131,1,90,11,100,16,100,17, - 132,0,90,12,100,18,100,19,132,0,90,13,100,20,100,21, - 132,0,90,14,100,22,100,23,132,0,90,15,135,0,4,0, - 90,16,83,0,41,24,218,10,70,105,108,101,76,111,97,100, - 101,114,122,103,66,97,115,101,32,102,105,108,101,32,108,111, - 97,100,101,114,32,99,108,97,115,115,32,119,104,105,99,104, - 32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32, - 108,111,97,100,101,114,32,112,114,111,116,111,99,111,108,32, - 109,101,116,104,111,100,115,32,116,104,97,116,10,32,32,32, - 32,114,101,113,117,105,114,101,32,102,105,108,101,32,115,121, - 115,116,101,109,32,117,115,97,103,101,46,99,3,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, - 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,124, - 2,124,0,95,1,100,1,83,0,41,2,122,75,67,97,99, - 104,101,32,116,104,101,32,109,111,100,117,108,101,32,110,97, - 109,101,32,97,110,100,32,116,104,101,32,112,97,116,104,32, - 116,111,32,116,104,101,32,102,105,108,101,32,102,111,117,110, - 100,32,98,121,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,105,110,100,101,114,46,78,114,159,0,0,0,41,3, - 114,118,0,0,0,114,139,0,0,0,114,43,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,209, - 0,0,0,175,3,0,0,115,4,0,0,0,0,3,6,1, - 122,19,70,105,108,101,76,111,97,100,101,114,46,95,95,105, - 110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24, - 0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124, - 0,106,1,124,1,106,1,107,2,83,0,114,109,0,0,0, - 169,2,218,9,95,95,99,108,97,115,115,95,95,114,131,0, - 0,0,169,2,114,118,0,0,0,90,5,111,116,104,101,114, + 13,99,114,101,97,116,101,95,109,111,100,117,108,101,12,3, + 0,0,115,2,0,0,0,0,1,122,27,95,76,111,97,100, + 101,114,66,97,115,105,99,115,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, + 56,0,0,0,124,0,160,0,124,1,106,1,161,1,125,2, + 124,2,100,1,117,0,114,36,116,2,100,2,160,3,124,1, + 106,1,161,1,131,1,130,1,116,4,160,5,116,6,124,2, + 124,1,106,7,161,3,1,0,100,1,83,0,41,3,122,19, + 69,120,101,99,117,116,101,32,116,104,101,32,109,111,100,117, + 108,101,46,78,122,52,99,97,110,110,111,116,32,108,111,97, + 100,32,109,111,100,117,108,101,32,123,33,114,125,32,119,104, + 101,110,32,103,101,116,95,99,111,100,101,40,41,32,114,101, + 116,117,114,110,115,32,78,111,110,101,41,8,218,8,103,101, + 116,95,99,111,100,101,114,125,0,0,0,114,117,0,0,0, + 114,61,0,0,0,114,134,0,0,0,218,25,95,99,97,108, + 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101, + 109,111,118,101,100,218,4,101,120,101,99,114,131,0,0,0, + 41,3,114,118,0,0,0,218,6,109,111,100,117,108,101,114, + 164,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,101, + 15,3,0,0,115,12,0,0,0,0,2,12,1,8,1,6, + 1,4,255,6,2,122,25,95,76,111,97,100,101,114,66,97, + 115,105,99,115,46,101,120,101,99,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,67,0,0,0,115,12,0,0,0,116,0, + 160,1,124,0,124,1,161,2,83,0,41,1,122,26,84,104, + 105,115,32,109,111,100,117,108,101,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,41,2,114,134,0,0,0,218, + 17,95,108,111,97,100,95,109,111,100,117,108,101,95,115,104, + 105,109,169,2,114,118,0,0,0,114,139,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,108, + 111,97,100,95,109,111,100,117,108,101,23,3,0,0,115,2, + 0,0,0,0,2,122,25,95,76,111,97,100,101,114,66,97, + 115,105,99,115,46,108,111,97,100,95,109,111,100,117,108,101, + 78,41,8,114,125,0,0,0,114,124,0,0,0,114,126,0, + 0,0,114,127,0,0,0,114,182,0,0,0,114,212,0,0, + 0,114,217,0,0,0,114,220,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 208,0,0,0,255,2,0,0,115,10,0,0,0,8,2,4, + 3,8,8,8,3,8,8,114,208,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, + 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, + 90,4,100,5,100,6,132,0,90,5,100,7,100,8,132,0, + 90,6,100,9,100,10,132,0,90,7,100,11,100,12,156,1, + 100,13,100,14,132,2,90,8,100,15,100,16,132,0,90,9, + 100,17,83,0,41,18,218,12,83,111,117,114,99,101,76,111, + 97,100,101,114,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,8,0, + 0,0,116,0,130,1,100,1,83,0,41,2,122,165,79,112, + 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104, + 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109, + 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101, + 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104, + 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102, + 105,101,100,32,112,97,116,104,32,40,97,32,115,116,114,41, + 46,10,10,32,32,32,32,32,32,32,32,82,97,105,115,101, + 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, + 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, + 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, + 32,32,32,78,41,1,114,49,0,0,0,169,2,114,118,0, + 0,0,114,43,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,10,112,97,116,104,95,109,116,105, + 109,101,30,3,0,0,115,2,0,0,0,0,6,122,23,83, + 111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,104, + 95,109,116,105,109,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 14,0,0,0,100,1,124,0,160,0,124,1,161,1,105,1, + 83,0,41,2,97,158,1,0,0,79,112,116,105,111,110,97, + 108,32,109,101,116,104,111,100,32,114,101,116,117,114,110,105, + 110,103,32,97,32,109,101,116,97,100,97,116,97,32,100,105, + 99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,10,32,32,32,32,32,32,32,32,112,97,116, + 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, + 32,32,32,32,80,111,115,115,105,98,108,101,32,107,101,121, + 115,58,10,32,32,32,32,32,32,32,32,45,32,39,109,116, + 105,109,101,39,32,40,109,97,110,100,97,116,111,114,121,41, + 32,105,115,32,116,104,101,32,110,117,109,101,114,105,99,32, + 116,105,109,101,115,116,97,109,112,32,111,102,32,108,97,115, + 116,32,115,111,117,114,99,101,10,32,32,32,32,32,32,32, + 32,32,32,99,111,100,101,32,109,111,100,105,102,105,99,97, + 116,105,111,110,59,10,32,32,32,32,32,32,32,32,45,32, + 39,115,105,122,101,39,32,40,111,112,116,105,111,110,97,108, + 41,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110, + 32,98,121,116,101,115,32,111,102,32,116,104,101,32,115,111, + 117,114,99,101,32,99,111,100,101,46,10,10,32,32,32,32, + 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, + 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, + 111,119,115,32,116,104,101,32,108,111,97,100,101,114,32,116, + 111,32,114,101,97,100,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,82, + 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, + 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, + 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, + 32,32,32,32,32,32,32,114,169,0,0,0,41,1,114,223, + 0,0,0,114,222,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,10,112,97,116,104,95,115,116, + 97,116,115,38,3,0,0,115,2,0,0,0,0,12,122,23, + 83,111,117,114,99,101,76,111,97,100,101,114,46,112,97,116, + 104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,12,0,0,0,124,0,160,0,124,2,124,3,161,2,83, + 0,41,1,122,228,79,112,116,105,111,110,97,108,32,109,101, + 116,104,111,100,32,119,104,105,99,104,32,119,114,105,116,101, + 115,32,100,97,116,97,32,40,98,121,116,101,115,41,32,116, + 111,32,97,32,102,105,108,101,32,112,97,116,104,32,40,97, + 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, + 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, + 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, + 102,111,114,32,116,104,101,32,119,114,105,116,105,110,103,32, + 111,102,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 115,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, + 115,111,117,114,99,101,32,112,97,116,104,32,105,115,32,110, + 101,101,100,101,100,32,105,110,32,111,114,100,101,114,32,116, + 111,32,99,111,114,114,101,99,116,108,121,32,116,114,97,110, + 115,102,101,114,32,112,101,114,109,105,115,115,105,111,110,115, + 10,32,32,32,32,32,32,32,32,41,1,218,8,115,101,116, + 95,100,97,116,97,41,4,114,118,0,0,0,114,107,0,0, + 0,90,10,99,97,99,104,101,95,112,97,116,104,114,25,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,15,95,99,97,99,104,101,95,98,121,116,101,99,111, + 100,101,52,3,0,0,115,2,0,0,0,0,8,122,28,83, + 111,117,114,99,101,76,111,97,100,101,114,46,95,99,97,99, + 104,101,95,98,121,116,101,99,111,100,101,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 150,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, + 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, + 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, + 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, + 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, + 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, + 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,32, + 32,32,32,32,32,32,32,78,114,3,0,0,0,41,3,114, + 118,0,0,0,114,43,0,0,0,114,25,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0, + 0,0,62,3,0,0,115,2,0,0,0,0,1,122,21,83, + 111,117,114,99,101,76,111,97,100,101,114,46,115,101,116,95, + 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,10,0,0,0,67,0,0,0,115,84,0, + 0,0,124,0,160,0,124,1,161,1,125,2,122,14,124,0, + 160,1,124,2,161,1,125,3,87,0,110,50,4,0,116,2, + 121,74,1,0,125,4,1,0,122,26,116,3,100,1,124,1, + 100,2,141,2,124,4,130,2,87,0,89,0,100,3,125,4, + 126,4,110,10,100,3,125,4,126,4,48,0,48,0,116,4, + 124,3,131,1,83,0,41,4,122,52,67,111,110,99,114,101, + 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,73,110,115,112,101,99,116,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,46,122,39, + 115,111,117,114,99,101,32,110,111,116,32,97,118,97,105,108, + 97,98,108,101,32,116,104,114,111,117,103,104,32,103,101,116, + 95,100,97,116,97,40,41,114,115,0,0,0,78,41,5,114, + 179,0,0,0,218,8,103,101,116,95,100,97,116,97,114,49, + 0,0,0,114,117,0,0,0,114,176,0,0,0,41,5,114, + 118,0,0,0,114,139,0,0,0,114,43,0,0,0,114,174, + 0,0,0,218,3,101,120,99,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, + 114,99,101,69,3,0,0,115,20,0,0,0,0,2,10,1, + 2,1,14,1,14,1,4,1,2,255,4,1,2,255,24,2, + 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,114,104,0,0,0,41,1, + 218,9,95,111,112,116,105,109,105,122,101,99,3,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0, + 67,0,0,0,115,22,0,0,0,116,0,106,1,116,2,124, + 1,124,2,100,1,100,2,124,3,100,3,141,6,83,0,41, + 4,122,130,82,101,116,117,114,110,32,116,104,101,32,99,111, + 100,101,32,111,98,106,101,99,116,32,99,111,109,112,105,108, + 101,100,32,102,114,111,109,32,115,111,117,114,99,101,46,10, + 10,32,32,32,32,32,32,32,32,84,104,101,32,39,100,97, + 116,97,39,32,97,114,103,117,109,101,110,116,32,99,97,110, + 32,98,101,32,97,110,121,32,111,98,106,101,99,116,32,116, + 121,112,101,32,116,104,97,116,32,99,111,109,112,105,108,101, + 40,41,32,115,117,112,112,111,114,116,115,46,10,32,32,32, + 32,32,32,32,32,114,215,0,0,0,84,41,2,218,12,100, + 111,110,116,95,105,110,104,101,114,105,116,114,83,0,0,0, + 41,3,114,134,0,0,0,114,214,0,0,0,218,7,99,111, + 109,112,105,108,101,41,4,114,118,0,0,0,114,25,0,0, + 0,114,43,0,0,0,114,230,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,115,111,117,114, + 99,101,95,116,111,95,99,111,100,101,79,3,0,0,115,8, + 0,0,0,0,5,12,1,2,0,2,255,122,27,83,111,117, + 114,99,101,76,111,97,100,101,114,46,115,111,117,114,99,101, + 95,116,111,95,99,111,100,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,15,0,0,0,9,0,0,0,67,0,0, + 0,115,24,2,0,0,124,0,160,0,124,1,161,1,125,2, + 100,1,125,3,100,1,125,4,100,1,125,5,100,2,125,6, + 100,3,125,7,122,12,116,1,124,2,131,1,125,8,87,0, + 110,24,4,0,116,2,121,66,1,0,1,0,1,0,100,1, + 125,8,89,0,144,1,110,42,48,0,122,14,124,0,160,3, + 124,2,161,1,125,9,87,0,110,20,4,0,116,4,121,102, + 1,0,1,0,1,0,89,0,144,1,110,6,48,0,116,5, + 124,9,100,4,25,0,131,1,125,3,122,14,124,0,160,6, + 124,8,161,1,125,10,87,0,110,18,4,0,116,4,121,148, + 1,0,1,0,1,0,89,0,110,216,48,0,124,1,124,8, + 100,5,156,2,125,11,122,148,116,7,124,10,124,1,124,11, + 131,3,125,12,116,8,124,10,131,1,100,6,100,1,133,2, + 25,0,125,13,124,12,100,7,64,0,100,8,107,3,125,6, + 124,6,144,1,114,30,124,12,100,9,64,0,100,8,107,3, + 125,7,116,9,106,10,100,10,107,3,144,1,114,50,124,7, + 115,248,116,9,106,10,100,11,107,2,144,1,114,50,124,0, + 160,6,124,2,161,1,125,4,116,9,160,11,116,12,124,4, + 161,2,125,5,116,13,124,10,124,5,124,1,124,11,131,4, + 1,0,110,20,116,14,124,10,124,3,124,9,100,12,25,0, + 124,1,124,11,131,5,1,0,87,0,110,24,4,0,116,15, + 116,16,102,2,144,1,121,76,1,0,1,0,1,0,89,0, + 110,32,48,0,116,17,160,18,100,13,124,8,124,2,161,3, + 1,0,116,19,124,13,124,1,124,8,124,2,100,14,141,4, + 83,0,124,4,100,1,117,0,144,1,114,128,124,0,160,6, + 124,2,161,1,125,4,124,0,160,20,124,4,124,2,161,2, + 125,14,116,17,160,18,100,15,124,2,161,2,1,0,116,21, + 106,22,144,2,115,20,124,8,100,1,117,1,144,2,114,20, + 124,3,100,1,117,1,144,2,114,20,124,6,144,1,114,220, + 124,5,100,1,117,0,144,1,114,206,116,9,160,11,124,4, + 161,1,125,5,116,23,124,14,124,5,124,7,131,3,125,10, + 110,16,116,24,124,14,124,3,116,25,124,4,131,1,131,3, + 125,10,122,18,124,0,160,26,124,2,124,8,124,10,161,3, + 1,0,87,0,110,20,4,0,116,2,144,2,121,18,1,0, + 1,0,1,0,89,0,110,2,48,0,124,14,83,0,41,16, + 122,190,67,111,110,99,114,101,116,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, + 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,99, + 111,100,101,46,10,10,32,32,32,32,32,32,32,32,82,101, + 97,100,105,110,103,32,111,102,32,98,121,116,101,99,111,100, + 101,32,114,101,113,117,105,114,101,115,32,112,97,116,104,95, + 115,116,97,116,115,32,116,111,32,98,101,32,105,109,112,108, + 101,109,101,110,116,101,100,46,32,84,111,32,119,114,105,116, + 101,10,32,32,32,32,32,32,32,32,98,121,116,101,99,111, + 100,101,44,32,115,101,116,95,100,97,116,97,32,109,117,115, + 116,32,97,108,115,111,32,98,101,32,105,109,112,108,101,109, + 101,110,116,101,100,46,10,10,32,32,32,32,32,32,32,32, + 78,70,84,114,169,0,0,0,114,159,0,0,0,114,145,0, + 0,0,114,38,0,0,0,114,72,0,0,0,114,27,0,0, + 0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,115, + 218,4,115,105,122,101,122,13,123,125,32,109,97,116,99,104, + 101,115,32,123,125,41,3,114,116,0,0,0,114,106,0,0, + 0,114,107,0,0,0,122,19,99,111,100,101,32,111,98,106, + 101,99,116,32,102,114,111,109,32,123,125,41,27,114,179,0, + 0,0,114,97,0,0,0,114,81,0,0,0,114,224,0,0, + 0,114,49,0,0,0,114,17,0,0,0,114,227,0,0,0, + 114,152,0,0,0,218,10,109,101,109,111,114,121,118,105,101, + 119,114,163,0,0,0,90,21,99,104,101,99,107,95,104,97, + 115,104,95,98,97,115,101,100,95,112,121,99,115,114,157,0, + 0,0,218,17,95,82,65,87,95,77,65,71,73,67,95,78, + 85,77,66,69,82,114,158,0,0,0,114,156,0,0,0,114, + 117,0,0,0,114,150,0,0,0,114,134,0,0,0,114,149, + 0,0,0,114,165,0,0,0,114,233,0,0,0,114,8,0, + 0,0,218,19,100,111,110,116,95,119,114,105,116,101,95,98, + 121,116,101,99,111,100,101,114,171,0,0,0,114,170,0,0, + 0,114,22,0,0,0,114,226,0,0,0,41,15,114,118,0, + 0,0,114,139,0,0,0,114,107,0,0,0,114,154,0,0, + 0,114,174,0,0,0,114,157,0,0,0,90,10,104,97,115, + 104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,115, + 111,117,114,99,101,114,106,0,0,0,218,2,115,116,114,25, + 0,0,0,114,151,0,0,0,114,82,0,0,0,90,10,98, + 121,116,101,115,95,100,97,116,97,90,11,99,111,100,101,95, + 111,98,106,101,99,116,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,213,0,0,0,87,3,0,0,115,152, + 0,0,0,0,7,10,1,4,1,4,1,4,1,4,1,4, + 1,2,1,12,1,12,1,12,2,2,1,14,1,12,1,8, + 2,12,1,2,1,14,1,12,1,6,3,2,1,2,254,6, + 4,2,1,12,1,16,1,12,1,6,1,12,1,12,1,2, + 255,2,2,8,254,4,3,10,1,4,1,2,1,2,254,4, + 4,8,1,2,255,6,3,2,1,2,1,2,1,6,1,2, + 1,2,251,8,7,18,1,6,2,8,1,2,255,4,2,6, + 1,2,1,2,254,6,3,10,1,10,1,12,1,12,1,18, + 1,6,255,4,2,6,1,10,1,10,1,14,2,6,1,6, + 255,4,2,2,1,18,1,14,1,6,1,122,21,83,111,117, + 114,99,101,76,111,97,100,101,114,46,103,101,116,95,99,111, + 100,101,78,41,10,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,223,0,0,0,114,224,0,0,0,114,226, + 0,0,0,114,225,0,0,0,114,229,0,0,0,114,233,0, + 0,0,114,213,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,221,0,0,0, + 28,3,0,0,115,14,0,0,0,8,2,8,8,8,14,8, + 10,8,7,8,10,14,8,114,221,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,0,0,0,0,115,124,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,100,7,132,0,90,6,101,7, + 135,0,102,1,100,8,100,9,132,8,131,1,90,8,101,7, + 100,10,100,11,132,0,131,1,90,9,100,12,100,13,132,0, + 90,10,101,7,100,14,100,15,132,0,131,1,90,11,100,16, + 100,17,132,0,90,12,100,18,100,19,132,0,90,13,100,20, + 100,21,132,0,90,14,100,22,100,23,132,0,90,15,135,0, + 4,0,90,16,83,0,41,24,218,10,70,105,108,101,76,111, + 97,100,101,114,122,103,66,97,115,101,32,102,105,108,101,32, + 108,111,97,100,101,114,32,99,108,97,115,115,32,119,104,105, + 99,104,32,105,109,112,108,101,109,101,110,116,115,32,116,104, + 101,32,108,111,97,100,101,114,32,112,114,111,116,111,99,111, + 108,32,109,101,116,104,111,100,115,32,116,104,97,116,10,32, + 32,32,32,114,101,113,117,105,114,101,32,102,105,108,101,32, + 115,121,115,116,101,109,32,117,115,97,103,101,46,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, + 0,124,2,124,0,95,1,100,1,83,0,41,2,122,75,67, + 97,99,104,101,32,116,104,101,32,109,111,100,117,108,101,32, + 110,97,109,101,32,97,110,100,32,116,104,101,32,112,97,116, + 104,32,116,111,32,116,104,101,32,102,105,108,101,32,102,111, + 117,110,100,32,98,121,32,116,104,101,10,32,32,32,32,32, + 32,32,32,102,105,110,100,101,114,46,78,114,159,0,0,0, + 41,3,114,118,0,0,0,114,139,0,0,0,114,43,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,209,0,0,0,177,3,0,0,115,4,0,0,0,0,3, + 6,1,122,19,70,105,108,101,76,111,97,100,101,114,46,95, + 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,24,0,0,0,124,0,106,0,124,1,106,0,107,2,111, + 22,124,0,106,1,124,1,106,1,107,2,83,0,114,109,0, + 0,0,169,2,218,9,95,95,99,108,97,115,115,95,95,114, + 131,0,0,0,169,2,114,118,0,0,0,90,5,111,116,104, + 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,6,95,95,101,113,95,95,183,3,0,0,115,6,0, + 0,0,0,1,12,1,10,255,122,17,70,105,108,101,76,111, + 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, + 1,116,0,124,0,106,2,131,1,65,0,83,0,114,109,0, + 0,0,169,3,218,4,104,97,115,104,114,116,0,0,0,114, + 43,0,0,0,169,1,114,118,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,8,95,95,104,97, + 115,104,95,95,187,3,0,0,115,2,0,0,0,0,1,122, + 19,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, + 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,3,0,0,0,115,16,0, + 0,0,116,0,116,1,124,0,131,2,160,2,124,1,161,1, + 83,0,41,1,122,100,76,111,97,100,32,97,32,109,111,100, + 117,108,101,32,102,114,111,109,32,97,32,102,105,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,41,3,218,5,115,117, + 112,101,114,114,239,0,0,0,114,220,0,0,0,114,219,0, + 0,0,169,1,114,241,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,220,0,0,0,190,3,0,0,115,2,0,0, + 0,0,10,122,22,70,105,108,101,76,111,97,100,101,114,46, + 108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,169, + 1,122,58,82,101,116,117,114,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,101, + 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, + 121,32,116,104,101,32,102,105,110,100,101,114,46,114,47,0, + 0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,179,0,0,0,202,3,0,0,115, + 2,0,0,0,0,3,122,23,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, + 0,116,1,116,2,102,2,131,2,114,70,116,3,160,4,116, + 5,124,1,131,1,161,1,143,24,125,2,124,2,160,6,161, + 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,49,0,115,58,48,0,1,0,1,0,1,0,89,0,1, + 0,110,52,116,3,160,7,124,1,100,2,161,2,143,24,125, + 2,124,2,160,6,161,0,87,0,2,0,100,1,4,0,4, + 0,131,3,1,0,83,0,49,0,115,112,48,0,1,0,1, + 0,1,0,89,0,1,0,100,1,83,0,41,3,122,39,82, + 101,116,117,114,110,32,116,104,101,32,100,97,116,97,32,102, + 114,111,109,32,112,97,116,104,32,97,115,32,114,97,119,32, + 98,121,116,101,115,46,78,218,1,114,41,8,114,161,0,0, + 0,114,221,0,0,0,218,19,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,114,63,0,0,0, + 90,9,111,112,101,110,95,99,111,100,101,114,84,0,0,0, + 90,4,114,101,97,100,114,64,0,0,0,41,3,114,118,0, + 0,0,114,43,0,0,0,114,67,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,227,0,0,0, + 207,3,0,0,115,10,0,0,0,0,2,14,1,16,1,40, + 2,14,1,122,19,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,18,0,0,0,124,0,160,0,124,1,161,1,114,14, + 124,0,83,0,100,0,83,0,114,109,0,0,0,41,1,114, + 182,0,0,0,169,2,114,118,0,0,0,114,216,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 6,95,95,101,113,95,95,181,3,0,0,115,6,0,0,0, - 0,1,12,1,10,255,122,17,70,105,108,101,76,111,97,100, - 101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,20,0,0,0,116,0,124,0,106,1,131,1,116, - 0,124,0,106,2,131,1,65,0,83,0,114,109,0,0,0, - 169,3,218,4,104,97,115,104,114,116,0,0,0,114,43,0, - 0,0,169,1,114,118,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,104,97,115,104, - 95,95,185,3,0,0,115,2,0,0,0,0,1,122,19,70, - 105,108,101,76,111,97,100,101,114,46,95,95,104,97,115,104, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,3,0,0,0,115,16,0,0,0, - 116,0,116,1,124,0,131,2,160,2,124,1,161,1,83,0, - 41,1,122,100,76,111,97,100,32,97,32,109,111,100,117,108, - 101,32,102,114,111,109,32,97,32,102,105,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,41,3,218,5,115,117,112,101, - 114,114,239,0,0,0,114,220,0,0,0,114,219,0,0,0, - 169,1,114,241,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,220,0,0,0,188,3,0,0,115,2,0,0,0,0, - 10,122,22,70,105,108,101,76,111,97,100,101,114,46,108,111, - 97,100,95,109,111,100,117,108,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,6,0,0,0,124,0,106,0,83,0,169,1,122, - 58,82,101,116,117,114,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,116,104,101,32,115,111,117,114,99,101,32,102, - 105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32, - 116,104,101,32,102,105,110,100,101,114,46,114,47,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,179,0,0,0,200,3,0,0,115,2,0, - 0,0,0,3,122,23,70,105,108,101,76,111,97,100,101,114, - 46,103,101,116,95,102,105,108,101,110,97,109,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, - 0,0,67,0,0,0,115,126,0,0,0,116,0,124,0,116, - 1,116,2,102,2,131,2,114,70,116,3,160,4,116,5,124, - 1,131,1,161,1,143,24,125,2,124,2,160,6,161,0,87, - 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,49, - 0,115,58,48,0,1,0,1,0,1,0,89,0,1,0,110, - 52,116,3,160,7,124,1,100,2,161,2,143,24,125,2,124, - 2,160,6,161,0,87,0,2,0,100,1,4,0,4,0,131, - 3,1,0,83,0,49,0,115,112,48,0,1,0,1,0,1, - 0,89,0,1,0,100,1,83,0,41,3,122,39,82,101,116, - 117,114,110,32,116,104,101,32,100,97,116,97,32,102,114,111, - 109,32,112,97,116,104,32,97,115,32,114,97,119,32,98,121, - 116,101,115,46,78,218,1,114,41,8,114,161,0,0,0,114, - 221,0,0,0,218,19,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,114,63,0,0,0,90,9, - 111,112,101,110,95,99,111,100,101,114,84,0,0,0,90,4, - 114,101,97,100,114,64,0,0,0,41,3,114,118,0,0,0, - 114,43,0,0,0,114,67,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,227,0,0,0,205,3, - 0,0,115,10,0,0,0,0,2,14,1,16,1,40,2,14, - 1,122,19,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,160,0,124,1,161,1,114,14,124,0, - 83,0,100,0,83,0,114,109,0,0,0,41,1,114,182,0, - 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,19,103, - 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,216,3,0,0,115,6,0,0,0,0,2,10,1,4, - 1,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, - 114,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,32,0,0,0,116, - 0,116,1,124,0,106,2,131,1,100,1,25,0,124,1,131, - 2,125,2,116,3,160,4,124,2,100,2,161,2,83,0,41, - 3,78,114,72,0,0,0,114,251,0,0,0,41,5,114,37, - 0,0,0,114,46,0,0,0,114,43,0,0,0,114,63,0, - 0,0,114,64,0,0,0,169,3,114,118,0,0,0,90,8, - 114,101,115,111,117,114,99,101,114,43,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,111,112, - 101,110,95,114,101,115,111,117,114,99,101,222,3,0,0,115, - 4,0,0,0,0,1,20,1,122,24,70,105,108,101,76,111, - 97,100,101,114,46,111,112,101,110,95,114,101,115,111,117,114, - 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,160,0,124,1,161,1,115,14,116,1,130,1,116,2, - 116,3,124,0,106,4,131,1,100,1,25,0,124,1,131,2, - 125,2,124,2,83,0,169,2,78,114,72,0,0,0,41,5, - 218,11,105,115,95,114,101,115,111,117,114,99,101,218,17,70, - 105,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, + 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, + 97,100,101,114,218,3,0,0,115,6,0,0,0,0,2,10, + 1,4,1,122,30,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, + 100,101,114,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,32,0,0, + 0,116,0,116,1,124,0,106,2,131,1,100,1,25,0,124, + 1,131,2,125,2,116,3,160,4,124,2,100,2,161,2,83, + 0,41,3,78,114,72,0,0,0,114,251,0,0,0,41,5, 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, - 255,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, - 116,104,226,3,0,0,115,8,0,0,0,0,1,10,1,4, - 1,20,1,122,24,70,105,108,101,76,111,97,100,101,114,46, - 114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,40,0,0,0,116,0,124,1,118, - 0,114,12,100,1,83,0,116,1,116,2,124,0,106,3,131, - 1,100,2,25,0,124,1,131,2,125,2,116,4,124,2,131, - 1,83,0,41,3,78,70,114,72,0,0,0,41,5,114,34, - 0,0,0,114,37,0,0,0,114,46,0,0,0,114,43,0, - 0,0,114,53,0,0,0,169,3,114,118,0,0,0,114,116, - 0,0,0,114,43,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,2,1,0,0,232,3,0,0, - 115,8,0,0,0,0,1,8,1,4,1,20,1,122,22,70, - 105,108,101,76,111,97,100,101,114,46,105,115,95,114,101,115, - 111,117,114,99,101,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,24, - 0,0,0,116,0,116,1,160,2,116,3,124,0,106,4,131, - 1,100,1,25,0,161,1,131,1,83,0,114,1,1,0,0, - 41,5,218,4,105,116,101,114,114,2,0,0,0,218,7,108, - 105,115,116,100,105,114,114,46,0,0,0,114,43,0,0,0, - 114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,8,99,111,110,116,101,110,116,115,238,3, - 0,0,115,2,0,0,0,0,1,122,19,70,105,108,101,76, - 111,97,100,101,114,46,99,111,110,116,101,110,116,115,41,17, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,247, - 0,0,0,114,136,0,0,0,114,220,0,0,0,114,179,0, - 0,0,114,227,0,0,0,114,254,0,0,0,114,0,1,0, - 0,114,4,1,0,0,114,2,1,0,0,114,8,1,0,0, - 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, - 3,0,0,0,114,3,0,0,0,114,249,0,0,0,114,6, - 0,0,0,114,239,0,0,0,170,3,0,0,115,30,0,0, - 0,8,2,4,3,8,6,8,4,8,3,2,1,14,11,2, - 1,10,4,8,11,2,1,10,5,8,4,8,6,8,6,114, - 239,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,64,0,0,0,115,46,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,156,1,100,8,100,9,132,2,90,6,100,10,83,0, - 41,11,218,16,83,111,117,114,99,101,70,105,108,101,76,111, - 97,100,101,114,122,62,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,83,111,117,114,99,101,76,111,97,100,101,114,32,117,115, - 105,110,103,32,116,104,101,32,102,105,108,101,32,115,121,115, - 116,101,109,46,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,67,0,0,0,115,22,0, - 0,0,116,0,124,1,131,1,125,2,124,2,106,1,124,2, - 106,2,100,1,156,2,83,0,41,2,122,33,82,101,116,117, - 114,110,32,116,104,101,32,109,101,116,97,100,97,116,97,32, - 102,111,114,32,116,104,101,32,112,97,116,104,46,41,2,114, - 169,0,0,0,114,234,0,0,0,41,3,114,48,0,0,0, - 218,8,115,116,95,109,116,105,109,101,90,7,115,116,95,115, - 105,122,101,41,3,114,118,0,0,0,114,43,0,0,0,114, - 238,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,224,0,0,0,246,3,0,0,115,4,0,0, - 0,0,2,8,1,122,27,83,111,117,114,99,101,70,105,108, - 101,76,111,97,100,101,114,46,112,97,116,104,95,115,116,97, - 116,115,99,4,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,5,0,0,0,67,0,0,0,115,24,0,0,0, - 116,0,124,1,131,1,125,4,124,0,106,1,124,2,124,3, - 124,4,100,1,141,3,83,0,41,2,78,169,1,218,5,95, - 109,111,100,101,41,2,114,114,0,0,0,114,225,0,0,0, - 41,5,114,118,0,0,0,114,107,0,0,0,114,106,0,0, - 0,114,25,0,0,0,114,51,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,226,0,0,0,251, - 3,0,0,115,4,0,0,0,0,2,8,1,122,32,83,111, - 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,114,59, - 0,0,0,114,11,1,0,0,99,3,0,0,0,0,0,0, - 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, - 0,115,252,0,0,0,116,0,124,1,131,1,92,2,125,4, - 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, - 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, - 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, - 68,0,93,104,125,7,116,4,124,4,124,7,131,2,125,4, - 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, - 4,0,116,7,121,110,1,0,1,0,1,0,89,0,113,60, - 89,0,113,60,4,0,116,8,121,162,1,0,125,8,1,0, - 122,30,116,9,160,10,100,1,124,4,124,8,161,3,1,0, - 87,0,89,0,100,2,125,8,126,8,1,0,100,2,83,0, - 100,2,125,8,126,8,48,0,48,0,113,60,122,28,116,11, - 124,1,124,2,124,3,131,3,1,0,116,9,160,10,100,3, - 124,1,161,2,1,0,87,0,110,52,4,0,116,8,144,0, - 121,246,1,0,125,8,1,0,122,26,116,9,160,10,100,1, - 124,1,124,8,161,3,1,0,87,0,89,0,100,2,125,8, - 126,8,110,10,100,2,125,8,126,8,48,0,48,0,100,2, - 83,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, - 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, - 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, - 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, - 12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,114, - 46,0,0,0,114,55,0,0,0,114,186,0,0,0,114,41, - 0,0,0,114,37,0,0,0,114,2,0,0,0,90,5,109, - 107,100,105,114,218,15,70,105,108,101,69,120,105,115,116,115, - 69,114,114,111,114,114,49,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,68,0,0,0,41,9,114,118,0,0,0, - 114,43,0,0,0,114,25,0,0,0,114,12,1,0,0,218, - 6,112,97,114,101,110,116,114,96,0,0,0,114,36,0,0, - 0,114,32,0,0,0,114,228,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,225,0,0,0,0, - 4,0,0,115,48,0,0,0,0,2,12,1,4,2,12,1, - 12,1,12,2,12,1,10,1,2,1,14,1,12,2,8,1, - 14,3,6,1,2,0,2,255,4,2,28,1,2,1,12,1, - 16,1,16,2,8,1,2,255,122,25,83,111,117,114,99,101, - 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, - 97,116,97,78,41,7,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, - 226,0,0,0,114,225,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,9,1, - 0,0,242,3,0,0,115,8,0,0,0,8,2,4,2,8, - 5,8,5,114,9,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, - 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, - 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, - 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, - 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, - 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, - 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, - 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, - 4,78,114,159,0,0,0,114,145,0,0,0,41,2,114,116, - 0,0,0,114,106,0,0,0,41,5,114,179,0,0,0,114, - 227,0,0,0,114,152,0,0,0,114,165,0,0,0,114,235, - 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, - 43,0,0,0,114,25,0,0,0,114,151,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, - 0,0,35,4,0,0,115,22,0,0,0,0,1,10,1,10, - 4,2,1,2,254,6,4,12,1,2,1,14,1,2,1,2, - 253,122,29,83,111,117,114,99,101,108,101,115,115,70,105,108, - 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,39,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,229,0,0,0,51,4,0,0, - 115,2,0,0,0,0,2,122,31,83,111,117,114,99,101,108, - 101,115,115,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,115,111,117,114,99,101,78,41,6,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 213,0,0,0,114,229,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,15,1, - 0,0,31,4,0,0,115,6,0,0,0,8,2,4,2,8, - 16,114,15,1,0,0,99,0,0,0,0,0,0,0,0,0, + 63,0,0,0,114,64,0,0,0,169,3,114,118,0,0,0, + 90,8,114,101,115,111,117,114,99,101,114,43,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, + 111,112,101,110,95,114,101,115,111,117,114,99,101,224,3,0, + 0,115,4,0,0,0,0,1,20,1,122,24,70,105,108,101, + 76,111,97,100,101,114,46,111,112,101,110,95,114,101,115,111, + 117,114,99,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,3,0,0,0,67,0,0,0,115,38,0, + 0,0,124,0,160,0,124,1,161,1,115,14,116,1,130,1, + 116,2,116,3,124,0,106,4,131,1,100,1,25,0,124,1, + 131,2,125,2,124,2,83,0,169,2,78,114,72,0,0,0, + 41,5,218,11,105,115,95,114,101,115,111,117,114,99,101,218, + 17,70,105,108,101,78,111,116,70,111,117,110,100,69,114,114, + 111,114,114,37,0,0,0,114,46,0,0,0,114,43,0,0, + 0,114,255,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,13,114,101,115,111,117,114,99,101,95, + 112,97,116,104,228,3,0,0,115,8,0,0,0,0,1,10, + 1,4,1,20,1,122,24,70,105,108,101,76,111,97,100,101, + 114,46,114,101,115,111,117,114,99,101,95,112,97,116,104,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,40,0,0,0,116,0,124, + 1,118,0,114,12,100,1,83,0,116,1,116,2,124,0,106, + 3,131,1,100,2,25,0,124,1,131,2,125,2,116,4,124, + 2,131,1,83,0,41,3,78,70,114,72,0,0,0,41,5, + 114,34,0,0,0,114,37,0,0,0,114,46,0,0,0,114, + 43,0,0,0,114,53,0,0,0,169,3,114,118,0,0,0, + 114,116,0,0,0,114,43,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,2,1,0,0,234,3, + 0,0,115,8,0,0,0,0,1,8,1,4,1,20,1,122, + 22,70,105,108,101,76,111,97,100,101,114,46,105,115,95,114, + 101,115,111,117,114,99,101,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, + 115,24,0,0,0,116,0,116,1,160,2,116,3,124,0,106, + 4,131,1,100,1,25,0,161,1,131,1,83,0,114,1,1, + 0,0,41,5,218,4,105,116,101,114,114,2,0,0,0,218, + 7,108,105,115,116,100,105,114,114,46,0,0,0,114,43,0, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,8,99,111,110,116,101,110,116,115, + 240,3,0,0,115,2,0,0,0,0,1,122,19,70,105,108, + 101,76,111,97,100,101,114,46,99,111,110,116,101,110,116,115, + 41,17,114,125,0,0,0,114,124,0,0,0,114,126,0,0, + 0,114,127,0,0,0,114,209,0,0,0,114,243,0,0,0, + 114,247,0,0,0,114,136,0,0,0,114,220,0,0,0,114, + 179,0,0,0,114,227,0,0,0,114,254,0,0,0,114,0, + 1,0,0,114,4,1,0,0,114,2,1,0,0,114,8,1, + 0,0,90,13,95,95,99,108,97,115,115,99,101,108,108,95, + 95,114,3,0,0,0,114,3,0,0,0,114,249,0,0,0, + 114,6,0,0,0,114,239,0,0,0,172,3,0,0,115,30, + 0,0,0,8,2,4,3,8,6,8,4,8,3,2,1,14, + 11,2,1,10,4,8,11,2,1,10,5,8,4,8,6,8, + 6,114,239,0,0,0,99,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 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,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, - 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, - 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, - 41,21,114,252,0,0,0,122,93,76,111,97,100,101,114,32, - 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, - 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, - 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, - 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, - 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 100,0,83,0,114,109,0,0,0,114,159,0,0,0,114,5, - 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,68,4,0,0,115,4,0,0,0, - 0,1,6,1,122,28,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,116, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, - 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, - 124,1,106,1,107,2,83,0,114,109,0,0,0,114,240,0, - 0,0,114,242,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,243,0,0,0,72,4,0,0,115, - 6,0,0,0,0,1,12,1,10,255,122,26,69,120,116,101, + 100,6,100,7,156,1,100,8,100,9,132,2,90,6,100,10, + 83,0,41,11,218,16,83,111,117,114,99,101,70,105,108,101, + 76,111,97,100,101,114,122,62,67,111,110,99,114,101,116,101, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 111,102,32,83,111,117,114,99,101,76,111,97,100,101,114,32, + 117,115,105,110,103,32,116,104,101,32,102,105,108,101,32,115, + 121,115,116,101,109,46,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, + 22,0,0,0,116,0,124,1,131,1,125,2,124,2,106,1, + 124,2,106,2,100,1,156,2,83,0,41,2,122,33,82,101, + 116,117,114,110,32,116,104,101,32,109,101,116,97,100,97,116, + 97,32,102,111,114,32,116,104,101,32,112,97,116,104,46,41, + 2,114,169,0,0,0,114,234,0,0,0,41,3,114,48,0, + 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, + 95,115,105,122,101,41,3,114,118,0,0,0,114,43,0,0, + 0,114,238,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,224,0,0,0,248,3,0,0,115,4, + 0,0,0,0,2,8,1,122,27,83,111,117,114,99,101,70, + 105,108,101,76,111,97,100,101,114,46,112,97,116,104,95,115, + 116,97,116,115,99,4,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,5,0,0,0,67,0,0,0,115,24,0, + 0,0,116,0,124,1,131,1,125,4,124,0,106,1,124,2, + 124,3,124,4,100,1,141,3,83,0,41,2,78,169,1,218, + 5,95,109,111,100,101,41,2,114,114,0,0,0,114,225,0, + 0,0,41,5,114,118,0,0,0,114,107,0,0,0,114,106, + 0,0,0,114,25,0,0,0,114,51,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,226,0,0, + 0,253,3,0,0,115,4,0,0,0,0,2,8,1,122,32, + 83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,114, + 46,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, + 114,59,0,0,0,114,11,1,0,0,99,3,0,0,0,0, + 0,0,0,1,0,0,0,9,0,0,0,11,0,0,0,67, + 0,0,0,115,252,0,0,0,116,0,124,1,131,1,92,2, + 125,4,125,5,103,0,125,6,124,4,114,52,116,1,124,4, + 131,1,115,52,116,0,124,4,131,1,92,2,125,4,125,7, + 124,6,160,2,124,7,161,1,1,0,113,16,116,3,124,6, + 131,1,68,0,93,104,125,7,116,4,124,4,124,7,131,2, + 125,4,122,14,116,5,160,6,124,4,161,1,1,0,87,0, + 113,60,4,0,116,7,121,110,1,0,1,0,1,0,89,0, + 113,60,89,0,113,60,4,0,116,8,121,162,1,0,125,8, + 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, + 1,0,87,0,89,0,100,2,125,8,126,8,1,0,100,2, + 83,0,100,2,125,8,126,8,48,0,48,0,113,60,122,28, + 116,11,124,1,124,2,124,3,131,3,1,0,116,9,160,10, + 100,3,124,1,161,2,1,0,87,0,110,52,4,0,116,8, + 144,0,121,246,1,0,125,8,1,0,122,26,116,9,160,10, + 100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,2, + 125,8,126,8,110,10,100,2,125,8,126,8,48,0,48,0, + 100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121, + 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, + 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, + 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, + 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, + 12,114,46,0,0,0,114,55,0,0,0,114,186,0,0,0, + 114,41,0,0,0,114,37,0,0,0,114,2,0,0,0,90, + 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, + 116,115,69,114,114,111,114,114,49,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,68,0,0,0,41,9,114,118,0, + 0,0,114,43,0,0,0,114,25,0,0,0,114,12,1,0, + 0,218,6,112,97,114,101,110,116,114,96,0,0,0,114,36, + 0,0,0,114,32,0,0,0,114,228,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, + 0,2,4,0,0,115,48,0,0,0,0,2,12,1,4,2, + 12,1,12,1,12,2,12,1,10,1,2,1,14,1,12,2, + 8,1,14,3,6,1,2,0,2,255,4,2,28,1,2,1, + 12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116, + 95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0, + 0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0, + 0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 9,1,0,0,244,3,0,0,115,8,0,0,0,8,2,4, + 2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, + 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, + 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, + 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, + 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, + 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, + 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, + 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, + 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, + 0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2, + 114,116,0,0,0,114,106,0,0,0,41,5,114,179,0,0, + 0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0, + 114,235,0,0,0,41,5,114,118,0,0,0,114,139,0,0, + 0,114,43,0,0,0,114,25,0,0,0,114,151,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 213,0,0,0,37,4,0,0,115,22,0,0,0,0,1,10, + 1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2, + 1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111, + 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, + 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, + 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,229,0,0,0,53,4, + 0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99, + 101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46, + 103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0, + 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, + 0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 15,1,0,0,33,4,0,0,115,6,0,0,0,8,2,4, + 2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, + 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, + 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, + 90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20, + 83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101, + 114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104, + 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115, + 32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114, + 107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101, + 114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,100,0,83,0,114,109,0,0,0,114,159,0,0,0, + 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,209,0,0,0,70,4,0,0,115,4,0, + 0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110, + 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0, + 0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0, + 106,1,124,1,106,1,107,2,83,0,114,109,0,0,0,114, + 240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,243,0,0,0,74,4,0, + 0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, + 124,0,106,2,131,1,65,0,83,0,114,109,0,0,0,114, + 244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,247,0,0,0,78,4,0, + 0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, + 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, + 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, + 125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6, + 161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97, + 116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101, + 100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100, + 32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0, + 0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101, + 97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0, + 114,116,0,0,0,114,43,0,0,0,41,3,114,118,0,0, + 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,81, + 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, + 4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, - 106,2,131,1,65,0,83,0,114,109,0,0,0,114,244,0, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,247,0,0,0,76,4,0,0,115, - 2,0,0,0,0,1,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, - 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, - 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, - 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, - 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101, - 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, + 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, + 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, + 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, + 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, + 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, + 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, + 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, + 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, + 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, + 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, + 114,116,0,0,0,114,43,0,0,0,114,253,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, + 0,0,0,89,4,0,0,115,10,0,0,0,0,2,14,1, + 6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111, + 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, + 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, + 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, + 3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116, + 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, - 114,111,109,32,123,33,114,125,41,7,114,134,0,0,0,114, - 214,0,0,0,114,163,0,0,0,90,14,99,114,101,97,116, - 101,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, - 0,0,0,114,43,0,0,0,41,3,114,118,0,0,0,114, - 187,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,212,0,0,0,79,4,0, - 0,115,18,0,0,0,0,2,4,1,4,0,2,255,4,2, - 6,1,4,0,4,255,4,2,122,33,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,99,114, - 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0, - 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106, - 3,124,1,161,2,1,0,116,0,160,4,100,1,124,0,106, - 5,124,0,106,6,161,3,1,0,100,2,83,0,41,3,122, - 30,73,110,105,116,105,97,108,105,122,101,32,97,110,32,101, - 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,122, - 40,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,123,33,114,125,32,101,120,101,99,117,116,101,100,32, - 102,114,111,109,32,123,33,114,125,78,41,7,114,134,0,0, - 0,114,214,0,0,0,114,163,0,0,0,90,12,101,120,101, - 99,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, - 0,0,0,114,43,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,87,4,0,0,115,10,0,0,0,0,2,14,1,6,1, - 4,0,4,255,122,31,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, - 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, - 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, - 0,131,1,131,1,83,0,41,4,122,49,82,101,116,117,114, - 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,114,38,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, - 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, - 0,1,0,113,2,100,1,83,0,41,2,114,209,0,0,0, - 78,114,3,0,0,0,169,2,114,31,0,0,0,218,6,115, - 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, - 109,101,114,3,0,0,0,114,6,0,0,0,218,9,60,103, - 101,110,101,120,112,114,62,96,4,0,0,115,4,0,0,0, - 4,1,2,255,122,49,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,99, - 107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,41,4,114,46,0,0,0,114,43, - 0,0,0,218,3,97,110,121,218,18,69,88,84,69,78,83, - 73,79,78,95,83,85,70,70,73,88,69,83,114,219,0,0, - 0,114,3,0,0,0,114,18,1,0,0,114,6,0,0,0, - 114,182,0,0,0,93,4,0,0,115,8,0,0,0,0,2, - 14,1,12,1,2,255,122,30,69,120,116,101,110,115,105,111, + 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,38, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, + 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, + 2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0, + 0,0,78,114,3,0,0,0,169,2,114,31,0,0,0,218, + 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, + 110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9, + 60,103,101,110,101,120,112,114,62,98,4,0,0,115,4,0, + 0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,63,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,97,110,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,99, - 97,110,110,111,116,32,99,114,101,97,116,101,32,97,32,99, - 111,100,101,32,111,98,106,101,99,116,46,78,114,3,0,0, - 0,114,219,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,213,0,0,0,99,4,0,0,115,2, - 0,0,0,0,2,122,28,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99, - 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,53,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,115,32,104,97,118,101,32,110, - 111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, - 3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,229,0,0,0,103,4,0, - 0,115,2,0,0,0,0,2,122,30,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,0, + 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,46,0,0,0, + 114,43,0,0,0,218,3,97,110,121,218,18,69,88,84,69, + 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219, + 0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0, + 0,0,114,182,0,0,0,95,4,0,0,115,8,0,0,0, + 0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115, + 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0, 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,6,0,0,0,124,0,106,0,83,0,114,250,0,0, - 0,114,47,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,107, - 4,0,0,115,2,0,0,0,0,3,122,32,69,120,116,101, + 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, + 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, + 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, + 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3, + 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,101,4,0,0, + 115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105, + 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, + 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,101, + 32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46, + 78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,105, + 4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,209,0,0,0,114,243,0,0,0,114,247,0, - 0,0,114,212,0,0,0,114,217,0,0,0,114,182,0,0, - 0,114,213,0,0,0,114,229,0,0,0,114,136,0,0,0, - 114,179,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,252,0,0,0,60,4, - 0,0,115,22,0,0,0,8,2,4,6,8,4,8,4,8, - 3,8,8,8,6,8,6,8,4,8,4,2,1,114,252,0, + 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250, + 0,0,0,114,47,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, + 0,109,4,0,0,115,2,0,0,0,0,3,122,32,69,120, + 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, + 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, + 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, + 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, + 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, + 0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, + 62,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8, + 4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114, + 252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, + 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, + 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, + 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, + 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, + 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, + 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, + 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, + 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, + 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, + 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, + 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, + 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, + 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, + 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, + 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, + 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, + 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, + 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, + 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, + 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, + 3,124,0,95,5,100,0,83,0,114,109,0,0,0,41,6, + 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,111, + 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, + 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, + 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, + 102,105,110,100,101,114,169,4,114,118,0,0,0,114,116,0, + 0,0,114,43,0,0,0,90,11,112,97,116,104,95,102,105, + 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,209,0,0,0,122,4,0,0,115,8,0,0, + 0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, + 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, + 100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110, + 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, + 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, + 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, + 116,114,45,110,97,109,101,41,114,70,0,0,0,114,39,0, + 0,0,41,2,114,8,0,0,0,114,43,0,0,0,90,8, + 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, + 40,0,0,0,41,4,114,118,0,0,0,114,14,1,0,0, + 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, + 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, + 115,128,4,0,0,115,8,0,0,0,0,2,18,1,8,2, + 4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95, + 112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2, + 125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2, + 131,2,83,0,114,109,0,0,0,41,4,114,30,1,0,0, + 114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117, + 108,101,115,41,3,114,118,0,0,0,90,18,112,97,114,101, + 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, + 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, + 0,0,138,4,0,0,115,4,0,0,0,0,1,12,1,122, + 31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0, + 124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2, + 107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2, + 125,2,124,2,100,0,117,1,114,68,124,2,106,5,100,0, + 117,0,114,68,124,2,106,6,114,68,124,2,106,6,124,0, + 95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,109, + 0,0,0,41,8,114,111,0,0,0,114,25,1,0,0,114, + 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, + 0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114, + 118,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116, + 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, + 97,116,101,142,4,0,0,115,16,0,0,0,0,2,12,1, + 10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101, + 99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, + 1,83,0,114,109,0,0,0,41,2,114,6,1,0,0,114, + 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, + 95,95,155,4,0,0,115,2,0,0,0,0,1,122,23,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, + 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, + 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, + 114,109,0,0,0,169,1,114,32,1,0,0,41,2,114,118, + 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, + 105,116,101,109,95,95,158,4,0,0,115,2,0,0,0,0, + 1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106, + 0,124,1,60,0,100,0,83,0,114,109,0,0,0,41,1, + 114,24,1,0,0,41,3,114,118,0,0,0,114,35,1,0, + 0,114,43,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, + 95,95,161,4,0,0,115,2,0,0,0,0,1,122,26,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, + 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, + 1,83,0,114,109,0,0,0,41,2,114,22,0,0,0,114, + 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, + 95,164,4,0,0,115,2,0,0,0,0,1,122,22,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108, + 101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, + 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,40,123,33,114,125,41,41,2,114,61,0,0,0,114,24, + 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, + 95,167,4,0,0,115,2,0,0,0,0,1,122,23,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114, + 101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, + 0,0,0,124,1,124,0,160,0,161,0,118,0,83,0,114, + 109,0,0,0,114,34,1,0,0,169,2,114,118,0,0,0, + 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, + 115,95,95,170,4,0,0,115,2,0,0,0,0,1,122,27, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, + 95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, + 1,161,1,1,0,100,0,83,0,114,109,0,0,0,41,2, + 114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, + 0,0,0,173,4,0,0,115,2,0,0,0,0,1,122,21, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, + 112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0, + 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, + 0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0, + 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, + 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,22,1,0,0,115,4,0,0, + 115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8, + 13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,104,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, - 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, - 132,0,90,10,100,16,100,17,132,0,90,11,100,18,100,19, - 132,0,90,12,100,20,100,21,132,0,90,13,100,22,100,23, - 132,0,90,14,100,24,83,0,41,25,218,14,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,97,38,1,0,0,82, - 101,112,114,101,115,101,110,116,115,32,97,32,110,97,109,101, - 115,112,97,99,101,32,112,97,99,107,97,103,101,39,115,32, - 112,97,116,104,46,32,32,73,116,32,117,115,101,115,32,116, - 104,101,32,109,111,100,117,108,101,32,110,97,109,101,10,32, - 32,32,32,116,111,32,102,105,110,100,32,105,116,115,32,112, - 97,114,101,110,116,32,109,111,100,117,108,101,44,32,97,110, - 100,32,102,114,111,109,32,116,104,101,114,101,32,105,116,32, - 108,111,111,107,115,32,117,112,32,116,104,101,32,112,97,114, - 101,110,116,39,115,10,32,32,32,32,95,95,112,97,116,104, - 95,95,46,32,32,87,104,101,110,32,116,104,105,115,32,99, - 104,97,110,103,101,115,44,32,116,104,101,32,109,111,100,117, - 108,101,39,115,32,111,119,110,32,112,97,116,104,32,105,115, - 32,114,101,99,111,109,112,117,116,101,100,44,10,32,32,32, - 32,117,115,105,110,103,32,112,97,116,104,95,102,105,110,100, - 101,114,46,32,32,70,111,114,32,116,111,112,45,108,101,118, - 101,108,32,109,111,100,117,108,101,115,44,32,116,104,101,32, - 112,97,114,101,110,116,32,109,111,100,117,108,101,39,115,32, - 112,97,116,104,10,32,32,32,32,105,115,32,115,121,115,46, - 112,97,116,104,46,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,36, - 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116, - 2,124,0,160,3,161,0,131,1,124,0,95,4,124,3,124, - 0,95,5,100,0,83,0,114,109,0,0,0,41,6,218,5, - 95,110,97,109,101,218,5,95,112,97,116,104,114,111,0,0, - 0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,112, - 97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,110, - 116,95,112,97,116,104,218,12,95,112,97,116,104,95,102,105, - 110,100,101,114,169,4,114,118,0,0,0,114,116,0,0,0, - 114,43,0,0,0,90,11,112,97,116,104,95,102,105,110,100, + 0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0, + 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, + 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6, + 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10, + 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14, + 132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0, + 41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0, + 0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1, + 100,0,83,0,114,109,0,0,0,41,2,114,22,1,0,0, + 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,209,0,0,0,179,4, + 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, + 115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110, + 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, + 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, + 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, + 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, + 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, + 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, + 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, + 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, + 41,2,114,61,0,0,0,114,125,0,0,0,41,2,114,193, + 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, + 114,101,112,114,182,4,0,0,115,2,0,0,0,0,7,122, + 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, + 0,191,4,0,0,115,2,0,0,0,0,1,122,27,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, + 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,39, + 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, + 0,194,4,0,0,115,2,0,0,0,0,1,122,27,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, + 0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100, + 4,100,5,141,4,83,0,41,6,78,114,39,0,0,0,122, + 8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41, + 1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,213,0,0,0,197,4,0,0,115,2,0,0,0,0, + 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210, + 0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, + 0,200,4,0,0,115,2,0,0,0,0,1,122,30,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,109, + 0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, + 0,203,4,0,0,115,2,0,0,0,0,1,122,28,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, + 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, + 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, + 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, + 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, + 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, + 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, + 41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0, + 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,206, + 4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2, + 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41, + 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114, + 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, + 0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,43,1,0,0,178,4,0,0,115,18,0,0,0,8, + 1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8, + 3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, + 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, + 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, + 101,4,100,19,100,11,100,12,132,1,131,1,90,9,101,4, + 100,20,100,13,100,14,132,1,131,1,90,10,101,4,100,21, + 100,15,100,16,132,1,131,1,90,11,101,4,100,17,100,18, + 132,0,131,1,90,12,100,10,83,0,41,22,218,10,80,97, + 116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,112, + 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,115, + 121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,107, + 97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,116, + 114,105,98,117,116,101,115,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,64,0,0,0,116,0,116,1,106,2,160,3,161,0, + 131,1,68,0,93,44,92,2,125,1,125,2,124,2,100,1, + 117,0,114,40,116,1,106,2,124,1,61,0,113,14,116,4, + 124,2,100,2,131,2,114,14,124,2,160,5,161,0,1,0, + 113,14,100,1,83,0,41,3,122,125,67,97,108,108,32,116, + 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, + 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, + 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, + 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, + 101,110,116,101,100,41,46,78,218,17,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,41,6,218,4,108, + 105,115,116,114,8,0,0,0,218,19,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,218,5,105, + 116,101,109,115,114,128,0,0,0,114,46,1,0,0,41,3, + 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,209,0,0,0,120,4,0,0,115,8,0,0,0,0, - 1,6,1,6,1,14,1,122,23,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,105,110,105,116,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 106,0,160,1,100,1,161,1,92,3,125,1,125,2,125,3, - 124,2,100,2,107,2,114,30,100,3,83,0,124,1,100,4, - 102,2,83,0,41,5,122,62,82,101,116,117,114,110,115,32, - 97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,101, - 110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,32, - 112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,114, - 45,110,97,109,101,41,114,70,0,0,0,114,39,0,0,0, - 41,2,114,8,0,0,0,114,43,0,0,0,90,8,95,95, - 112,97,116,104,95,95,41,2,114,23,1,0,0,114,40,0, - 0,0,41,4,114,118,0,0,0,114,14,1,0,0,218,3, - 100,111,116,90,2,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,23,95,102,105,110,100,95,112,97, - 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,126, - 4,0,0,115,8,0,0,0,0,2,18,1,8,2,4,3, - 122,38,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 46,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97, - 116,104,95,110,97,109,101,115,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,28,0,0,0,124,0,160,0,161,0,92,2,125,1, - 125,2,116,1,116,2,106,3,124,1,25,0,124,2,131,2, - 83,0,114,109,0,0,0,41,4,114,30,1,0,0,114,130, - 0,0,0,114,8,0,0,0,218,7,109,111,100,117,108,101, - 115,41,3,114,118,0,0,0,90,18,112,97,114,101,110,116, - 95,109,111,100,117,108,101,95,110,97,109,101,90,14,112,97, - 116,104,95,97,116,116,114,95,110,97,109,101,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,25,1,0,0, - 136,4,0,0,115,4,0,0,0,0,1,12,1,122,31,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,103, - 101,116,95,112,97,114,101,110,116,95,112,97,116,104,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,80,0,0,0,116,0,124,0, - 160,1,161,0,131,1,125,1,124,1,124,0,106,2,107,3, - 114,74,124,0,160,3,124,0,106,4,124,1,161,2,125,2, - 124,2,100,0,117,1,114,68,124,2,106,5,100,0,117,0, - 114,68,124,2,106,6,114,68,124,2,106,6,124,0,95,7, - 124,1,124,0,95,2,124,0,106,7,83,0,114,109,0,0, - 0,41,8,114,111,0,0,0,114,25,1,0,0,114,26,1, - 0,0,114,27,1,0,0,114,23,1,0,0,114,140,0,0, - 0,114,178,0,0,0,114,24,1,0,0,41,3,114,118,0, - 0,0,90,11,112,97,114,101,110,116,95,112,97,116,104,114, + 0,114,46,1,0,0,224,4,0,0,115,10,0,0,0,0, + 4,22,1,8,1,10,1,10,1,122,28,80,97,116,104,70, + 105,110,100,101,114,46,105,110,118,97,108,105,100,97,116,101, + 95,99,97,99,104,101,115,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,9,0,0,0,67,0,0,0, + 115,82,0,0,0,116,0,106,1,100,1,117,1,114,28,116, + 0,106,1,115,28,116,2,160,3,100,2,116,4,161,2,1, + 0,116,0,106,1,68,0,93,42,125,2,122,14,124,2,124, + 1,131,1,87,0,2,0,1,0,83,0,4,0,116,5,121, + 74,1,0,1,0,1,0,89,0,113,34,89,0,113,34,48, + 0,113,34,100,1,83,0,41,3,122,46,83,101,97,114,99, + 104,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, + 32,102,111,114,32,97,32,102,105,110,100,101,114,32,102,111, + 114,32,39,112,97,116,104,39,46,78,122,23,115,121,115,46, + 112,97,116,104,95,104,111,111,107,115,32,105,115,32,101,109, + 112,116,121,41,6,114,8,0,0,0,218,10,112,97,116,104, + 95,104,111,111,107,115,114,74,0,0,0,114,75,0,0,0, + 114,138,0,0,0,114,117,0,0,0,41,3,114,193,0,0, + 0,114,43,0,0,0,90,4,104,111,111,107,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, + 116,104,95,104,111,111,107,115,234,4,0,0,115,16,0,0, + 0,0,3,16,1,12,1,10,1,2,1,14,1,12,1,12, + 2,122,22,80,97,116,104,70,105,110,100,101,114,46,95,112, + 97,116,104,95,104,111,111,107,115,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, + 0,0,115,100,0,0,0,124,1,100,1,107,2,114,42,122, + 12,116,0,160,1,161,0,125,1,87,0,110,20,4,0,116, + 2,121,40,1,0,1,0,1,0,89,0,100,2,83,0,48, + 0,122,14,116,3,106,4,124,1,25,0,125,2,87,0,110, + 38,4,0,116,5,121,94,1,0,1,0,1,0,124,0,160, + 6,124,1,161,1,125,2,124,2,116,3,106,4,124,1,60, + 0,89,0,110,2,48,0,124,2,83,0,41,3,122,210,71, + 101,116,32,116,104,101,32,102,105,110,100,101,114,32,102,111, + 114,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, + 32,102,114,111,109,32,115,121,115,46,112,97,116,104,95,105, + 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, + 97,116,104,32,101,110,116,114,121,32,105,115,32,110,111,116, + 32,105,110,32,116,104,101,32,99,97,99,104,101,44,32,102, + 105,110,100,32,116,104,101,32,97,112,112,114,111,112,114,105, + 97,116,101,32,102,105,110,100,101,114,10,32,32,32,32,32, + 32,32,32,97,110,100,32,99,97,99,104,101,32,105,116,46, + 32,73,102,32,110,111,32,102,105,110,100,101,114,32,105,115, + 32,97,118,97,105,108,97,98,108,101,44,32,115,116,111,114, + 101,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, + 32,114,39,0,0,0,78,41,7,114,2,0,0,0,114,54, + 0,0,0,114,3,1,0,0,114,8,0,0,0,114,48,1, + 0,0,218,8,75,101,121,69,114,114,111,114,114,52,1,0, + 0,41,3,114,193,0,0,0,114,43,0,0,0,114,50,1, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,20,95,112,97,116,104,95,105,109,112,111,114,116,101, + 114,95,99,97,99,104,101,247,4,0,0,115,22,0,0,0, + 0,8,8,1,2,1,12,1,12,3,8,1,2,1,14,1, + 12,1,10,1,16,1,122,31,80,97,116,104,70,105,110,100, + 101,114,46,95,112,97,116,104,95,105,109,112,111,114,116,101, + 114,95,99,97,99,104,101,99,3,0,0,0,0,0,0,0, + 0,0,0,0,6,0,0,0,4,0,0,0,67,0,0,0, + 115,82,0,0,0,116,0,124,2,100,1,131,2,114,26,124, + 2,160,1,124,1,161,1,92,2,125,3,125,4,110,14,124, + 2,160,2,124,1,161,1,125,3,103,0,125,4,124,3,100, + 0,117,1,114,60,116,3,160,4,124,1,124,3,161,2,83, + 0,116,3,160,5,124,1,100,0,161,2,125,5,124,4,124, + 5,95,6,124,5,83,0,41,2,78,114,137,0,0,0,41, + 7,114,128,0,0,0,114,137,0,0,0,114,206,0,0,0, + 114,134,0,0,0,114,201,0,0,0,114,183,0,0,0,114, + 178,0,0,0,41,6,114,193,0,0,0,114,139,0,0,0, + 114,50,1,0,0,114,140,0,0,0,114,141,0,0,0,114, 187,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,12,95,114,101,99,97,108,99,117,108,97,116, - 101,140,4,0,0,115,16,0,0,0,0,2,12,1,10,1, - 14,3,18,1,6,1,8,1,6,1,122,27,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,114,101,99,97, - 108,99,117,108,97,116,101,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, - 0,114,109,0,0,0,41,2,114,6,1,0,0,114,32,1, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,8,95,95,105,116,101,114,95,95, - 153,4,0,0,115,2,0,0,0,0,1,122,23,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,105,116, - 101,114,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,12,0, - 0,0,124,0,160,0,161,0,124,1,25,0,83,0,114,109, - 0,0,0,169,1,114,32,1,0,0,41,2,114,118,0,0, - 0,218,5,105,110,100,101,120,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,95,95,103,101,116,105,116, - 101,109,95,95,156,4,0,0,115,2,0,0,0,0,1,122, - 26,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,95,103,101,116,105,116,101,109,95,95,99,3,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,14,0,0,0,124,2,124,0,106,0,124, - 1,60,0,100,0,83,0,114,109,0,0,0,41,1,114,24, - 1,0,0,41,3,114,118,0,0,0,114,35,1,0,0,114, - 43,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,95, - 159,4,0,0,115,2,0,0,0,0,1,122,26,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, - 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, - 0,114,109,0,0,0,41,2,114,22,0,0,0,114,32,1, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,7,95,95,108,101,110,95,95,162, - 4,0,0,115,2,0,0,0,0,1,122,22,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,95,108,101,110, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 20,95,78,97,109,101,115,112,97,99,101,80,97,116,104,40, - 123,33,114,125,41,41,2,114,61,0,0,0,114,24,1,0, - 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,8,95,95,114,101,112,114,95,95,165, - 4,0,0,115,2,0,0,0,0,1,122,23,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,95,114,101,112, - 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,124,1,124,0,160,0,161,0,118,0,83,0,114,109,0, - 0,0,114,34,1,0,0,169,2,114,118,0,0,0,218,4, - 105,116,101,109,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,168,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,99, - 111,110,116,97,105,110,115,95,95,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,16,0,0,0,124,0,106,0,160,1,124,1,161, - 1,1,0,100,0,83,0,114,109,0,0,0,41,2,114,24, - 1,0,0,114,186,0,0,0,114,40,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,186,0,0, - 0,171,4,0,0,115,2,0,0,0,0,1,122,21,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,97,112,112, - 101,110,100,78,41,15,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, - 30,1,0,0,114,25,1,0,0,114,32,1,0,0,114,33, - 1,0,0,114,36,1,0,0,114,37,1,0,0,114,38,1, - 0,0,114,39,1,0,0,114,42,1,0,0,114,186,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,22,1,0,0,113,4,0,0,115,24, - 0,0,0,8,1,4,6,8,6,8,10,8,4,8,13,8, - 3,8,3,8,3,8,3,8,3,8,3,114,22,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,80,0,0,0,101,0, - 90,1,100,0,90,2,100,1,100,2,132,0,90,3,101,4, - 100,3,100,4,132,0,131,1,90,5,100,5,100,6,132,0, - 90,6,100,7,100,8,132,0,90,7,100,9,100,10,132,0, - 90,8,100,11,100,12,132,0,90,9,100,13,100,14,132,0, - 90,10,100,15,100,16,132,0,90,11,100,17,83,0,41,18, - 218,16,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,99,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,18,0,0,0, - 116,0,124,1,124,2,124,3,131,3,124,0,95,1,100,0, - 83,0,114,109,0,0,0,41,2,114,22,1,0,0,114,24, - 1,0,0,114,28,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,209,0,0,0,177,4,0,0, - 115,2,0,0,0,0,1,122,25,95,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,46,95,95,105,110,105,116, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,1,106,1,161,1,83,0,41,2,122,115, - 82,101,116,117,114,110,32,114,101,112,114,32,102,111,114,32, - 116,104,101,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,109,101,116,104,111,100,32, + 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116, + 95,115,112,101,99,13,5,0,0,115,18,0,0,0,0,4, + 10,1,16,2,10,1,4,1,8,1,12,1,12,1,6,1, + 122,27,80,97,116,104,70,105,110,100,101,114,46,95,108,101, + 103,97,99,121,95,103,101,116,95,115,112,101,99,78,99,4, + 0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,5, + 0,0,0,67,0,0,0,115,166,0,0,0,103,0,125,4, + 124,2,68,0,93,134,125,5,116,0,124,5,116,1,116,2, + 102,2,131,2,115,28,113,8,124,0,160,3,124,5,161,1, + 125,6,124,6,100,1,117,1,114,8,116,4,124,6,100,2, + 131,2,114,70,124,6,160,5,124,1,124,3,161,2,125,7, + 110,12,124,0,160,6,124,1,124,6,161,2,125,7,124,7, + 100,1,117,0,114,92,113,8,124,7,106,7,100,1,117,1, + 114,110,124,7,2,0,1,0,83,0,124,7,106,8,125,8, + 124,8,100,1,117,0,114,132,116,9,100,3,131,1,130,1, + 124,4,160,10,124,8,161,1,1,0,113,8,116,11,160,12, + 124,1,100,1,161,2,125,7,124,4,124,7,95,8,124,7, + 83,0,41,4,122,63,70,105,110,100,32,116,104,101,32,108, + 111,97,100,101,114,32,111,114,32,110,97,109,101,115,112,97, + 99,101,95,112,97,116,104,32,102,111,114,32,116,104,105,115, + 32,109,111,100,117,108,101,47,112,97,99,107,97,103,101,32, + 110,97,109,101,46,78,114,203,0,0,0,122,19,115,112,101, + 99,32,109,105,115,115,105,110,103,32,108,111,97,100,101,114, + 41,13,114,161,0,0,0,114,84,0,0,0,218,5,98,121, + 116,101,115,114,54,1,0,0,114,128,0,0,0,114,203,0, + 0,0,114,55,1,0,0,114,140,0,0,0,114,178,0,0, + 0,114,117,0,0,0,114,167,0,0,0,114,134,0,0,0, + 114,183,0,0,0,41,9,114,193,0,0,0,114,139,0,0, + 0,114,43,0,0,0,114,202,0,0,0,218,14,110,97,109, + 101,115,112,97,99,101,95,112,97,116,104,90,5,101,110,116, + 114,121,114,50,1,0,0,114,187,0,0,0,114,141,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,9,95,103,101,116,95,115,112,101,99,28,5,0,0,115, + 40,0,0,0,0,5,4,1,8,1,14,1,2,1,10,1, + 8,1,10,1,14,2,12,1,8,1,2,1,10,1,8,1, + 6,1,8,1,8,5,12,2,12,1,6,1,122,20,80,97, + 116,104,70,105,110,100,101,114,46,95,103,101,116,95,115,112, + 101,99,99,4,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,5,0,0,0,67,0,0,0,115,100,0,0,0, + 124,2,100,1,117,0,114,14,116,0,106,1,125,2,124,0, + 160,2,124,1,124,2,124,3,161,3,125,4,124,4,100,1, + 117,0,114,40,100,1,83,0,124,4,106,3,100,1,117,0, + 114,92,124,4,106,4,125,5,124,5,114,86,100,1,124,4, + 95,5,116,6,124,1,124,5,124,0,106,2,131,3,124,4, + 95,4,124,4,83,0,100,1,83,0,110,4,124,4,83,0, + 100,1,83,0,41,2,122,141,84,114,121,32,116,111,32,102, + 105,110,100,32,97,32,115,112,101,99,32,102,111,114,32,39, + 102,117,108,108,110,97,109,101,39,32,111,110,32,115,121,115, + 46,112,97,116,104,32,111,114,32,39,112,97,116,104,39,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,101, + 97,114,99,104,32,105,115,32,98,97,115,101,100,32,111,110, + 32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, + 97,110,100,32,115,121,115,46,112,97,116,104,95,105,109,112, + 111,114,116,101,114,95,99,97,99,104,101,46,10,32,32,32, + 32,32,32,32,32,78,41,7,114,8,0,0,0,114,43,0, + 0,0,114,58,1,0,0,114,140,0,0,0,114,178,0,0, + 0,114,181,0,0,0,114,22,1,0,0,41,6,114,193,0, + 0,0,114,139,0,0,0,114,43,0,0,0,114,202,0,0, + 0,114,187,0,0,0,114,57,1,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,60, + 5,0,0,115,26,0,0,0,0,6,8,1,6,1,14,1, + 8,1,4,1,10,1,6,1,4,3,6,1,16,1,4,2, + 6,2,122,20,80,97,116,104,70,105,110,100,101,114,46,102, + 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,30,0,0,0,124,0,160,0,124,1,124,2,161,2, + 125,3,124,3,100,1,117,0,114,24,100,1,83,0,124,3, + 106,1,83,0,41,2,122,170,102,105,110,100,32,116,104,101, + 32,109,111,100,117,108,101,32,111,110,32,115,121,115,46,112, + 97,116,104,32,111,114,32,39,112,97,116,104,39,32,98,97, + 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95, + 104,111,111,107,115,32,97,110,100,10,32,32,32,32,32,32, + 32,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32, + 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 84,104,101,32,105,109,112,111,114,116,32,109,97,99,104,105, - 110,101,114,121,32,100,111,101,115,32,116,104,101,32,106,111, - 98,32,105,116,115,101,108,102,46,10,10,32,32,32,32,32, - 32,32,32,122,25,60,109,111,100,117,108,101,32,123,33,114, - 125,32,40,110,97,109,101,115,112,97,99,101,41,62,41,2, - 114,61,0,0,0,114,125,0,0,0,41,2,114,193,0,0, - 0,114,216,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,109,111,100,117,108,101,95,114,101, - 112,114,180,4,0,0,115,2,0,0,0,0,7,122,28,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 109,111,100,117,108,101,95,114,101,112,114,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,78, - 84,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,189, - 4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,105,115,95, - 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,78,114,39,0,0, - 0,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,192, - 4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,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,39,0,0,0,122,8,60, - 115,116,114,105,110,103,62,114,215,0,0,0,84,41,1,114, - 231,0,0,0,41,1,114,232,0,0,0,114,219,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,195,4,0,0,115,2,0,0,0,0,1,122, - 25,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,114,210,0,0, - 0,114,3,0,0,0,114,211,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,198, - 4,0,0,115,2,0,0,0,0,1,122,30,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, - 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,0,83,0,114,109,0,0, - 0,114,3,0,0,0,114,253,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,217,0,0,0,201, - 4,0,0,115,2,0,0,0,0,1,122,28,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, - 0,115,26,0,0,0,116,0,160,1,100,1,124,0,106,2, - 161,2,1,0,116,0,160,3,124,0,124,1,161,2,83,0, - 41,2,122,98,76,111,97,100,32,97,32,110,97,109,101,115, - 112,97,99,101,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,122,38,110,97,109,101,115,112,97,99, - 101,32,109,111,100,117,108,101,32,108,111,97,100,101,100,32, - 119,105,116,104,32,112,97,116,104,32,123,33,114,125,41,4, - 114,134,0,0,0,114,149,0,0,0,114,24,1,0,0,114, - 218,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,220,0,0,0,204,4,0, - 0,115,8,0,0,0,0,7,6,1,4,255,4,2,122,28, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,12,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,209, - 0,0,0,114,207,0,0,0,114,44,1,0,0,114,182,0, - 0,0,114,229,0,0,0,114,213,0,0,0,114,212,0,0, - 0,114,217,0,0,0,114,220,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 43,1,0,0,176,4,0,0,115,18,0,0,0,8,1,8, - 3,2,1,10,8,8,3,8,3,8,3,8,3,8,3,114, - 43,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,118,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,101,4, - 100,2,100,3,132,0,131,1,90,5,101,4,100,4,100,5, - 132,0,131,1,90,6,101,4,100,6,100,7,132,0,131,1, - 90,7,101,4,100,8,100,9,132,0,131,1,90,8,101,4, - 100,19,100,11,100,12,132,1,131,1,90,9,101,4,100,20, - 100,13,100,14,132,1,131,1,90,10,101,4,100,21,100,15, - 100,16,132,1,131,1,90,11,101,4,100,17,100,18,132,0, - 131,1,90,12,100,10,83,0,41,22,218,10,80,97,116,104, - 70,105,110,100,101,114,122,62,77,101,116,97,32,112,97,116, - 104,32,102,105,110,100,101,114,32,102,111,114,32,115,121,115, - 46,112,97,116,104,32,97,110,100,32,112,97,99,107,97,103, - 101,32,95,95,112,97,116,104,95,95,32,97,116,116,114,105, - 98,117,116,101,115,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, - 64,0,0,0,116,0,116,1,106,2,160,3,161,0,131,1, - 68,0,93,44,92,2,125,1,125,2,124,2,100,1,117,0, - 114,40,116,1,106,2,124,1,61,0,113,14,116,4,124,2, - 100,2,131,2,114,14,124,2,160,5,161,0,1,0,113,14, - 100,1,83,0,41,3,122,125,67,97,108,108,32,116,104,101, - 32,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, - 101,115,40,41,32,109,101,116,104,111,100,32,111,110,32,97, - 108,108,32,112,97,116,104,32,101,110,116,114,121,32,102,105, - 110,100,101,114,115,10,32,32,32,32,32,32,32,32,115,116, - 111,114,101,100,32,105,110,32,115,121,115,46,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,115, - 32,40,119,104,101,114,101,32,105,109,112,108,101,109,101,110, - 116,101,100,41,46,78,218,17,105,110,118,97,108,105,100,97, - 116,101,95,99,97,99,104,101,115,41,6,218,4,108,105,115, - 116,114,8,0,0,0,218,19,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,218,5,105,116,101, - 109,115,114,128,0,0,0,114,46,1,0,0,41,3,114,193, - 0,0,0,114,116,0,0,0,218,6,102,105,110,100,101,114, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 46,1,0,0,222,4,0,0,115,10,0,0,0,0,4,22, - 1,8,1,10,1,10,1,122,28,80,97,116,104,70,105,110, - 100,101,114,46,105,110,118,97,108,105,100,97,116,101,95,99, - 97,99,104,101,115,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,9,0,0,0,67,0,0,0,115,82, - 0,0,0,116,0,106,1,100,1,117,1,114,28,116,0,106, - 1,115,28,116,2,160,3,100,2,116,4,161,2,1,0,116, - 0,106,1,68,0,93,42,125,2,122,14,124,2,124,1,131, - 1,87,0,2,0,1,0,83,0,4,0,116,5,121,74,1, - 0,1,0,1,0,89,0,113,34,89,0,113,34,48,0,113, - 34,100,1,83,0,41,3,122,46,83,101,97,114,99,104,32, - 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,102, - 111,114,32,97,32,102,105,110,100,101,114,32,102,111,114,32, - 39,112,97,116,104,39,46,78,122,23,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,105,115,32,101,109,112,116, - 121,41,6,114,8,0,0,0,218,10,112,97,116,104,95,104, - 111,111,107,115,114,74,0,0,0,114,75,0,0,0,114,138, - 0,0,0,114,117,0,0,0,41,3,114,193,0,0,0,114, - 43,0,0,0,90,4,104,111,111,107,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,112,97,116,104, - 95,104,111,111,107,115,232,4,0,0,115,16,0,0,0,0, - 3,16,1,12,1,10,1,2,1,14,1,12,1,12,2,122, - 22,80,97,116,104,70,105,110,100,101,114,46,95,112,97,116, - 104,95,104,111,111,107,115,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, - 115,100,0,0,0,124,1,100,1,107,2,114,42,122,12,116, - 0,160,1,161,0,125,1,87,0,110,20,4,0,116,2,121, - 40,1,0,1,0,1,0,89,0,100,2,83,0,48,0,122, - 14,116,3,106,4,124,1,25,0,125,2,87,0,110,38,4, - 0,116,5,121,94,1,0,1,0,1,0,124,0,160,6,124, - 1,161,1,125,2,124,2,116,3,106,4,124,1,60,0,89, - 0,110,2,48,0,124,2,83,0,41,3,122,210,71,101,116, - 32,116,104,101,32,102,105,110,100,101,114,32,102,111,114,32, - 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,102, - 114,111,109,32,115,121,115,46,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,46,10,10,32,32, - 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, - 104,32,101,110,116,114,121,32,105,115,32,110,111,116,32,105, - 110,32,116,104,101,32,99,97,99,104,101,44,32,102,105,110, - 100,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116, - 101,32,102,105,110,100,101,114,10,32,32,32,32,32,32,32, - 32,97,110,100,32,99,97,99,104,101,32,105,116,46,32,73, - 102,32,110,111,32,102,105,110,100,101,114,32,105,115,32,97, - 118,97,105,108,97,98,108,101,44,32,115,116,111,114,101,32, - 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,114, - 39,0,0,0,78,41,7,114,2,0,0,0,114,54,0,0, - 0,114,3,1,0,0,114,8,0,0,0,114,48,1,0,0, - 218,8,75,101,121,69,114,114,111,114,114,52,1,0,0,41, - 3,114,193,0,0,0,114,43,0,0,0,114,50,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 20,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,245,4,0,0,115,22,0,0,0,0,8, - 8,1,2,1,12,1,12,3,8,1,2,1,14,1,12,1, - 10,1,16,1,122,31,80,97,116,104,70,105,110,100,101,114, - 46,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,99,3,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,82, - 0,0,0,116,0,124,2,100,1,131,2,114,26,124,2,160, - 1,124,1,161,1,92,2,125,3,125,4,110,14,124,2,160, - 2,124,1,161,1,125,3,103,0,125,4,124,3,100,0,117, - 1,114,60,116,3,160,4,124,1,124,3,161,2,83,0,116, - 3,160,5,124,1,100,0,161,2,125,5,124,4,124,5,95, - 6,124,5,83,0,41,2,78,114,137,0,0,0,41,7,114, - 128,0,0,0,114,137,0,0,0,114,206,0,0,0,114,134, - 0,0,0,114,201,0,0,0,114,183,0,0,0,114,178,0, - 0,0,41,6,114,193,0,0,0,114,139,0,0,0,114,50, - 1,0,0,114,140,0,0,0,114,141,0,0,0,114,187,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,16,95,108,101,103,97,99,121,95,103,101,116,95,115, - 112,101,99,11,5,0,0,115,18,0,0,0,0,4,10,1, - 16,2,10,1,4,1,8,1,12,1,12,1,6,1,122,27, - 80,97,116,104,70,105,110,100,101,114,46,95,108,101,103,97, - 99,121,95,103,101,116,95,115,112,101,99,78,99,4,0,0, - 0,0,0,0,0,0,0,0,0,9,0,0,0,5,0,0, - 0,67,0,0,0,115,166,0,0,0,103,0,125,4,124,2, - 68,0,93,134,125,5,116,0,124,5,116,1,116,2,102,2, - 131,2,115,28,113,8,124,0,160,3,124,5,161,1,125,6, - 124,6,100,1,117,1,114,8,116,4,124,6,100,2,131,2, - 114,70,124,6,160,5,124,1,124,3,161,2,125,7,110,12, - 124,0,160,6,124,1,124,6,161,2,125,7,124,7,100,1, - 117,0,114,92,113,8,124,7,106,7,100,1,117,1,114,110, - 124,7,2,0,1,0,83,0,124,7,106,8,125,8,124,8, - 100,1,117,0,114,132,116,9,100,3,131,1,130,1,124,4, - 160,10,124,8,161,1,1,0,113,8,116,11,160,12,124,1, - 100,1,161,2,125,7,124,4,124,7,95,8,124,7,83,0, - 41,4,122,63,70,105,110,100,32,116,104,101,32,108,111,97, - 100,101,114,32,111,114,32,110,97,109,101,115,112,97,99,101, - 95,112,97,116,104,32,102,111,114,32,116,104,105,115,32,109, - 111,100,117,108,101,47,112,97,99,107,97,103,101,32,110,97, - 109,101,46,78,114,203,0,0,0,122,19,115,112,101,99,32, - 109,105,115,115,105,110,103,32,108,111,97,100,101,114,41,13, - 114,161,0,0,0,114,84,0,0,0,218,5,98,121,116,101, - 115,114,54,1,0,0,114,128,0,0,0,114,203,0,0,0, - 114,55,1,0,0,114,140,0,0,0,114,178,0,0,0,114, - 117,0,0,0,114,167,0,0,0,114,134,0,0,0,114,183, - 0,0,0,41,9,114,193,0,0,0,114,139,0,0,0,114, - 43,0,0,0,114,202,0,0,0,218,14,110,97,109,101,115, - 112,97,99,101,95,112,97,116,104,90,5,101,110,116,114,121, - 114,50,1,0,0,114,187,0,0,0,114,141,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 95,103,101,116,95,115,112,101,99,26,5,0,0,115,40,0, - 0,0,0,5,4,1,8,1,14,1,2,1,10,1,8,1, - 10,1,14,2,12,1,8,1,2,1,10,1,8,1,6,1, - 8,1,8,5,12,2,12,1,6,1,122,20,80,97,116,104, - 70,105,110,100,101,114,46,95,103,101,116,95,115,112,101,99, - 99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,5,0,0,0,67,0,0,0,115,100,0,0,0,124,2, - 100,1,117,0,114,14,116,0,106,1,125,2,124,0,160,2, - 124,1,124,2,124,3,161,3,125,4,124,4,100,1,117,0, - 114,40,100,1,83,0,124,4,106,3,100,1,117,0,114,92, - 124,4,106,4,125,5,124,5,114,86,100,1,124,4,95,5, - 116,6,124,1,124,5,124,0,106,2,131,3,124,4,95,4, - 124,4,83,0,100,1,83,0,110,4,124,4,83,0,100,1, - 83,0,41,2,122,141,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,115,112,101,99,32,102,111,114,32,39,102,117, - 108,108,110,97,109,101,39,32,111,110,32,115,121,115,46,112, - 97,116,104,32,111,114,32,39,112,97,116,104,39,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,115,101,97,114, - 99,104,32,105,115,32,98,97,115,101,100,32,111,110,32,115, - 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, - 100,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,46,10,32,32,32,32,32, - 32,32,32,78,41,7,114,8,0,0,0,114,43,0,0,0, - 114,58,1,0,0,114,140,0,0,0,114,178,0,0,0,114, - 181,0,0,0,114,22,1,0,0,41,6,114,193,0,0,0, - 114,139,0,0,0,114,43,0,0,0,114,202,0,0,0,114, - 187,0,0,0,114,57,1,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,203,0,0,0,58,5,0, - 0,115,26,0,0,0,0,6,8,1,6,1,14,1,8,1, - 4,1,10,1,6,1,4,3,6,1,16,1,4,2,6,2, - 122,20,80,97,116,104,70,105,110,100,101,114,46,102,105,110, - 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,1,117,0,114,24,100,1,83,0,124,3,106,1, - 83,0,41,2,122,170,102,105,110,100,32,116,104,101,32,109, - 111,100,117,108,101,32,111,110,32,115,121,115,46,112,97,116, - 104,32,111,114,32,39,112,97,116,104,39,32,98,97,115,101, - 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111, - 111,107,115,32,97,110,100,10,32,32,32,32,32,32,32,32, - 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 78,114,204,0,0,0,114,205,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,82, - 5,0,0,115,8,0,0,0,0,8,12,1,8,1,4,1, - 122,22,80,97,116,104,70,105,110,100,101,114,46,102,105,110, - 100,95,109,111,100,117,108,101,99,1,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,3,0,0,0,79,0,0, - 0,115,24,0,0,0,100,1,100,2,108,0,109,1,125,3, - 1,0,124,3,106,2,124,1,124,2,142,1,83,0,41,3, - 97,32,1,0,0,10,32,32,32,32,32,32,32,32,70,105, - 110,100,32,100,105,115,116,114,105,98,117,116,105,111,110,115, - 46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,114, - 110,32,97,110,32,105,116,101,114,97,98,108,101,32,111,102, - 32,97,108,108,32,68,105,115,116,114,105,98,117,116,105,111, - 110,32,105,110,115,116,97,110,99,101,115,32,99,97,112,97, - 98,108,101,32,111,102,10,32,32,32,32,32,32,32,32,108, - 111,97,100,105,110,103,32,116,104,101,32,109,101,116,97,100, - 97,116,97,32,102,111,114,32,112,97,99,107,97,103,101,115, - 32,109,97,116,99,104,105,110,103,32,96,96,99,111,110,116, - 101,120,116,46,110,97,109,101,96,96,10,32,32,32,32,32, - 32,32,32,40,111,114,32,97,108,108,32,110,97,109,101,115, - 32,105,102,32,96,96,78,111,110,101,96,96,32,105,110,100, - 105,99,97,116,101,100,41,32,97,108,111,110,103,32,116,104, - 101,32,112,97,116,104,115,32,105,110,32,116,104,101,32,108, - 105,115,116,10,32,32,32,32,32,32,32,32,111,102,32,100, - 105,114,101,99,116,111,114,105,101,115,32,96,96,99,111,110, - 116,101,120,116,46,112,97,116,104,96,96,46,10,32,32,32, - 32,32,32,32,32,114,72,0,0,0,41,1,218,18,77,101, - 116,97,100,97,116,97,80,97,116,104,70,105,110,100,101,114, - 41,3,90,18,105,109,112,111,114,116,108,105,98,46,109,101, - 116,97,100,97,116,97,114,59,1,0,0,218,18,102,105,110, - 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, - 4,114,193,0,0,0,114,119,0,0,0,114,120,0,0,0, - 114,59,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,60,1,0,0,95,5,0,0,115,4,0, - 0,0,0,10,12,1,122,29,80,97,116,104,70,105,110,100, - 101,114,46,102,105,110,100,95,100,105,115,116,114,105,98,117, - 116,105,111,110,115,41,1,78,41,2,78,78,41,1,78,41, - 13,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,207,0,0,0,114,46,1,0,0,114, - 52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58, - 1,0,0,114,203,0,0,0,114,206,0,0,0,114,60,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,45,1,0,0,218,4,0,0,115, - 34,0,0,0,8,2,4,2,2,1,10,9,2,1,10,12, - 2,1,10,21,2,1,10,14,2,1,12,31,2,1,12,23, - 2,1,12,12,2,1,114,45,1,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 64,0,0,0,115,90,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,101,6,90,7,100,6,100,7,132,0,90, - 8,100,8,100,9,132,0,90,9,100,19,100,11,100,12,132, - 1,90,10,100,13,100,14,132,0,90,11,101,12,100,15,100, - 16,132,0,131,1,90,13,100,17,100,18,132,0,90,14,100, - 10,83,0,41,20,218,10,70,105,108,101,70,105,110,100,101, - 114,122,172,70,105,108,101,45,98,97,115,101,100,32,102,105, - 110,100,101,114,46,10,10,32,32,32,32,73,110,116,101,114, - 97,99,116,105,111,110,115,32,119,105,116,104,32,116,104,101, - 32,102,105,108,101,32,115,121,115,116,101,109,32,97,114,101, - 32,99,97,99,104,101,100,32,102,111,114,32,112,101,114,102, - 111,114,109,97,110,99,101,44,32,98,101,105,110,103,10,32, - 32,32,32,114,101,102,114,101,115,104,101,100,32,119,104,101, - 110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32, - 116,104,101,32,102,105,110,100,101,114,32,105,115,32,104,97, - 110,100,108,105,110,103,32,104,97,115,32,98,101,101,110,32, - 109,111,100,105,102,105,101,100,46,10,10,32,32,32,32,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 6,0,0,0,7,0,0,0,115,84,0,0,0,103,0,125, - 3,124,2,68,0,93,32,92,2,137,0,125,4,124,3,160, - 0,135,0,102,1,100,1,100,2,132,8,124,4,68,0,131, - 1,161,1,1,0,113,8,124,3,124,0,95,1,124,1,112, - 54,100,3,124,0,95,2,100,4,124,0,95,3,116,4,131, - 0,124,0,95,5,116,4,131,0,124,0,95,6,100,5,83, - 0,41,6,122,154,73,110,105,116,105,97,108,105,122,101,32, - 119,105,116,104,32,116,104,101,32,112,97,116,104,32,116,111, - 32,115,101,97,114,99,104,32,111,110,32,97,110,100,32,97, - 32,118,97,114,105,97,98,108,101,32,110,117,109,98,101,114, - 32,111,102,10,32,32,32,32,32,32,32,32,50,45,116,117, - 112,108,101,115,32,99,111,110,116,97,105,110,105,110,103,32, - 116,104,101,32,108,111,97,100,101,114,32,97,110,100,32,116, - 104,101,32,102,105,108,101,32,115,117,102,102,105,120,101,115, - 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, - 32,32,32,32,114,101,99,111,103,110,105,122,101,115,46,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,51,0,0,0,115,22,0,0,0,124,0,93, - 14,125,1,124,1,136,0,102,2,86,0,1,0,113,2,100, - 0,83,0,114,109,0,0,0,114,3,0,0,0,114,16,1, - 0,0,169,1,114,140,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,19,1,0,0,124,5,0,0,115,4,0,0, - 0,4,0,2,0,122,38,70,105,108,101,70,105,110,100,101, - 114,46,95,95,105,110,105,116,95,95,46,60,108,111,99,97, - 108,115,62,46,60,103,101,110,101,120,112,114,62,114,70,0, - 0,0,114,104,0,0,0,78,41,7,114,167,0,0,0,218, - 8,95,108,111,97,100,101,114,115,114,43,0,0,0,218,11, - 95,112,97,116,104,95,109,116,105,109,101,218,3,115,101,116, - 218,11,95,112,97,116,104,95,99,97,99,104,101,218,19,95, - 114,101,108,97,120,101,100,95,112,97,116,104,95,99,97,99, - 104,101,41,5,114,118,0,0,0,114,43,0,0,0,218,14, - 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, - 108,111,97,100,101,114,115,114,189,0,0,0,114,3,0,0, - 0,114,62,1,0,0,114,6,0,0,0,114,209,0,0,0, - 118,5,0,0,115,16,0,0,0,0,4,4,1,12,1,26, - 1,6,2,10,1,6,1,8,1,122,19,70,105,108,101,70, - 105,110,100,101,114,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, - 0,0,0,67,0,0,0,115,10,0,0,0,100,1,124,0, - 95,0,100,2,83,0,41,3,122,31,73,110,118,97,108,105, - 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, - 114,121,32,109,116,105,109,101,46,114,104,0,0,0,78,41, - 1,114,64,1,0,0,114,246,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,132, - 5,0,0,115,2,0,0,0,0,2,122,28,70,105,108,101, - 70,105,110,100,101,114,46,105,110,118,97,108,105,100,97,116, - 101,95,99,97,99,104,101,115,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, - 124,2,100,1,117,0,114,26,100,1,103,0,102,2,83,0, - 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, - 41,2,122,197,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,108,111,97,100,101,114,32,102,111,114,32,116,104,101, + 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,114,204,0,0,0,114,205,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,206,0,0, + 0,84,5,0,0,115,8,0,0,0,0,8,12,1,8,1, + 4,1,122,22,80,97,116,104,70,105,110,100,101,114,46,102, + 105,110,100,95,109,111,100,117,108,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,79, + 0,0,0,115,24,0,0,0,100,1,100,2,108,0,109,1, + 125,3,1,0,124,3,106,2,124,1,124,2,142,1,83,0, + 41,3,97,32,1,0,0,10,32,32,32,32,32,32,32,32, + 70,105,110,100,32,100,105,115,116,114,105,98,117,116,105,111, + 110,115,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,97,110,32,105,116,101,114,97,98,108,101,32, + 111,102,32,97,108,108,32,68,105,115,116,114,105,98,117,116, + 105,111,110,32,105,110,115,116,97,110,99,101,115,32,99,97, + 112,97,98,108,101,32,111,102,10,32,32,32,32,32,32,32, + 32,108,111,97,100,105,110,103,32,116,104,101,32,109,101,116, + 97,100,97,116,97,32,102,111,114,32,112,97,99,107,97,103, + 101,115,32,109,97,116,99,104,105,110,103,32,96,96,99,111, + 110,116,101,120,116,46,110,97,109,101,96,96,10,32,32,32, + 32,32,32,32,32,40,111,114,32,97,108,108,32,110,97,109, + 101,115,32,105,102,32,96,96,78,111,110,101,96,96,32,105, + 110,100,105,99,97,116,101,100,41,32,97,108,111,110,103,32, + 116,104,101,32,112,97,116,104,115,32,105,110,32,116,104,101, + 32,108,105,115,116,10,32,32,32,32,32,32,32,32,111,102, + 32,100,105,114,101,99,116,111,114,105,101,115,32,96,96,99, + 111,110,116,101,120,116,46,112,97,116,104,96,96,46,10,32, + 32,32,32,32,32,32,32,114,72,0,0,0,41,1,218,18, + 77,101,116,97,100,97,116,97,80,97,116,104,70,105,110,100, + 101,114,41,3,90,18,105,109,112,111,114,116,108,105,98,46, + 109,101,116,97,100,97,116,97,114,59,1,0,0,218,18,102, + 105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,110, + 115,41,4,114,193,0,0,0,114,119,0,0,0,114,120,0, + 0,0,114,59,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,60,1,0,0,97,5,0,0,115, + 4,0,0,0,0,10,12,1,122,29,80,97,116,104,70,105, + 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,41,1,78,41,2,78,78,41,1, + 78,41,13,114,125,0,0,0,114,124,0,0,0,114,126,0, + 0,0,114,127,0,0,0,114,207,0,0,0,114,46,1,0, + 0,114,52,1,0,0,114,54,1,0,0,114,55,1,0,0, + 114,58,1,0,0,114,203,0,0,0,114,206,0,0,0,114, + 60,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,45,1,0,0,220,4,0, + 0,115,34,0,0,0,8,2,4,2,2,1,10,9,2,1, + 10,12,2,1,10,21,2,1,10,14,2,1,12,31,2,1, + 12,23,2,1,12,12,2,1,114,45,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, + 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, + 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, + 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, + 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, + 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, + 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, + 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, + 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, + 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, + 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, + 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, + 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, + 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, + 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, + 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, + 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, + 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, + 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, + 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, + 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, + 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, + 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, + 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, + 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, + 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, + 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, + 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, + 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, + 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, + 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, + 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, + 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, + 2,100,0,83,0,114,109,0,0,0,114,3,0,0,0,114, + 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,19,1,0,0,126,5,0,0,115,4, + 0,0,0,4,0,2,0,122,38,70,105,108,101,70,105,110, + 100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,111, + 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,114, + 70,0,0,0,114,104,0,0,0,78,41,7,114,167,0,0, + 0,218,8,95,108,111,97,100,101,114,115,114,43,0,0,0, + 218,11,95,112,97,116,104,95,109,116,105,109,101,218,3,115, + 101,116,218,11,95,112,97,116,104,95,99,97,99,104,101,218, + 19,95,114,101,108,97,120,101,100,95,112,97,116,104,95,99, + 97,99,104,101,41,5,114,118,0,0,0,114,43,0,0,0, + 218,14,108,111,97,100,101,114,95,100,101,116,97,105,108,115, + 90,7,108,111,97,100,101,114,115,114,189,0,0,0,114,3, + 0,0,0,114,62,1,0,0,114,6,0,0,0,114,209,0, + 0,0,120,5,0,0,115,16,0,0,0,0,4,4,1,12, + 1,26,1,6,2,10,1,6,1,8,1,122,19,70,105,108, + 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, + 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, + 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, + 116,111,114,121,32,109,116,105,109,101,46,114,104,0,0,0, + 78,41,1,114,64,1,0,0,114,246,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, + 0,134,5,0,0,115,2,0,0,0,0,2,122,28,70,105, + 108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,100, + 97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,42,0,0,0,124,0,160,0,124,1,161,1, + 125,2,124,2,100,1,117,0,114,26,100,1,103,0,102,2, + 83,0,124,2,106,1,124,2,106,2,112,38,103,0,102,2, + 83,0,41,2,122,197,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, + 117,108,101,44,32,111,114,32,116,104,101,32,110,97,109,101, + 115,112,97,99,101,10,32,32,32,32,32,32,32,32,112,97, + 99,107,97,103,101,32,112,111,114,116,105,111,110,115,46,32, + 82,101,116,117,114,110,115,32,40,108,111,97,100,101,114,44, + 32,108,105,115,116,45,111,102,45,112,111,114,116,105,111,110, + 115,41,46,10,10,32,32,32,32,32,32,32,32,84,104,105, + 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, + 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, + 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,78,41,3,114,203, + 0,0,0,114,140,0,0,0,114,178,0,0,0,41,3,114, + 118,0,0,0,114,139,0,0,0,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, + 0,0,140,5,0,0,115,8,0,0,0,0,7,10,1,8, + 1,8,1,122,22,70,105,108,101,70,105,110,100,101,114,46, + 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, + 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, + 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, + 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, + 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, + 0,0,41,7,114,118,0,0,0,114,188,0,0,0,114,139, + 0,0,0,114,43,0,0,0,90,4,115,109,115,108,114,202, + 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,58,1,0,0,152,5,0,0, + 115,8,0,0,0,0,1,10,1,8,1,2,255,122,20,70, + 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, + 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, + 0,14,0,0,0,8,0,0,0,67,0,0,0,115,96,1, + 0,0,100,1,125,3,124,1,160,0,100,2,161,1,100,3, + 25,0,125,4,122,24,116,1,124,0,106,2,112,34,116,3, + 160,4,161,0,131,1,106,5,125,5,87,0,110,22,4,0, + 116,6,121,64,1,0,1,0,1,0,100,4,125,5,89,0, + 110,2,48,0,124,5,124,0,106,7,107,3,114,90,124,0, + 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, + 114,112,124,0,106,10,125,6,124,4,160,11,161,0,125,7, + 110,10,124,0,106,12,125,6,124,4,125,7,124,7,124,6, + 118,0,114,216,116,13,124,0,106,2,124,4,131,2,125,8, + 124,0,106,14,68,0,93,58,92,2,125,9,125,10,100,5, + 124,9,23,0,125,11,116,13,124,8,124,11,131,2,125,12, + 116,15,124,12,131,1,114,148,124,0,160,16,124,10,124,1, + 124,12,124,8,103,1,124,2,161,5,2,0,1,0,83,0, + 113,148,116,17,124,8,131,1,125,3,124,0,106,14,68,0, + 93,82,92,2,125,9,125,10,116,13,124,0,106,2,124,4, + 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, + 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, + 118,0,114,222,116,15,124,12,131,1,114,222,124,0,160,16, + 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, + 83,0,113,222,124,3,144,1,114,92,116,18,160,19,100,9, + 124,8,161,2,1,0,116,18,160,20,124,1,100,8,161,2, + 125,13,124,8,103,1,124,13,95,21,124,13,83,0,100,8, + 83,0,41,10,122,111,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,115,112,101,99,32,102,111,114,32,116,104,101, 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, - 101,44,32,111,114,32,116,104,101,32,110,97,109,101,115,112, - 97,99,101,10,32,32,32,32,32,32,32,32,112,97,99,107, - 97,103,101,32,112,111,114,116,105,111,110,115,46,32,82,101, - 116,117,114,110,115,32,40,108,111,97,100,101,114,44,32,108, - 105,115,116,45,111,102,45,112,111,114,116,105,111,110,115,41, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, - 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, - 10,32,32,32,32,32,32,32,32,78,41,3,114,203,0,0, - 0,114,140,0,0,0,114,178,0,0,0,41,3,114,118,0, - 0,0,114,139,0,0,0,114,187,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,137,0,0,0, - 138,5,0,0,115,8,0,0,0,0,7,10,1,8,1,8, - 1,122,22,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,0, - 0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,0, - 0,0,115,26,0,0,0,124,1,124,2,124,3,131,2,125, - 6,116,0,124,2,124,3,124,6,124,4,100,1,141,4,83, - 0,41,2,78,114,177,0,0,0,41,1,114,190,0,0,0, - 41,7,114,118,0,0,0,114,188,0,0,0,114,139,0,0, - 0,114,43,0,0,0,90,4,115,109,115,108,114,202,0,0, - 0,114,140,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,58,1,0,0,150,5,0,0,115,8, - 0,0,0,0,1,10,1,8,1,2,255,122,20,70,105,108, - 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, - 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, - 0,0,0,8,0,0,0,67,0,0,0,115,96,1,0,0, - 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, - 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, - 161,0,131,1,106,5,125,5,87,0,110,22,4,0,116,6, - 121,64,1,0,1,0,1,0,100,4,125,5,89,0,110,2, - 48,0,124,5,124,0,106,7,107,3,114,90,124,0,160,8, - 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,112, - 124,0,106,10,125,6,124,4,160,11,161,0,125,7,110,10, - 124,0,106,12,125,6,124,4,125,7,124,7,124,6,118,0, - 114,216,116,13,124,0,106,2,124,4,131,2,125,8,124,0, - 106,14,68,0,93,58,92,2,125,9,125,10,100,5,124,9, - 23,0,125,11,116,13,124,8,124,11,131,2,125,12,116,15, - 124,12,131,1,114,148,124,0,160,16,124,10,124,1,124,12, - 124,8,103,1,124,2,161,5,2,0,1,0,83,0,113,148, - 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,82, - 92,2,125,9,125,10,116,13,124,0,106,2,124,4,124,9, - 23,0,131,2,125,12,116,18,106,19,100,6,124,12,100,3, - 100,7,141,3,1,0,124,7,124,9,23,0,124,6,118,0, - 114,222,116,15,124,12,131,1,114,222,124,0,160,16,124,10, - 124,1,124,12,100,8,124,2,161,5,2,0,1,0,83,0, - 113,222,124,3,144,1,114,92,116,18,160,19,100,9,124,8, - 161,2,1,0,116,18,160,20,124,1,100,8,161,2,125,13, - 124,8,103,1,124,13,95,21,124,13,83,0,100,8,83,0, - 41,10,122,111,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,115,112,101,99,32,102,111,114,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115, - 112,101,99,44,32,111,114,32,78,111,110,101,32,105,102,32, - 110,111,116,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,70,114,70,0,0,0,114,27,0,0,0,114,104, - 0,0,0,114,209,0,0,0,122,9,116,114,121,105,110,103, - 32,123,125,41,1,90,9,118,101,114,98,111,115,105,116,121, - 78,122,25,112,111,115,115,105,98,108,101,32,110,97,109,101, - 115,112,97,99,101,32,102,111,114,32,123,125,41,22,114,40, - 0,0,0,114,48,0,0,0,114,43,0,0,0,114,2,0, - 0,0,114,54,0,0,0,114,10,1,0,0,114,49,0,0, - 0,114,64,1,0,0,218,11,95,102,105,108,108,95,99,97, - 99,104,101,114,7,0,0,0,114,67,1,0,0,114,105,0, - 0,0,114,66,1,0,0,114,37,0,0,0,114,63,1,0, - 0,114,53,0,0,0,114,58,1,0,0,114,55,0,0,0, - 114,134,0,0,0,114,149,0,0,0,114,183,0,0,0,114, - 178,0,0,0,41,14,114,118,0,0,0,114,139,0,0,0, - 114,202,0,0,0,90,12,105,115,95,110,97,109,101,115,112, - 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, - 114,169,0,0,0,90,5,99,97,99,104,101,90,12,99,97, - 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, - 95,112,97,116,104,114,17,1,0,0,114,188,0,0,0,90, - 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, - 102,117,108,108,95,112,97,116,104,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,203,0, - 0,0,155,5,0,0,115,74,0,0,0,0,5,4,1,14, - 1,2,1,24,1,12,1,10,1,10,1,8,1,6,2,6, - 1,6,1,10,2,6,1,4,2,8,1,12,1,14,1,8, - 1,10,1,8,1,26,4,8,2,14,1,16,1,16,1,12, - 1,8,1,10,1,2,0,2,255,10,2,6,1,12,1,12, - 1,8,1,4,1,122,20,70,105,108,101,70,105,110,100,101, - 114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0, - 67,0,0,0,115,188,0,0,0,124,0,106,0,125,1,122, - 22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161, - 1,125,2,87,0,110,28,4,0,116,4,116,5,116,6,102, - 3,121,56,1,0,1,0,1,0,103,0,125,2,89,0,110, - 2,48,0,116,7,106,8,160,9,100,1,161,1,115,82,116, - 10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125, - 3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161, - 1,92,3,125,5,125,6,125,7,124,6,114,134,100,3,160, - 13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124, - 5,125,8,124,3,160,15,124,8,161,1,1,0,113,92,124, - 3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114, - 184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95, - 17,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104, - 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, - 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, - 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, - 105,115,32,100,105,114,101,99,116,111,114,121,46,114,0,0, - 0,0,114,70,0,0,0,114,60,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,12, - 125,1,124,1,160,0,161,0,146,2,113,4,83,0,114,3, - 0,0,0,41,1,114,105,0,0,0,41,2,114,31,0,0, - 0,90,2,102,110,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,9,60,115,101,116,99,111,109,112,62,232, - 5,0,0,115,4,0,0,0,6,0,2,0,122,41,70,105, - 108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,99, - 97,99,104,101,46,60,108,111,99,97,108,115,62,46,60,115, - 101,116,99,111,109,112,62,78,41,18,114,43,0,0,0,114, - 2,0,0,0,114,7,1,0,0,114,54,0,0,0,114,3, - 1,0,0,218,15,80,101,114,109,105,115,115,105,111,110,69, - 114,114,111,114,218,18,78,111,116,65,68,105,114,101,99,116, - 111,114,121,69,114,114,111,114,114,8,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,65,1,0,0,114,66,1,0, - 0,114,100,0,0,0,114,61,0,0,0,114,105,0,0,0, - 218,3,97,100,100,114,11,0,0,0,114,67,1,0,0,41, - 9,114,118,0,0,0,114,43,0,0,0,114,8,1,0,0, - 90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,99, - 111,110,116,101,110,116,115,114,41,1,0,0,114,116,0,0, - 0,114,29,1,0,0,114,17,1,0,0,90,8,110,101,119, - 95,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,69,1,0,0,203,5,0,0,115,34,0, - 0,0,0,2,6,1,2,1,22,1,18,3,10,3,12,1, - 12,7,6,1,8,1,16,1,4,1,18,2,4,1,12,1, - 6,1,12,1,122,22,70,105,108,101,70,105,110,100,101,114, - 46,95,102,105,108,108,95,99,97,99,104,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, - 0,7,0,0,0,115,18,0,0,0,135,0,135,1,102,2, - 100,1,100,2,132,8,125,2,124,2,83,0,41,3,97,20, - 1,0,0,65,32,99,108,97,115,115,32,109,101,116,104,111, - 100,32,119,104,105,99,104,32,114,101,116,117,114,110,115,32, - 97,32,99,108,111,115,117,114,101,32,116,111,32,117,115,101, - 32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111, - 107,10,32,32,32,32,32,32,32,32,119,104,105,99,104,32, - 119,105,108,108,32,114,101,116,117,114,110,32,97,110,32,105, - 110,115,116,97,110,99,101,32,117,115,105,110,103,32,116,104, - 101,32,115,112,101,99,105,102,105,101,100,32,108,111,97,100, - 101,114,115,32,97,110,100,32,116,104,101,32,112,97,116,104, - 10,32,32,32,32,32,32,32,32,99,97,108,108,101,100,32, - 111,110,32,116,104,101,32,99,108,111,115,117,114,101,46,10, - 10,32,32,32,32,32,32,32,32,73,102,32,116,104,101,32, - 112,97,116,104,32,99,97,108,108,101,100,32,111,110,32,116, - 104,101,32,99,108,111,115,117,114,101,32,105,115,32,110,111, - 116,32,97,32,100,105,114,101,99,116,111,114,121,44,32,73, - 109,112,111,114,116,69,114,114,111,114,32,105,115,10,32,32, - 32,32,32,32,32,32,114,97,105,115,101,100,46,10,10,32, - 32,32,32,32,32,32,32,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,19,0,0,0, - 115,34,0,0,0,116,0,124,0,131,1,115,20,116,1,100, - 1,124,0,100,2,141,2,130,1,136,0,124,0,102,1,136, - 1,158,2,142,0,83,0,41,3,122,45,80,97,116,104,32, - 104,111,111,107,32,102,111,114,32,105,109,112,111,114,116,108, - 105,98,46,109,97,99,104,105,110,101,114,121,46,70,105,108, - 101,70,105,110,100,101,114,46,122,30,111,110,108,121,32,100, - 105,114,101,99,116,111,114,105,101,115,32,97,114,101,32,115, - 117,112,112,111,114,116,101,100,114,47,0,0,0,41,2,114, - 55,0,0,0,114,117,0,0,0,114,47,0,0,0,169,2, - 114,193,0,0,0,114,68,1,0,0,114,3,0,0,0,114, - 6,0,0,0,218,24,112,97,116,104,95,104,111,111,107,95, - 102,111,114,95,70,105,108,101,70,105,110,100,101,114,244,5, - 0,0,115,6,0,0,0,0,2,8,1,12,1,122,54,70, - 105,108,101,70,105,110,100,101,114,46,112,97,116,104,95,104, - 111,111,107,46,60,108,111,99,97,108,115,62,46,112,97,116, - 104,95,104,111,111,107,95,102,111,114,95,70,105,108,101,70, - 105,110,100,101,114,114,3,0,0,0,41,3,114,193,0,0, - 0,114,68,1,0,0,114,75,1,0,0,114,3,0,0,0, - 114,74,1,0,0,114,6,0,0,0,218,9,112,97,116,104, - 95,104,111,111,107,234,5,0,0,115,4,0,0,0,0,10, - 14,6,122,20,70,105,108,101,70,105,110,100,101,114,46,112, - 97,116,104,95,104,111,111,107,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,12,0,0,0,100,1,160,0,124,0,106,1,161,1, - 83,0,41,2,78,122,16,70,105,108,101,70,105,110,100,101, - 114,40,123,33,114,125,41,41,2,114,61,0,0,0,114,43, - 0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,39,1,0,0,252,5,0,0, - 115,2,0,0,0,0,1,122,19,70,105,108,101,70,105,110, - 100,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, - 15,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,209,0,0,0,114,46,1,0,0,114, - 143,0,0,0,114,206,0,0,0,114,137,0,0,0,114,58, - 1,0,0,114,203,0,0,0,114,69,1,0,0,114,207,0, - 0,0,114,76,1,0,0,114,39,1,0,0,114,3,0,0, + 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,70,0,0,0,114,27,0,0,0, + 114,104,0,0,0,114,209,0,0,0,122,9,116,114,121,105, + 110,103,32,123,125,41,1,90,9,118,101,114,98,111,115,105, + 116,121,78,122,25,112,111,115,115,105,98,108,101,32,110,97, + 109,101,115,112,97,99,101,32,102,111,114,32,123,125,41,22, + 114,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, + 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, + 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, + 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, + 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, + 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,0, + 0,0,114,134,0,0,0,114,149,0,0,0,114,183,0,0, + 0,114,178,0,0,0,41,14,114,118,0,0,0,114,139,0, + 0,0,114,202,0,0,0,90,12,105,115,95,110,97,109,101, + 115,112,97,99,101,90,11,116,97,105,108,95,109,111,100,117, + 108,101,114,169,0,0,0,90,5,99,97,99,104,101,90,12, + 99,97,99,104,101,95,109,111,100,117,108,101,90,9,98,97, + 115,101,95,112,97,116,104,114,17,1,0,0,114,188,0,0, + 0,90,13,105,110,105,116,95,102,105,108,101,110,97,109,101, + 90,9,102,117,108,108,95,112,97,116,104,114,187,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 203,0,0,0,157,5,0,0,115,74,0,0,0,0,5,4, + 1,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, + 2,6,1,6,1,10,2,6,1,4,2,8,1,12,1,14, + 1,8,1,10,1,8,1,26,4,8,2,14,1,16,1,16, + 1,12,1,8,1,10,1,2,0,2,255,10,2,6,1,12, + 1,12,1,8,1,4,1,122,20,70,105,108,101,70,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, + 0,0,67,0,0,0,115,188,0,0,0,124,0,106,0,125, + 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, + 0,161,1,125,2,87,0,110,28,4,0,116,4,116,5,116, + 6,102,3,121,56,1,0,1,0,1,0,103,0,125,2,89, + 0,110,2,48,0,116,7,106,8,160,9,100,1,161,1,115, + 82,116,10,124,2,131,1,124,0,95,11,110,74,116,10,131, + 0,125,3,124,2,68,0,93,56,125,4,124,4,160,12,100, + 2,161,1,92,3,125,5,125,6,125,7,124,6,114,134,100, + 3,160,13,124,5,124,7,160,14,161,0,161,2,125,8,110, + 4,124,5,125,8,124,3,160,15,124,8,161,1,1,0,113, + 92,124,3,124,0,95,11,116,7,106,8,160,9,116,16,161, + 1,114,184,100,4,100,5,132,0,124,2,68,0,131,1,124, + 0,95,17,100,6,83,0,41,7,122,68,70,105,108,108,32, + 116,104,101,32,99,97,99,104,101,32,111,102,32,112,111,116, + 101,110,116,105,97,108,32,109,111,100,117,108,101,115,32,97, + 110,100,32,112,97,99,107,97,103,101,115,32,102,111,114,32, + 116,104,105,115,32,100,105,114,101,99,116,111,114,121,46,114, + 0,0,0,0,114,70,0,0,0,114,60,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,83,0,0,0,115,20,0,0,0,104,0,124,0, + 93,12,125,1,124,1,160,0,161,0,146,2,113,4,83,0, + 114,3,0,0,0,41,1,114,105,0,0,0,41,2,114,31, + 0,0,0,90,2,102,110,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,9,60,115,101,116,99,111,109,112, + 62,234,5,0,0,115,4,0,0,0,6,0,2,0,122,41, + 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, + 95,99,97,99,104,101,46,60,108,111,99,97,108,115,62,46, + 60,115,101,116,99,111,109,112,62,78,41,18,114,43,0,0, + 0,114,2,0,0,0,114,7,1,0,0,114,54,0,0,0, + 114,3,1,0,0,218,15,80,101,114,109,105,115,115,105,111, + 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101, + 99,116,111,114,121,69,114,114,111,114,114,8,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,65,1,0,0,114,66, + 1,0,0,114,100,0,0,0,114,61,0,0,0,114,105,0, + 0,0,218,3,97,100,100,114,11,0,0,0,114,67,1,0, + 0,41,9,114,118,0,0,0,114,43,0,0,0,114,8,1, + 0,0,90,21,108,111,119,101,114,95,115,117,102,102,105,120, + 95,99,111,110,116,101,110,116,115,114,41,1,0,0,114,116, + 0,0,0,114,29,1,0,0,114,17,1,0,0,90,8,110, + 101,119,95,110,97,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,69,1,0,0,205,5,0,0,115, + 34,0,0,0,0,2,6,1,2,1,22,1,18,3,10,3, + 12,1,12,7,6,1,8,1,16,1,4,1,18,2,4,1, + 12,1,6,1,12,1,122,22,70,105,108,101,70,105,110,100, + 101,114,46,95,102,105,108,108,95,99,97,99,104,101,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,7,0,0,0,115,18,0,0,0,135,0,135,1, + 102,2,100,1,100,2,132,8,125,2,124,2,83,0,41,3, + 97,20,1,0,0,65,32,99,108,97,115,115,32,109,101,116, + 104,111,100,32,119,104,105,99,104,32,114,101,116,117,114,110, + 115,32,97,32,99,108,111,115,117,114,101,32,116,111,32,117, + 115,101,32,111,110,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,10,32,32,32,32,32,32,32,32,119,104,105,99, + 104,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110, + 32,105,110,115,116,97,110,99,101,32,117,115,105,110,103,32, + 116,104,101,32,115,112,101,99,105,102,105,101,100,32,108,111, + 97,100,101,114,115,32,97,110,100,32,116,104,101,32,112,97, + 116,104,10,32,32,32,32,32,32,32,32,99,97,108,108,101, + 100,32,111,110,32,116,104,101,32,99,108,111,115,117,114,101, + 46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,104, + 101,32,112,97,116,104,32,99,97,108,108,101,100,32,111,110, + 32,116,104,101,32,99,108,111,115,117,114,101,32,105,115,32, + 110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,44, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,10, + 32,32,32,32,32,32,32,32,114,97,105,115,101,100,46,10, + 10,32,32,32,32,32,32,32,32,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,19,0, + 0,0,115,36,0,0,0,116,0,124,0,131,1,115,20,116, + 1,100,1,124,0,100,2,141,2,130,1,136,0,124,0,103, + 1,136,1,162,1,82,0,142,0,83,0,41,3,122,45,80, + 97,116,104,32,104,111,111,107,32,102,111,114,32,105,109,112, + 111,114,116,108,105,98,46,109,97,99,104,105,110,101,114,121, + 46,70,105,108,101,70,105,110,100,101,114,46,122,30,111,110, + 108,121,32,100,105,114,101,99,116,111,114,105,101,115,32,97, + 114,101,32,115,117,112,112,111,114,116,101,100,114,47,0,0, + 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, + 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, + 0,0,0,114,6,0,0,0,218,24,112,97,116,104,95,104, + 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100, + 101,114,246,5,0,0,115,6,0,0,0,0,2,8,1,12, + 1,122,54,70,105,108,101,70,105,110,100,101,114,46,112,97, + 116,104,95,104,111,111,107,46,60,108,111,99,97,108,115,62, + 46,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, + 105,108,101,70,105,110,100,101,114,114,3,0,0,0,41,3, + 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, + 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, + 112,97,116,104,95,104,111,111,107,236,5,0,0,115,4,0, + 0,0,0,10,14,6,122,20,70,105,108,101,70,105,110,100, + 101,114,46,112,97,116,104,95,104,111,111,107,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, + 106,1,161,1,83,0,41,2,78,122,16,70,105,108,101,70, + 105,110,100,101,114,40,123,33,114,125,41,41,2,114,61,0, + 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, + 254,5,0,0,115,2,0,0,0,0,1,122,19,70,105,108, + 101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,95, + 41,1,78,41,15,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,46, + 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, + 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, + 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,61,1,0,0,111,5,0,0,115,22,0, + 0,0,8,2,4,7,8,14,8,4,4,2,8,12,8,5, + 10,48,8,31,2,1,10,17,114,61,1,0,0,99,4,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, + 0,0,67,0,0,0,115,144,0,0,0,124,0,160,0,100, + 1,161,1,125,4,124,0,160,0,100,2,161,1,125,5,124, + 4,115,66,124,5,114,36,124,5,106,1,125,4,110,30,124, + 2,124,3,107,2,114,56,116,2,124,1,124,2,131,2,125, + 4,110,10,116,3,124,1,124,2,131,2,125,4,124,5,115, + 84,116,4,124,1,124,2,124,4,100,3,141,3,125,5,122, + 36,124,5,124,0,100,2,60,0,124,4,124,0,100,1,60, + 0,124,2,124,0,100,4,60,0,124,3,124,0,100,5,60, + 0,87,0,110,18,4,0,116,5,121,138,1,0,1,0,1, + 0,89,0,110,2,48,0,100,0,83,0,41,6,78,218,10, + 95,95,108,111,97,100,101,114,95,95,218,8,95,95,115,112, + 101,99,95,95,114,62,1,0,0,90,8,95,95,102,105,108, + 101,95,95,90,10,95,95,99,97,99,104,101,100,95,95,41, + 6,218,3,103,101,116,114,140,0,0,0,114,15,1,0,0, + 114,9,1,0,0,114,190,0,0,0,218,9,69,120,99,101, + 112,116,105,111,110,41,6,90,2,110,115,114,116,0,0,0, + 90,8,112,97,116,104,110,97,109,101,90,9,99,112,97,116, + 104,110,97,109,101,114,140,0,0,0,114,187,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,4,6, + 0,0,115,34,0,0,0,0,2,10,1,10,1,4,1,4, + 1,8,1,8,1,12,2,10,1,4,1,14,1,2,1,8, + 1,8,1,8,1,12,1,12,2,114,81,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,116,0,116,1, + 160,2,161,0,102,2,125,0,116,3,116,4,102,2,125,1, + 116,5,116,6,102,2,125,2,124,0,124,1,124,2,103,3, + 83,0,41,1,122,95,82,101,116,117,114,110,115,32,97,32, + 108,105,115,116,32,111,102,32,102,105,108,101,45,98,97,115, + 101,100,32,109,111,100,117,108,101,32,108,111,97,100,101,114, + 115,46,10,10,32,32,32,32,69,97,99,104,32,105,116,101, + 109,32,105,115,32,97,32,116,117,112,108,101,32,40,108,111, + 97,100,101,114,44,32,115,117,102,102,105,120,101,115,41,46, + 10,32,32,32,32,41,7,114,252,0,0,0,114,163,0,0, + 0,218,18,101,120,116,101,110,115,105,111,110,95,115,117,102, + 102,105,120,101,115,114,9,1,0,0,114,101,0,0,0,114, + 15,1,0,0,114,88,0,0,0,41,3,90,10,101,120,116, + 101,110,115,105,111,110,115,90,6,115,111,117,114,99,101,90, + 8,98,121,116,101,99,111,100,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,184,0,0,0,27,6,0, + 0,115,8,0,0,0,0,5,12,1,8,1,8,1,114,184, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 12,0,0,0,9,0,0,0,67,0,0,0,115,176,1,0, + 0,124,0,97,0,116,0,106,1,97,1,116,0,106,2,97, + 2,116,1,106,3,116,4,25,0,125,1,100,1,68,0,93, + 48,125,2,124,2,116,1,106,3,118,1,114,56,116,0,160, + 5,124,2,161,1,125,3,110,10,116,1,106,3,124,2,25, + 0,125,3,116,6,124,1,124,2,124,3,131,3,1,0,113, + 30,100,2,100,3,103,1,102,2,100,4,100,5,100,3,103, + 2,102,2,102,2,125,4,124,4,68,0,93,108,92,2,125, + 5,125,6,116,7,100,6,100,7,132,0,124,6,68,0,131, + 1,131,1,115,136,74,0,130,1,124,6,100,8,25,0,125, + 7,124,5,116,1,106,3,118,0,114,170,116,1,106,3,124, + 5,25,0,125,8,1,0,113,224,113,106,122,20,116,0,160, + 5,124,5,161,1,125,8,87,0,1,0,113,224,87,0,113, + 106,4,0,116,8,121,212,1,0,1,0,1,0,89,0,113, + 106,89,0,113,106,48,0,113,106,116,8,100,9,131,1,130, + 1,116,6,124,1,100,10,124,8,131,3,1,0,116,6,124, + 1,100,11,124,7,131,3,1,0,116,6,124,1,100,12,100, + 13,160,9,124,6,161,1,131,3,1,0,116,6,124,1,100, + 14,100,15,100,16,132,0,124,6,68,0,131,1,131,3,1, + 0,116,0,160,5,100,17,161,1,125,9,116,6,124,1,100, + 17,124,9,131,3,1,0,116,0,160,5,100,18,161,1,125, + 10,116,6,124,1,100,18,124,10,131,3,1,0,124,5,100, + 4,107,2,144,1,114,108,116,0,160,5,100,19,161,1,125, + 11,116,6,124,1,100,20,124,11,131,3,1,0,116,6,124, + 1,100,21,116,10,131,0,131,3,1,0,116,11,160,12,116, + 2,160,13,161,0,161,1,1,0,124,5,100,4,107,2,144, + 1,114,172,116,14,160,15,100,22,161,1,1,0,100,23,116, + 11,118,0,144,1,114,172,100,24,116,16,95,17,100,25,83, + 0,41,26,122,205,83,101,116,117,112,32,116,104,101,32,112, + 97,116,104,45,98,97,115,101,100,32,105,109,112,111,114,116, + 101,114,115,32,102,111,114,32,105,109,112,111,114,116,108,105, + 98,32,98,121,32,105,109,112,111,114,116,105,110,103,32,110, + 101,101,100,101,100,10,32,32,32,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,97,110,100,32,105, + 110,106,101,99,116,105,110,103,32,116,104,101,109,32,105,110, + 116,111,32,116,104,101,32,103,108,111,98,97,108,32,110,97, + 109,101,115,112,97,99,101,46,10,10,32,32,32,32,79,116, + 104,101,114,32,99,111,109,112,111,110,101,110,116,115,32,97, + 114,101,32,101,120,116,114,97,99,116,101,100,32,102,114,111, + 109,32,116,104,101,32,99,111,114,101,32,98,111,111,116,115, + 116,114,97,112,32,109,111,100,117,108,101,46,10,10,32,32, + 32,32,41,4,114,63,0,0,0,114,74,0,0,0,218,8, + 98,117,105,108,116,105,110,115,114,160,0,0,0,90,5,112, + 111,115,105,120,250,1,47,90,2,110,116,250,1,92,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,115,0,0,0,115,26,0,0,0,124,0,93,18, + 125,1,116,0,124,1,131,1,100,0,107,2,86,0,1,0, + 113,2,100,1,83,0,41,2,114,38,0,0,0,78,41,1, + 114,22,0,0,0,41,2,114,31,0,0,0,114,94,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,61,1,0,0,109,5,0,0,115,22,0,0,0,8,2, - 4,7,8,14,8,4,4,2,8,12,8,5,10,48,8,31, - 2,1,10,17,114,61,1,0,0,99,4,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, - 0,0,115,144,0,0,0,124,0,160,0,100,1,161,1,125, - 4,124,0,160,0,100,2,161,1,125,5,124,4,115,66,124, - 5,114,36,124,5,106,1,125,4,110,30,124,2,124,3,107, - 2,114,56,116,2,124,1,124,2,131,2,125,4,110,10,116, - 3,124,1,124,2,131,2,125,4,124,5,115,84,116,4,124, - 1,124,2,124,4,100,3,141,3,125,5,122,36,124,5,124, - 0,100,2,60,0,124,4,124,0,100,1,60,0,124,2,124, - 0,100,4,60,0,124,3,124,0,100,5,60,0,87,0,110, - 18,4,0,116,5,121,138,1,0,1,0,1,0,89,0,110, - 2,48,0,100,0,83,0,41,6,78,218,10,95,95,108,111, - 97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95, - 114,62,1,0,0,90,8,95,95,102,105,108,101,95,95,90, - 10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103, - 101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0, - 0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111, - 110,41,6,90,2,110,115,114,116,0,0,0,90,8,112,97, - 116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109, - 101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, - 95,117,112,95,109,111,100,117,108,101,2,6,0,0,115,34, - 0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8, - 1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8, - 1,12,1,12,2,114,81,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, - 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, - 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1, - 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, - 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, - 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, - 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, - 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, - 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, - 32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101, - 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, - 115,114,9,1,0,0,114,101,0,0,0,114,15,1,0,0, - 114,88,0,0,0,41,3,90,10,101,120,116,101,110,115,105, - 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, - 101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,184,0,0,0,25,6,0,0,115,8,0, - 0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, - 9,0,0,0,67,0,0,0,115,176,1,0,0,124,0,97, - 0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106, - 3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124, - 2,116,1,106,3,118,1,114,56,116,0,160,5,124,2,161, - 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, - 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, - 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, - 2,125,4,124,4,68,0,93,108,92,2,125,5,125,6,116, - 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, - 136,74,0,130,1,124,6,100,8,25,0,125,7,124,5,116, - 1,106,3,118,0,114,170,116,1,106,3,124,5,25,0,125, - 8,1,0,113,224,113,106,122,20,116,0,160,5,124,5,161, - 1,125,8,87,0,1,0,113,224,87,0,113,106,4,0,116, - 8,121,212,1,0,1,0,1,0,89,0,113,106,89,0,113, - 106,48,0,113,106,116,8,100,9,131,1,130,1,116,6,124, - 1,100,10,124,8,131,3,1,0,116,6,124,1,100,11,124, - 7,131,3,1,0,116,6,124,1,100,12,100,13,160,9,124, - 6,161,1,131,3,1,0,116,6,124,1,100,14,100,15,100, - 16,132,0,124,6,68,0,131,1,131,3,1,0,116,0,160, - 5,100,17,161,1,125,9,116,6,124,1,100,17,124,9,131, - 3,1,0,116,0,160,5,100,18,161,1,125,10,116,6,124, - 1,100,18,124,10,131,3,1,0,124,5,100,4,107,2,144, - 1,114,108,116,0,160,5,100,19,161,1,125,11,116,6,124, - 1,100,20,124,11,131,3,1,0,116,6,124,1,100,21,116, - 10,131,0,131,3,1,0,116,11,160,12,116,2,160,13,161, - 0,161,1,1,0,124,5,100,4,107,2,144,1,114,172,116, - 14,160,15,100,22,161,1,1,0,100,23,116,11,118,0,144, - 1,114,172,100,24,116,16,95,17,100,25,83,0,41,26,122, - 205,83,101,116,117,112,32,116,104,101,32,112,97,116,104,45, - 98,97,115,101,100,32,105,109,112,111,114,116,101,114,115,32, - 102,111,114,32,105,109,112,111,114,116,108,105,98,32,98,121, - 32,105,109,112,111,114,116,105,110,103,32,110,101,101,100,101, - 100,10,32,32,32,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,115,32,97,110,100,32,105,110,106,101,99, - 116,105,110,103,32,116,104,101,109,32,105,110,116,111,32,116, - 104,101,32,103,108,111,98,97,108,32,110,97,109,101,115,112, - 97,99,101,46,10,10,32,32,32,32,79,116,104,101,114,32, - 99,111,109,112,111,110,101,110,116,115,32,97,114,101,32,101, - 120,116,114,97,99,116,101,100,32,102,114,111,109,32,116,104, - 101,32,99,111,114,101,32,98,111,111,116,115,116,114,97,112, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,41,4, - 114,63,0,0,0,114,74,0,0,0,218,8,98,117,105,108, - 116,105,110,115,114,160,0,0,0,90,5,112,111,115,105,120, - 250,1,47,90,2,110,116,250,1,92,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,115, - 0,0,0,115,26,0,0,0,124,0,93,18,125,1,116,0, - 124,1,131,1,100,0,107,2,86,0,1,0,113,2,100,1, - 83,0,41,2,114,38,0,0,0,78,41,1,114,22,0,0, - 0,41,2,114,31,0,0,0,114,94,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,19,1,0, - 0,61,6,0,0,115,4,0,0,0,4,0,2,0,122,25, - 95,115,101,116,117,112,46,60,108,111,99,97,108,115,62,46, - 60,103,101,110,101,120,112,114,62,114,72,0,0,0,122,30, - 105,109,112,111,114,116,108,105,98,32,114,101,113,117,105,114, - 101,115,32,112,111,115,105,120,32,111,114,32,110,116,114,2, - 0,0,0,114,34,0,0,0,114,30,0,0,0,114,39,0, - 0,0,114,57,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,83,0,0,0, - 115,22,0,0,0,104,0,124,0,93,14,125,1,100,0,124, - 1,155,0,157,2,146,2,113,4,83,0,41,1,114,73,0, - 0,0,114,3,0,0,0,41,2,114,31,0,0,0,218,1, - 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,70,1,0,0,77,6,0,0,115,4,0,0,0,6,0, + 114,19,1,0,0,63,6,0,0,115,4,0,0,0,4,0, 2,0,122,25,95,115,101,116,117,112,46,60,108,111,99,97, - 108,115,62,46,60,115,101,116,99,111,109,112,62,90,7,95, - 116,104,114,101,97,100,90,8,95,119,101,97,107,114,101,102, - 90,6,119,105,110,114,101,103,114,192,0,0,0,114,7,0, - 0,0,122,4,46,112,121,119,122,6,95,100,46,112,121,100, - 84,78,41,18,114,134,0,0,0,114,8,0,0,0,114,163, - 0,0,0,114,31,1,0,0,114,125,0,0,0,90,18,95, - 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, - 101,114,129,0,0,0,218,3,97,108,108,114,117,0,0,0, - 114,35,0,0,0,114,13,0,0,0,114,21,1,0,0,114, - 167,0,0,0,114,82,1,0,0,114,101,0,0,0,114,186, - 0,0,0,114,191,0,0,0,114,195,0,0,0,41,12,218, - 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, - 108,101,90,11,115,101,108,102,95,109,111,100,117,108,101,90, - 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, - 117,105,108,116,105,110,95,109,111,100,117,108,101,90,10,111, - 115,95,100,101,116,97,105,108,115,90,10,98,117,105,108,116, - 105,110,95,111,115,114,30,0,0,0,114,34,0,0,0,90, - 9,111,115,95,109,111,100,117,108,101,90,13,116,104,114,101, - 97,100,95,109,111,100,117,108,101,90,14,119,101,97,107,114, - 101,102,95,109,111,100,117,108,101,90,13,119,105,110,114,101, - 103,95,109,111,100,117,108,101,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,36, - 6,0,0,115,78,0,0,0,0,8,4,1,6,1,6,3, - 10,1,8,1,10,1,12,2,10,1,14,3,22,1,12,2, - 22,1,8,1,10,1,10,1,6,2,2,1,10,1,10,1, - 12,1,12,2,8,1,12,1,12,1,18,1,22,3,10,1, - 12,3,10,1,12,3,10,1,10,1,12,3,14,1,14,1, - 10,1,10,1,10,1,114,89,1,0,0,99,1,0,0,0, + 108,115,62,46,60,103,101,110,101,120,112,114,62,114,72,0, + 0,0,122,30,105,109,112,111,114,116,108,105,98,32,114,101, + 113,117,105,114,101,115,32,112,111,115,105,120,32,111,114,32, + 110,116,114,2,0,0,0,114,34,0,0,0,114,30,0,0, + 0,114,39,0,0,0,114,57,0,0,0,99,1,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,50,0,0,0,116,0,124,0,131,1,1, - 0,116,1,131,0,125,1,116,2,106,3,160,4,116,5,106, - 6,124,1,142,0,103,1,161,1,1,0,116,2,106,7,160, - 8,116,9,161,1,1,0,100,1,83,0,41,2,122,41,73, - 110,115,116,97,108,108,32,116,104,101,32,112,97,116,104,45, - 98,97,115,101,100,32,105,109,112,111,114,116,32,99,111,109, - 112,111,110,101,110,116,115,46,78,41,10,114,89,1,0,0, - 114,184,0,0,0,114,8,0,0,0,114,51,1,0,0,114, - 167,0,0,0,114,61,1,0,0,114,76,1,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,186,0,0,0,114,45, - 1,0,0,41,2,114,88,1,0,0,90,17,115,117,112,112, - 111,114,116,101,100,95,108,111,97,100,101,114,115,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,105, - 110,115,116,97,108,108,101,6,0,0,115,8,0,0,0,0, - 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,59, - 0,0,0,41,1,78,41,3,78,78,78,41,2,114,72,0, - 0,0,114,72,0,0,0,41,1,84,41,1,78,41,1,78, - 41,63,114,127,0,0,0,114,12,0,0,0,90,37,95,67, - 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, - 80,76,65,84,70,79,82,77,83,95,66,89,84,69,83,95, - 75,69,89,114,11,0,0,0,114,13,0,0,0,114,20,0, - 0,0,114,26,0,0,0,114,28,0,0,0,114,37,0,0, - 0,114,46,0,0,0,114,48,0,0,0,114,52,0,0,0, - 114,53,0,0,0,114,55,0,0,0,114,58,0,0,0,114, - 68,0,0,0,218,4,116,121,112,101,218,8,95,95,99,111, - 100,101,95,95,114,162,0,0,0,114,18,0,0,0,114,148, - 0,0,0,114,17,0,0,0,114,23,0,0,0,114,236,0, - 0,0,114,91,0,0,0,114,87,0,0,0,114,101,0,0, - 0,114,88,0,0,0,90,23,68,69,66,85,71,95,66,89, - 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,90, - 27,79,80,84,73,77,73,90,69,68,95,66,89,84,69,67, - 79,68,69,95,83,85,70,70,73,88,69,83,114,97,0,0, - 0,114,102,0,0,0,114,108,0,0,0,114,112,0,0,0, - 114,114,0,0,0,114,136,0,0,0,114,143,0,0,0,114, - 152,0,0,0,114,156,0,0,0,114,158,0,0,0,114,165, - 0,0,0,114,170,0,0,0,114,171,0,0,0,114,176,0, - 0,0,218,6,111,98,106,101,99,116,114,185,0,0,0,114, - 190,0,0,0,114,191,0,0,0,114,208,0,0,0,114,221, - 0,0,0,114,239,0,0,0,114,9,1,0,0,114,15,1, - 0,0,114,21,1,0,0,114,252,0,0,0,114,22,1,0, - 0,114,43,1,0,0,114,45,1,0,0,114,61,1,0,0, - 114,81,1,0,0,114,184,0,0,0,114,89,1,0,0,114, - 91,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,60,109,111,100,117,108, - 101,62,1,0,0,0,115,126,0,0,0,4,22,4,1,4, - 1,2,1,2,255,4,4,8,17,8,5,8,5,8,6,8, - 6,8,12,8,10,8,9,8,5,8,7,8,9,10,22,10, - 127,0,17,16,1,12,2,4,1,4,2,6,2,6,2,8, - 2,16,71,8,40,8,19,8,12,8,12,8,28,8,17,8, - 33,8,28,8,24,10,13,10,10,10,11,8,14,6,3,4, - 1,2,255,12,68,14,64,14,29,16,127,0,17,14,72,18, - 45,18,26,4,3,18,53,14,63,14,42,14,127,0,20,14, - 127,0,22,10,23,8,11,8,65, + 83,0,0,0,115,22,0,0,0,104,0,124,0,93,14,125, + 1,100,0,124,1,155,0,157,2,146,2,113,4,83,0,41, + 1,114,73,0,0,0,114,3,0,0,0,41,2,114,31,0, + 0,0,218,1,115,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,70,1,0,0,79,6,0,0,115,4,0, + 0,0,6,0,2,0,122,25,95,115,101,116,117,112,46,60, + 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, + 62,90,7,95,116,104,114,101,97,100,90,8,95,119,101,97, + 107,114,101,102,90,6,119,105,110,114,101,103,114,192,0,0, + 0,114,7,0,0,0,122,4,46,112,121,119,122,6,95,100, + 46,112,121,100,84,78,41,18,114,134,0,0,0,114,8,0, + 0,0,114,163,0,0,0,114,31,1,0,0,114,125,0,0, + 0,90,18,95,98,117,105,108,116,105,110,95,102,114,111,109, + 95,110,97,109,101,114,129,0,0,0,218,3,97,108,108,114, + 117,0,0,0,114,35,0,0,0,114,13,0,0,0,114,21, + 1,0,0,114,167,0,0,0,114,82,1,0,0,114,101,0, + 0,0,114,186,0,0,0,114,191,0,0,0,114,195,0,0, + 0,41,12,218,17,95,98,111,111,116,115,116,114,97,112,95, + 109,111,100,117,108,101,90,11,115,101,108,102,95,109,111,100, + 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, + 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, + 101,90,10,111,115,95,100,101,116,97,105,108,115,90,10,98, + 117,105,108,116,105,110,95,111,115,114,30,0,0,0,114,34, + 0,0,0,90,9,111,115,95,109,111,100,117,108,101,90,13, + 116,104,114,101,97,100,95,109,111,100,117,108,101,90,14,119, + 101,97,107,114,101,102,95,109,111,100,117,108,101,90,13,119, + 105,110,114,101,103,95,109,111,100,117,108,101,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,6,95,115,101, + 116,117,112,38,6,0,0,115,78,0,0,0,0,8,4,1, + 6,1,6,3,10,1,8,1,10,1,12,2,10,1,14,3, + 22,1,12,2,22,1,8,1,10,1,10,1,6,2,2,1, + 10,1,10,1,12,1,12,2,8,1,12,1,12,1,18,1, + 22,3,10,1,12,3,10,1,12,3,10,1,10,1,12,3, + 14,1,14,1,10,1,10,1,10,1,114,89,1,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,67,0,0,0,115,50,0,0,0,116,0,124, + 0,131,1,1,0,116,1,131,0,125,1,116,2,106,3,160, + 4,116,5,106,6,124,1,142,0,103,1,161,1,1,0,116, + 2,106,7,160,8,116,9,161,1,1,0,100,1,83,0,41, + 2,122,41,73,110,115,116,97,108,108,32,116,104,101,32,112, + 97,116,104,45,98,97,115,101,100,32,105,109,112,111,114,116, + 32,99,111,109,112,111,110,101,110,116,115,46,78,41,10,114, + 89,1,0,0,114,184,0,0,0,114,8,0,0,0,114,51, + 1,0,0,114,167,0,0,0,114,61,1,0,0,114,76,1, + 0,0,218,9,109,101,116,97,95,112,97,116,104,114,186,0, + 0,0,114,45,1,0,0,41,2,114,88,1,0,0,90,17, + 115,117,112,112,111,114,116,101,100,95,108,111,97,100,101,114, + 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,8,95,105,110,115,116,97,108,108,103,6,0,0,115,8, + 0,0,0,0,2,8,1,6,1,20,1,114,91,1,0,0, + 41,1,114,59,0,0,0,41,1,78,41,3,78,78,78,41, + 2,114,72,0,0,0,114,72,0,0,0,41,1,84,41,1, + 78,41,1,78,41,63,114,127,0,0,0,114,12,0,0,0, + 90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,84, + 73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,89, + 84,69,83,95,75,69,89,114,11,0,0,0,114,13,0,0, + 0,114,20,0,0,0,114,26,0,0,0,114,28,0,0,0, + 114,37,0,0,0,114,46,0,0,0,114,48,0,0,0,114, + 52,0,0,0,114,53,0,0,0,114,55,0,0,0,114,58, + 0,0,0,114,68,0,0,0,218,4,116,121,112,101,218,8, + 95,95,99,111,100,101,95,95,114,162,0,0,0,114,18,0, + 0,0,114,148,0,0,0,114,17,0,0,0,114,23,0,0, + 0,114,236,0,0,0,114,91,0,0,0,114,87,0,0,0, + 114,101,0,0,0,114,88,0,0,0,90,23,68,69,66,85, + 71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73, + 88,69,83,90,27,79,80,84,73,77,73,90,69,68,95,66, + 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, + 114,97,0,0,0,114,102,0,0,0,114,108,0,0,0,114, + 112,0,0,0,114,114,0,0,0,114,136,0,0,0,114,143, + 0,0,0,114,152,0,0,0,114,156,0,0,0,114,158,0, + 0,0,114,165,0,0,0,114,170,0,0,0,114,171,0,0, + 0,114,176,0,0,0,218,6,111,98,106,101,99,116,114,185, + 0,0,0,114,190,0,0,0,114,191,0,0,0,114,208,0, + 0,0,114,221,0,0,0,114,239,0,0,0,114,9,1,0, + 0,114,15,1,0,0,114,21,1,0,0,114,252,0,0,0, + 114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114, + 61,1,0,0,114,81,1,0,0,114,184,0,0,0,114,89, + 1,0,0,114,91,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,60,109, + 111,100,117,108,101,62,1,0,0,0,115,126,0,0,0,4, + 22,4,1,4,1,2,1,2,255,4,4,8,17,8,5,8, + 5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,8, + 9,10,22,10,127,0,19,16,1,12,2,4,1,4,2,6, + 2,6,2,8,2,16,71,8,40,8,19,8,12,8,12,8, + 28,8,17,8,33,8,28,8,24,10,13,10,10,10,11,8, + 14,6,3,4,1,2,255,12,68,14,64,14,29,16,127,0, + 17,14,72,18,45,18,26,4,3,18,53,14,63,14,42,14, + 127,0,20,14,127,0,22,10,23,8,11,8,65, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index c0a0bf51de399..d413bab0de43a 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -81,7 +81,7 @@ static void *opcode_targets[256] = { &&TARGET_INPLACE_OR, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_LIST_TO_TUPLE, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, @@ -148,21 +148,21 @@ static void *opcode_targets[256] = { &&TARGET_SET_ADD, &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, - &&TARGET_BUILD_LIST_UNPACK, + &&_unknown_opcode, &&TARGET_BUILD_MAP_UNPACK, &&TARGET_BUILD_MAP_UNPACK_WITH_CALL, - &&TARGET_BUILD_TUPLE_UNPACK, - &&TARGET_BUILD_SET_UNPACK, + &&_unknown_opcode, + &&_unknown_opcode, &&TARGET_SETUP_ASYNC_WITH, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, - &&TARGET_BUILD_TUPLE_UNPACK_WITH_CALL, + &&_unknown_opcode, &&_unknown_opcode, &&TARGET_LOAD_METHOD, &&TARGET_CALL_METHOD, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_LIST_EXTEND, + &&TARGET_SET_UPDATE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, From webhook-mailer at python.org Thu Jan 23 09:07:17 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 23 Jan 2020 14:07:17 -0000 Subject: [Python-checkins] bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) Message-ID: https://github.com/python/cpython/commit/79f89e6e5a659846d1068e8b1bd8e491ccdef861 commit: 79f89e6e5a659846d1068e8b1bd8e491ccdef861 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-23T14:07:05Z summary: bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) * bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators files: A Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst M Lib/test/test_heapq.py M Modules/_heapqmodule.c diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 861ba7540df2b..6902573e8fa85 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -432,6 +432,37 @@ def test_heappop_mutating_heap(self): with self.assertRaises((IndexError, RuntimeError)): self.module.heappop(heap) + def test_comparison_operator_modifiying_heap(self): + # See bpo-39421: Strong references need to be taken + # when comparing objects as they can alter the heap + class EvilClass(int): + def __lt__(self, o): + heap.clear() + return NotImplemented + + heap = [] + self.module.heappush(heap, EvilClass(0)) + self.assertRaises(IndexError, self.module.heappushpop, heap, 1) + + def test_comparison_operator_modifiying_heap_two_heaps(self): + + class h(int): + def __lt__(self, o): + list2.clear() + return NotImplemented + + class g(int): + def __lt__(self, o): + list1.clear() + return NotImplemented + + list1, list2 = [], [] + + self.module.heappush(list1, h(0)) + self.module.heappush(list2, g(0)) + + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list1, g(1)) + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list2, h(1)) class TestErrorHandlingPython(TestErrorHandling, TestCase): module = py_heapq diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst new file mode 100644 index 0000000000000..bae008150ee12 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst @@ -0,0 +1,2 @@ +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index a84cade3aaa16..6bc18b5f82fb8 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -36,7 +36,11 @@ siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(newitem); + Py_INCREF(parent); cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -78,10 +82,13 @@ siftup(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos], - arr[childpos + 1], - Py_LT); + PyObject* a = arr[childpos]; + PyObject* b = arr[childpos + 1]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ @@ -264,7 +271,10 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item) return item; } - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); + PyObject* top = PyList_GET_ITEM(heap, 0); + Py_INCREF(top); + cmp = PyObject_RichCompareBool(top, item, Py_LT); + Py_DECREF(top); if (cmp < 0) return NULL; if (cmp == 0) { @@ -420,7 +430,11 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(parent); + Py_INCREF(newitem); cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -462,10 +476,13 @@ siftup_max(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos + 1], - arr[childpos], - Py_LT); + PyObject* a = arr[childpos + 1]; + PyObject* b = arr[childpos]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ From webhook-mailer at python.org Thu Jan 23 09:25:35 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 14:25:35 -0000 Subject: [Python-checkins] bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) Message-ID: https://github.com/python/cpython/commit/958064f8d2b84062b0582bbae911df8ccfc11fd6 commit: 958064f8d2b84062b0582bbae911df8ccfc11fd6 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-23T06:25:31-08:00 summary: bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) * bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators (cherry picked from commit 79f89e6e5a659846d1068e8b1bd8e491ccdef861) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst M Lib/test/test_heapq.py M Modules/_heapqmodule.c diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 2f8c648d84a58..7c3fb0210f69b 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -414,6 +414,37 @@ def test_heappop_mutating_heap(self): with self.assertRaises((IndexError, RuntimeError)): self.module.heappop(heap) + def test_comparison_operator_modifiying_heap(self): + # See bpo-39421: Strong references need to be taken + # when comparing objects as they can alter the heap + class EvilClass(int): + def __lt__(self, o): + heap.clear() + return NotImplemented + + heap = [] + self.module.heappush(heap, EvilClass(0)) + self.assertRaises(IndexError, self.module.heappushpop, heap, 1) + + def test_comparison_operator_modifiying_heap_two_heaps(self): + + class h(int): + def __lt__(self, o): + list2.clear() + return NotImplemented + + class g(int): + def __lt__(self, o): + list1.clear() + return NotImplemented + + list1, list2 = [], [] + + self.module.heappush(list1, h(0)) + self.module.heappush(list2, g(0)) + + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list1, g(1)) + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list2, h(1)) class TestErrorHandlingPython(TestErrorHandling, TestCase): module = py_heapq diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst new file mode 100644 index 0000000000000..bae008150ee12 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst @@ -0,0 +1,2 @@ +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index b499e1f668aae..0fb35ffe5ec48 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -29,7 +29,11 @@ siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(newitem); + Py_INCREF(parent); cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -71,10 +75,13 @@ siftup(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos], - arr[childpos + 1], - Py_LT); + PyObject* a = arr[childpos]; + PyObject* b = arr[childpos + 1]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ @@ -229,7 +236,10 @@ heappushpop(PyObject *self, PyObject *args) return item; } - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); + PyObject* top = PyList_GET_ITEM(heap, 0); + Py_INCREF(top); + cmp = PyObject_RichCompareBool(top, item, Py_LT); + Py_DECREF(top); if (cmp < 0) return NULL; if (cmp == 0) { @@ -383,7 +393,11 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(parent); + Py_INCREF(newitem); cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -425,10 +439,13 @@ siftup_max(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos + 1], - arr[childpos], - Py_LT); + PyObject* a = arr[childpos + 1]; + PyObject* b = arr[childpos]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ From python-checkins at python.org Thu Jan 23 09:31:09 2020 From: python-checkins at python.org (ernest.w.durbin.iii) Date: Thu, 23 Jan 2020 14:31:09 +0000 Subject: [Python-checkins] =?utf-8?q?test=3A_test_commit?= Message-ID: <20200123143109.1.01DF14ADFC5DD0AF@mg.python.org> https://hg.python.org/test/rev/e23b00a02c1b changeset: 250:e23b00a02c1b user: Ernest W. Durbin III date: Thu Jan 23 09:31:04 2020 -0500 summary: test commit files: README.txt | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/README.txt b/README.txt --- a/README.txt +++ b/README.txt @@ -1,6 +1,3 @@ Test repository for Python committers. https://docs.python.org/devguide/coredev.html - -Update and Test. -Test Update. -- Repository URL: https://hg.python.org/test From webhook-mailer at python.org Thu Jan 23 09:49:24 2020 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 23 Jan 2020 14:49:24 -0000 Subject: [Python-checkins] bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) (GH-18146) Message-ID: https://github.com/python/cpython/commit/c563f409ea30bcb0623d785428c9257917371b76 commit: c563f409ea30bcb0623d785428c9257917371b76 branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2020-01-23T09:49:19-05:00 summary: bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) (GH-18146) (cherry picked from commit 79f89e6e5a659846d1068e8b1bd8e491ccdef861) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst M Lib/test/test_heapq.py M Modules/_heapqmodule.c diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 2f8c648d84a58..7c3fb0210f69b 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -414,6 +414,37 @@ def test_heappop_mutating_heap(self): with self.assertRaises((IndexError, RuntimeError)): self.module.heappop(heap) + def test_comparison_operator_modifiying_heap(self): + # See bpo-39421: Strong references need to be taken + # when comparing objects as they can alter the heap + class EvilClass(int): + def __lt__(self, o): + heap.clear() + return NotImplemented + + heap = [] + self.module.heappush(heap, EvilClass(0)) + self.assertRaises(IndexError, self.module.heappushpop, heap, 1) + + def test_comparison_operator_modifiying_heap_two_heaps(self): + + class h(int): + def __lt__(self, o): + list2.clear() + return NotImplemented + + class g(int): + def __lt__(self, o): + list1.clear() + return NotImplemented + + list1, list2 = [], [] + + self.module.heappush(list1, h(0)) + self.module.heappush(list2, g(0)) + + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list1, g(1)) + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list2, h(1)) class TestErrorHandlingPython(TestErrorHandling, TestCase): module = py_heapq diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst new file mode 100644 index 0000000000000..bae008150ee12 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst @@ -0,0 +1,2 @@ +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index b499e1f668aae..0fb35ffe5ec48 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -29,7 +29,11 @@ siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(newitem); + Py_INCREF(parent); cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -71,10 +75,13 @@ siftup(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos], - arr[childpos + 1], - Py_LT); + PyObject* a = arr[childpos]; + PyObject* b = arr[childpos + 1]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ @@ -229,7 +236,10 @@ heappushpop(PyObject *self, PyObject *args) return item; } - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); + PyObject* top = PyList_GET_ITEM(heap, 0); + Py_INCREF(top); + cmp = PyObject_RichCompareBool(top, item, Py_LT); + Py_DECREF(top); if (cmp < 0) return NULL; if (cmp == 0) { @@ -383,7 +393,11 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(parent); + Py_INCREF(newitem); cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -425,10 +439,13 @@ siftup_max(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos + 1], - arr[childpos], - Py_LT); + PyObject* a = arr[childpos + 1]; + PyObject* b = arr[childpos]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ From webhook-mailer at python.org Thu Jan 23 10:22:30 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 15:22:30 -0000 Subject: [Python-checkins] bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) Message-ID: https://github.com/python/cpython/commit/993811ffe75c2573f97fb3fd1414b34609b8c8db commit: 993811ffe75c2573f97fb3fd1414b34609b8c8db branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-23T07:22:25-08:00 summary: bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) * bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators (cherry picked from commit 79f89e6e5a659846d1068e8b1bd8e491ccdef861) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst M Lib/test/test_heapq.py M Modules/_heapqmodule.c diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 861ba7540df2b..6902573e8fa85 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -432,6 +432,37 @@ def test_heappop_mutating_heap(self): with self.assertRaises((IndexError, RuntimeError)): self.module.heappop(heap) + def test_comparison_operator_modifiying_heap(self): + # See bpo-39421: Strong references need to be taken + # when comparing objects as they can alter the heap + class EvilClass(int): + def __lt__(self, o): + heap.clear() + return NotImplemented + + heap = [] + self.module.heappush(heap, EvilClass(0)) + self.assertRaises(IndexError, self.module.heappushpop, heap, 1) + + def test_comparison_operator_modifiying_heap_two_heaps(self): + + class h(int): + def __lt__(self, o): + list2.clear() + return NotImplemented + + class g(int): + def __lt__(self, o): + list1.clear() + return NotImplemented + + list1, list2 = [], [] + + self.module.heappush(list1, h(0)) + self.module.heappush(list2, g(0)) + + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list1, g(1)) + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list2, h(1)) class TestErrorHandlingPython(TestErrorHandling, TestCase): module = py_heapq diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst new file mode 100644 index 0000000000000..bae008150ee12 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst @@ -0,0 +1,2 @@ +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index a84cade3aaa16..6bc18b5f82fb8 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -36,7 +36,11 @@ siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(newitem); + Py_INCREF(parent); cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -78,10 +82,13 @@ siftup(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos], - arr[childpos + 1], - Py_LT); + PyObject* a = arr[childpos]; + PyObject* b = arr[childpos + 1]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ @@ -264,7 +271,10 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item) return item; } - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); + PyObject* top = PyList_GET_ITEM(heap, 0); + Py_INCREF(top); + cmp = PyObject_RichCompareBool(top, item, Py_LT); + Py_DECREF(top); if (cmp < 0) return NULL; if (cmp == 0) { @@ -420,7 +430,11 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(parent); + Py_INCREF(newitem); cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -462,10 +476,13 @@ siftup_max(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos + 1], - arr[childpos], - Py_LT); + PyObject* a = arr[childpos + 1]; + PyObject* b = arr[childpos]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ From webhook-mailer at python.org Thu Jan 23 10:30:04 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 23 Jan 2020 15:30:04 -0000 Subject: [Python-checkins] bpo-17005: Add a class to perform topological sorting to the standard library (GH-11583) Message-ID: https://github.com/python/cpython/commit/99e6c260d60655f3d2885af545cbc220b808d492 commit: 99e6c260d60655f3d2885af545cbc220b808d492 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-23T15:29:52Z summary: bpo-17005: Add a class to perform topological sorting to the standard library (GH-11583) Co-Authored-By: Tim Peters files: A Doc/myfile.bz2 A Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst M Doc/library/functools.rst M Doc/whatsnew/3.9.rst M Lib/functools.py M Lib/test/test_functools.py diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index bb7aac42daca7..8c408923b70a7 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -8,10 +8,16 @@ .. moduleauthor:: Raymond Hettinger .. moduleauthor:: Nick Coghlan .. moduleauthor:: ?ukasz Langa +.. moduleauthor:: Pablo Galindo .. sectionauthor:: Peter Harris **Source code:** :source:`Lib/functools.py` +.. testsetup:: default + + import functools + from functools import * + -------------- The :mod:`functools` module is for higher-order functions: functions that act on @@ -512,6 +518,192 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.8 +.. class:: TopologicalSorter(graph=None) + + Provides functionality to topologically sort a graph of hashable nodes. + + A topological order is a linear ordering of the vertices in a graph such that for + every directed edge u -> v from vertex u to vertex v, vertex u comes before vertex + v in the ordering. For instance, the vertices of the graph may represent tasks to + be performed, and the edges may represent constraints that one task must be + performed before another; in this example, a topological ordering is just a valid + sequence for the tasks. A complete topological ordering is possible if and only if + the graph has no directed cycles, that is, if it is a directed acyclic graph. + + If the optional *graph* argument is provided it must be a dictionary representing + a directed acyclic graph where the keys are nodes and the values are iterables of + all predecessors of that node in the graph (the nodes that have edges that point + to the value in the key). Additional nodes can be added to the graph using the + :meth:`~TopologicalSorter.add` method. + + In the general case, the steps required to perform the sorting of a given graph + are as follows: + + * Create an instance of the :class:`TopologicalSorter` with an optional initial graph. + * Add additional nodes to the graph. + * Call :meth:`~TopologicalSorter.prepare` on the graph. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over the + nodes returned by :meth:`~TopologicalSorter.get_ready` and process them. + Call :meth:`~TopologicalSorter.done` on each node as it finishes processing. + + In case just an immediate sorting of the nodes in the graph is required and + no parallelism is involved, the convenience method :meth:`TopologicalSorter.static_order` + can be used directly. For example, this method can be used to implement a simple + version of the C3 linearization algorithm used by Python to calculate the Method + Resolution Order (MRO) of a derived class: + + .. doctest:: + + >>> class A: pass + >>> class B(A): pass + >>> class C(A): pass + >>> class D(B, C): pass + + >>> D.__mro__ + (, , , , ) + + >>> graph = {D: {B, C}, C: {A}, B: {A}, A:{object}} + >>> ts = TopologicalSorter(graph) + >>> topological_order = tuple(ts.static_order()) + >>> tuple(reversed(topological_order)) + (, , , , ) + + The class is designed to easily support parallel processing of the nodes as they + become ready. For instance:: + + topological_sorter = TopologicalSorter() + + # Add nodes to 'topological_sorter'... + + topological_sorter.prepare() + while topological_sorter.is_active(): + for node in topological_sorter.get_ready(): + # Worker threads or processes take nodes to work on off the + # 'task_queue' queue. + task_queue.put(node) + + # When the work for a node is done, workers put the node in + # 'finalized_tasks_queue' so we can get more nodes to work on. + # The definition of 'is_active()' guarantees that, at this point, at + # least one node has been placed on 'task_queue' that hasn't yet + # been passed to 'done()', so this blocking 'get()' must (eventually) + # succeed. After calling 'done()', we loop back to call 'get_ready()' + # again, so put newly freed nodes on 'task_queue' as soon as + # logically possible. + node = finalized_tasks_queue.get() + topological_sorter.done(node) + + .. method:: add(node, *predecessors) + + Add a new node and its predecessors to the graph. Both the *node* and + all elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of dependencies + will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not + provided) or to provide a dependency twice. If a node that has not been + provided before is included among *predecessors* it will be automatically added + to the graph with no predecessors of its own. + + Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`. + + .. method:: prepare() + + Mark the graph as finished and check for cycles in the graph. If any cycle is + detected, :exc:`CycleError` will be raised, but + :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many nodes + as possible until cycles block more progress. After a call to this function, + the graph cannot be modified, and therefore no more nodes can be added using + :meth:`~TopologicalSorter.add`. + + .. method:: is_active() + + Returns ``True`` if more progress can be made and ``False`` otherwise. Progress + can be made if cycles do not block the resolution and either there are still + nodes ready that haven't yet been returned by + :meth:`TopologicalSorter.get_ready` or the number of nodes marked + :meth:`TopologicalSorter.done` is less than the number that have been returned + by :meth:`TopologicalSorter.get_ready`. + + The :meth:`~TopologicalSorter.__bool__` method of this class defers to this + function, so instead of:: + + if ts.is_active(): + ... + + if possible to simply do:: + + if ts: + ... + + Raises :exc:`ValueError` if called without calling :meth:`~TopologicalSorter.prepare` + previously. + + .. method:: done(*nodes) + + Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as + processed, unblocking any successor of each node in *nodes* for being returned + in the future by a call to :meth:`TopologicalSorter.get_ready`. + + Raises :exc:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method or if a node was not added to the + graph by using :meth:`TopologicalSorter.add`, if called without calling + :meth:`~TopologicalSorter.prepare` or if node has not yet been returned by + :meth:`~TopologicalSorter.get_ready`. + + .. method:: get_ready() + + Returns a ``tuple`` with all the nodes that are ready. Initially it returns all + nodes with no predecessors, and once those are marked as processed by calling + :meth:`TopologicalSorter.done`, further calls will return all new nodes that + have all their predecessors already processed. Once no more progress can be + made, empty tuples are returned. + made. + + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. + + .. method:: static_order() + + Returns an iterable of nodes in a topological order. Using this method + does not require to call :meth:`TopologicalSorter.prepare` or + :meth:`TopologicalSorter.done`. This method is equivalent to:: + + def static_order(self): + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) + + The particular order that is returned may depend on the specific order in + which the items were inserted in the graph. For example: + + .. doctest:: + + >>> ts = TopologicalSorter() + >>> ts.add(3, 2, 1) + >>> ts.add(1, 0) + >>> print([*ts.static_order()]) + [2, 0, 1, 3] + + >>> ts2 = TopologicalSorter() + >>> ts2.add(1, 0) + >>> ts2.add(3, 2, 1) + >>> print([*ts2.static_order()]) + [0, 2, 1, 3] + + This is due to the fact that "0" and "2" are in the same level in the graph (they + would have been returned in the same call to :meth:`~TopologicalSorter.get_ready`) + and the order between them is determined by the order of insertion. + + + If any cycle is detected, :exc:`CycleError` will be raised. + + .. versionadded:: 3.9 + + .. function:: update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) Update a *wrapper* function to look like the *wrapped* function. The optional @@ -621,3 +813,19 @@ differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` are not created automatically. Also, :class:`partial` objects defined in classes behave like static methods and do not transform into bound methods during instance attribute look-up. + + +Exceptions +---------- +The :mod:`functools` module defines the following exception classes: + +.. exception:: CycleError + + Subclass of :exc:`ValueError` raised by :meth:`TopologicalSorter.prepare` if cycles exist + in the working graph. If multiple cycles exist, only one undefined choice among them will + be reported and included in the exception. + + The detected cycle can be accessed via the second element in the :attr:`~CycleError.args` + attribute of the exception instance and consists in a list of nodes, such that each node is, + in the graph, an immediate predecessor of the next node in the list. In the reported list, + the first and the last node will be the same, to make it clear that it is cyclic. diff --git a/Doc/myfile.bz2 b/Doc/myfile.bz2 new file mode 100644 index 0000000000000..7ada20f60926b Binary files /dev/null and b/Doc/myfile.bz2 differ diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index d9c545adc43d6..a6e938faa991e 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -166,6 +166,13 @@ ftplib if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +functools +--------- + +Add the :class:`functools.TopologicalSorter` class to offer functionality to perform +topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and Larry +Hastings in :issue:`17005`.) + gc -- diff --git a/Lib/functools.py b/Lib/functools.py index 2c01b2e59524b..050bec8605117 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -10,8 +10,9 @@ # See C source code for _functools credits/copyright __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', - 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', - 'partialmethod', 'singledispatch', 'singledispatchmethod'] + 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', + 'TopologicalSorter', 'CycleError', + 'partial', 'partialmethod', 'singledispatch', 'singledispatchmethod'] from abc import get_cache_token from collections import namedtuple @@ -192,6 +193,250 @@ def total_ordering(cls): setattr(cls, opname, opfunc) return cls +################################################################################ +### topological sort +################################################################################ + +_NODE_OUT = -1 +_NODE_DONE = -2 + + +class _NodeInfo: + __slots__ = 'node', 'npredecessors', 'successors' + + def __init__(self, node): + # The node this class is augmenting. + self.node = node + + # Number of predecessors, generally >= 0. When this value falls to 0, + # and is returned by get_ready(), this is set to _NODE_OUT and when the + # node is marked done by a call to done(), set to _NODE_DONE. + self.npredecessors = 0 + + # List of successor nodes. The list can contain duplicated elements as + # long as they're all reflected in the successor's npredecessors attribute). + self.successors = [] + + +class CycleError(ValueError): + """Subclass of ValueError raised by TopologicalSorterif cycles exist in the graph + + If multiple cycles exist, only one undefined choice among them will be reported + and included in the exception. The detected cycle can be accessed via the second + element in the *args* attribute of the exception instance and consists in a list + of nodes, such that each node is, in the graph, an immediate predecessor of the + next node in the list. In the reported list, the first and the last node will be + the same, to make it clear that it is cyclic. + """ + pass + + +class TopologicalSorter: + """Provides functionality to topologically sort a graph of hashable nodes""" + + def __init__(self, graph=None): + self._node2info = {} + self._ready_nodes = None + self._npassedout = 0 + self._nfinished = 0 + + if graph is not None: + for node, predecessors in graph.items(): + self.add(node, *predecessors) + + def _get_nodeinfo(self, node): + if (result := self._node2info.get(node)) is None: + self._node2info[node] = result = _NodeInfo(node) + return result + + def add(self, node, *predecessors): + """Add a new node and its predecessors to the graph. + + Both the *node* and all elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of dependencies + will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not provided) + as well as provide a dependency twice. If a node that has not been provided before + is included among *predecessors* it will be automatically added to the graph with + no predecessors of its own. + + Raises ValueError if called after "prepare". + """ + if self._ready_nodes is not None: + raise ValueError("Nodes cannot be added after a call to prepare()") + + # Create the node -> predecessor edges + nodeinfo = self._get_nodeinfo(node) + nodeinfo.npredecessors += len(predecessors) + + # Create the predecessor -> node edges + for pred in predecessors: + pred_info = self._get_nodeinfo(pred) + pred_info.successors.append(node) + + def prepare(self): + """Mark the graph as finished and check for cycles in the graph. + + If any cycle is detected, "CycleError" will be raised, but "get_ready" can + still be used to obtain as many nodes as possible until cycles block more + progress. After a call to this function, the graph cannot be modified and + therefore no more nodes can be added using "add". + """ + if self._ready_nodes is not None: + raise ValueError("cannot prepare() more than once") + + self._ready_nodes = [i.node for i in self._node2info.values() + if i.npredecessors == 0] + # ready_nodes is set before we look for cycles on purpose: + # if the user wants to catch the CycleError, that's fine, + # they can continue using the instance to grab as many + # nodes as possible before cycles block more progress + cycle = self._find_cycle() + if cycle: + raise CycleError(f"nodes are in a cycle", cycle) + + def get_ready(self): + """Return a tuple of all the nodes that are ready. + + Initially it returns all nodes with no predecessors; once those are marked + as processed by calling "done", further calls will return all new nodes that + have all their predecessors already processed. Once no more progress can be made, + empty tuples are returned. + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + # Get the nodes that are ready and mark them + result = tuple(self._ready_nodes) + n2i = self._node2info + for node in result: + n2i[node].npredecessors = _NODE_OUT + + # Clean the list of nodes that are ready and update + # the counter of nodes that we have returned. + self._ready_nodes.clear() + self._npassedout += len(result) + + return result + + def is_active(self): + """Return True if more progress can be made and ``False`` otherwise. + + Progress can be made if cycles do not block the resolution and either there + are still nodes ready that haven't yet been returned by "get_ready" or the + number of nodes marked "done" is less than the number that have been returned + by "get_ready". + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + return self._nfinished < self._npassedout or bool(self._ready_nodes) + + def __bool__(self): + return self.is_active() + + def done(self, *nodes): + """Marks a set of nodes returned by "get_ready" as processed. + + This method unblocks any successor of each node in *nodes* for being returned + in the future by a a call to "get_ready" + + Raises :exec:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method, if a node was not added to the + graph by using "add" or if called without calling "prepare" previously or if + node has not yet been returned by "get_ready". + """ + + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + n2i = self._node2info + + for node in nodes: + + # Check if we know about this node (it was added previously using add() + if (nodeinfo := n2i.get(node)) is None: + raise ValueError(f"node {node!r} was not added using add()") + + # If the node has not being returned (marked as ready) previously, inform the user. + stat = nodeinfo.npredecessors + if stat != _NODE_OUT: + if stat >= 0: + raise ValueError(f"node {node!r} was not passed out (still not ready)") + elif stat == _NODE_DONE: + raise ValueError(f"node {node!r} was already marked done") + else: + assert False, f"node {node!r}: unknown status {stat}" + + # Mark the node as processed + nodeinfo.npredecessors = _NODE_DONE + + # Go to all the successors and reduce the number of predecessors, collecting all the ones + # that are ready to be returned in the next get_ready() call. + for successor in nodeinfo.successors: + successor_info = n2i[successor] + successor_info.npredecessors -= 1 + if successor_info.npredecessors == 0: + self._ready_nodes.append(successor) + self._nfinished += 1 + + def _find_cycle(self): + n2i = self._node2info + stack = [] + itstack = [] + seen = set() + node2stacki = {} + + for node in n2i: + if node in seen: + continue + + while True: + if node in seen: + # If we have seen already the node and is in the + # current stack we have found a cycle. + if node in node2stacki: + return stack[node2stacki[node]:] + [node] + # else go on to get next successor + else: + seen.add(node) + itstack.append(iter(n2i[node].successors).__next__) + node2stacki[node] = len(stack) + stack.append(node) + + # Backtrack to the topmost stack entry with + # at least another successor. + while stack: + try: + node = itstack[-1]() + break + except StopIteration: + del node2stacki[stack.pop()] + itstack.pop() + else: + break + return None + + def static_order(self): + """Returns an iterable of nodes in a topological order. + + The particular order that is returned may depend on the specific + order in which the items were inserted in the graph. + + Using this method does not require to call "prepare" or "done". If any + cycle is detected, :exc:`CycleError` will be raised. + """ + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) + ################################################################################ ### cmp_to_key() function converter diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index a97ca398e77a3..9503f4086b1cb 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -3,7 +3,7 @@ import collections import collections.abc import copy -from itertools import permutations +from itertools import permutations, chain import pickle from random import choice import sys @@ -13,9 +13,12 @@ import typing import unittest import unittest.mock +import os from weakref import proxy import contextlib +from test.support.script_helper import assert_python_ok + import functools py_functools = support.import_fresh_module('functools', blocked=['_functools']) @@ -1158,6 +1161,275 @@ def __eq__(self, other): return self.value == other.value +class TestTopologicalSort(unittest.TestCase): + + def _test_graph(self, graph, expected): + + def static_order_with_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + for node in nodes: + ts.done(node) + yield nodes + + ts = functools.TopologicalSorter(graph) + self.assertEqual(list(static_order_with_groups(ts)), list(expected)) + + ts = functools.TopologicalSorter(graph) + self.assertEqual(list(ts.static_order()), list(chain(*expected))) + + def _assert_cycle(self, graph, cycle): + ts = functools.TopologicalSorter() + for node, dependson in graph.items(): + ts.add(node, *dependson) + try: + ts.prepare() + except functools.CycleError as e: + msg, seq = e.args + self.assertIn(' '.join(map(str, cycle)), + ' '.join(map(str, seq * 2))) + else: + raise + + def test_simple_cases(self): + self._test_graph( + {2: {11}, + 9: {11, 8}, + 10: {11, 3}, + 11: {7, 5}, + 8: {7, 3}}, + [(3, 5, 7), (11, 8), (2, 10, 9)] + ) + + self._test_graph({1: {}}, [(1,)]) + + self._test_graph({x: {x+1} for x in range(10)}, + [(x,) for x in range(10, -1, -1)]) + + self._test_graph({2: {3}, 3: {4}, 4: {5}, 5: {1}, + 11: {12}, 12: {13}, 13: {14}, 14: {15}}, + [(1, 15), (5, 14), (4, 13), (3, 12), (2, 11)]) + + self._test_graph({ + 0: [1, 2], + 1: [3], + 2: [5, 6], + 3: [4], + 4: [9], + 5: [3], + 6: [7], + 7: [8], + 8: [4], + 9: [] + }, + [(9,), (4,), (3, 8), (1, 5, 7), (6,), (2,), (0,)] + ) + + self._test_graph({ + 0: [1, 2], + 1: [], + 2: [3], + 3: [] + }, + [(1, 3), (2,), (0,)] + ) + + self._test_graph({ + 0: [1, 2], + 1: [], + 2: [3], + 3: [], + 4: [5], + 5: [6], + 6: [] + }, + [(1, 3, 6), (2, 5), (0, 4)] + ) + + def test_no_dependencies(self): + self._test_graph( + {1: {2}, + 3: {4}, + 5: {6}}, + [(2, 4, 6), (1, 3, 5)] + ) + + self._test_graph( + {1: set(), + 3: set(), + 5: set()}, + [(1, 3, 5)] + ) + + def test_the_node_multiple_times(self): + # Test same node multiple times in dependencies + self._test_graph({1: {2}, 3: {4}, 0: [2, 4, 4, 4, 4, 4]}, + [(2, 4), (1, 3, 0)]) + + # Test adding the same dependency multiple times + ts = functools.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 2) + ts.add(1, 2) + self.assertEqual([*ts.static_order()], [2, 1]) + + def test_graph_with_iterables(self): + dependson = (2*x + 1 for x in range(5)) + ts = functools.TopologicalSorter({0: dependson}) + self.assertEqual(list(ts.static_order()), [1, 3, 5, 7, 9, 0]) + + def test_add_dependencies_for_same_node_incrementally(self): + # Test same node multiple times + ts = functools.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 3) + ts.add(1, 4) + ts.add(1, 5) + + ts2 = functools.TopologicalSorter({1: {2, 3, 4, 5}}) + self.assertEqual([*ts.static_order()], [*ts2.static_order()]) + + def test_empty(self): + self._test_graph({}, []) + + def test_cycle(self): + # Self cycle + self._assert_cycle({1: {1}}, [1, 1]) + # Simple cycle + self._assert_cycle({1: {2}, 2: {1}}, [1, 2, 1]) + # Indirect cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}}, [1, 3, 2, 1]) + # not all elements involved in a cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}, 5: {4}, 4: {6}}, [1, 3, 2, 1]) + # Multiple cycles + self._assert_cycle({1: {2}, 2: {1}, 3: {4}, 4: {5}, 6: {7}, 7: {6}}, + [1, 2, 1]) + # Cycle in the middle of the graph + self._assert_cycle({1: {2}, 2: {3}, 3: {2, 4}, 4: {5}}, [3, 2]) + + def test_calls_before_prepare(self): + ts = functools.TopologicalSorter() + + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.get_ready() + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.done(3) + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.is_active() + + def test_prepare_multiple_times(self): + ts = functools.TopologicalSorter() + ts.prepare() + with self.assertRaisesRegex(ValueError, r"cannot prepare\(\) more than once"): + ts.prepare() + + def test_invalid_nodes_in_done(self): + ts = functools.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3, 4) + ts.prepare() + ts.get_ready() + + with self.assertRaisesRegex(ValueError, "node 2 was not passed out"): + ts.done(2) + with self.assertRaisesRegex(ValueError, r"node 24 was not added using add\(\)"): + ts.done(24) + + def test_done(self): + ts = functools.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3) + ts.prepare() + + self.assertEqual(ts.get_ready(), (3, 4)) + # If we don't mark anything as done, get_ready() returns nothing + self.assertEqual(ts.get_ready(), ()) + ts.done(3) + # Now 2 becomes available as 3 is done + self.assertEqual(ts.get_ready(), (2,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(4) + ts.done(2) + # Only 1 is missing + self.assertEqual(ts.get_ready(), (1,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(1) + self.assertEqual(ts.get_ready(), ()) + self.assertFalse(ts.is_active()) + + def test_is_active(self): + ts = functools.TopologicalSorter() + ts.add(1, 2) + ts.prepare() + + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (2,)) + self.assertTrue(ts.is_active()) + ts.done(2) + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (1,)) + self.assertTrue(ts.is_active()) + ts.done(1) + self.assertFalse(ts.is_active()) + + def test_not_hashable_nodes(self): + ts = functools.TopologicalSorter() + self.assertRaises(TypeError, ts.add, dict(), 1) + self.assertRaises(TypeError, ts.add, 1, dict()) + self.assertRaises(TypeError, ts.add, dict(), dict()) + + def test_order_of_insertion_does_not_matter_between_groups(self): + def get_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + ts.done(*nodes) + yield set(nodes) + + ts = functools.TopologicalSorter() + ts.add(3, 2, 1) + ts.add(1, 0) + ts.add(4, 5) + ts.add(6, 7) + ts.add(4, 7) + + ts2 = functools.TopologicalSorter() + ts2.add(1, 0) + ts2.add(3, 2, 1) + ts2.add(4, 7) + ts2.add(6, 7) + ts2.add(4, 5) + + self.assertEqual(list(get_groups(ts)), list(get_groups(ts2))) + + def test_static_order_does_not_change_with_the_hash_seed(self): + def check_order_with_hash_seed(seed): + code = """if 1: + import functools + ts = functools.TopologicalSorter() + ts.add('blech', 'bluch', 'hola') + ts.add('abcd', 'blech', 'bluch', 'a', 'b') + ts.add('a', 'a string', 'something', 'b') + ts.add('bluch', 'hola', 'abcde', 'a', 'b') + print(list(ts.static_order())) + """ + env = os.environ.copy() + # signal to assert_python not to do a copy + # of os.environ on its own + env['__cleanenv'] = True + env['PYTHONHASHSEED'] = str(seed) + out = assert_python_ok('-c', code, **env) + return out + + run1 = check_order_with_hash_seed(1234) + run2 = check_order_with_hash_seed(31415) + + self.assertNotEqual(run1, "") + self.assertNotEqual(run2, "") + self.assertEqual(run1, run2) + + class TestLRU: def test_lru(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst new file mode 100644 index 0000000000000..e5336437754af --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst @@ -0,0 +1,3 @@ +Add :class:`functools.TopologicalSorter` to the :mod:`functools` module to +offers functionality to perform topological sorting of graphs. Patch by +Pablo Galindo, Tim Peters and Larry Hastings. From webhook-mailer at python.org Thu Jan 23 13:09:42 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Thu, 23 Jan 2020 18:09:42 -0000 Subject: [Python-checkins] bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) Message-ID: https://github.com/python/cpython/commit/7142df5ea23b4ce0efb72746b4b3b65414e8dcb1 commit: 7142df5ea23b4ce0efb72746b4b3b65414e8dcb1 branch: master author: Shanavas M committer: Terry Jan Reedy date: 2020-01-23T13:09:21-05:00 summary: bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) files: M Doc/tutorial/classes.rst diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 0c0dca99f21f2..f781fecf832f0 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -143,10 +143,10 @@ language definition is evolving towards static name resolution, at "compile" time, so don't rely on dynamic name resolution! (In fact, local variables are already determined statically.) -A special quirk of Python is that -- if no :keyword:`global` statement is in -effect -- assignments to names always go into the innermost scope. Assignments -do not copy data --- they just bind names to objects. The same is true for -deletions: the statement ``del x`` removes the binding of ``x`` from the +A special quirk of Python is that -- if no :keyword:`global` or :keyword:`nonlocal` +statement is in effect -- assignments to names always go into the innermost scope. +Assignments do not copy data --- they just bind names to objects. The same is true +for deletions: the statement ``del x`` removes the binding of ``x`` from the namespace referenced by the local scope. In fact, all operations that introduce new names use the local scope: in particular, :keyword:`import` statements and function definitions bind the module or function name in the local scope. From webhook-mailer at python.org Thu Jan 23 13:15:21 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 18:15:21 -0000 Subject: [Python-checkins] bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) Message-ID: https://github.com/python/cpython/commit/0c12d70bfdedf85c62e1c2b8c55ef4e84e6ee461 commit: 0c12d70bfdedf85c62e1c2b8c55ef4e84e6ee461 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-23T10:15:15-08:00 summary: bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) (cherry picked from commit 7142df5ea23b4ce0efb72746b4b3b65414e8dcb1) Co-authored-by: Shanavas M files: M Doc/tutorial/classes.rst diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 2538c31061870..5160145f4fba2 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -143,10 +143,10 @@ language definition is evolving towards static name resolution, at "compile" time, so don't rely on dynamic name resolution! (In fact, local variables are already determined statically.) -A special quirk of Python is that -- if no :keyword:`global` statement is in -effect -- assignments to names always go into the innermost scope. Assignments -do not copy data --- they just bind names to objects. The same is true for -deletions: the statement ``del x`` removes the binding of ``x`` from the +A special quirk of Python is that -- if no :keyword:`global` or :keyword:`nonlocal` +statement is in effect -- assignments to names always go into the innermost scope. +Assignments do not copy data --- they just bind names to objects. The same is true +for deletions: the statement ``del x`` removes the binding of ``x`` from the namespace referenced by the local scope. In fact, all operations that introduce new names use the local scope: in particular, :keyword:`import` statements and function definitions bind the module or function name in the local scope. From webhook-mailer at python.org Thu Jan 23 13:22:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 18:22:40 -0000 Subject: [Python-checkins] bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) Message-ID: https://github.com/python/cpython/commit/5a2356be1a3f4a9b2e509a16062016b7d9dee7e9 commit: 5a2356be1a3f4a9b2e509a16062016b7d9dee7e9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-23T10:22:36-08:00 summary: bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) (cherry picked from commit 7142df5ea23b4ce0efb72746b4b3b65414e8dcb1) Co-authored-by: Shanavas M files: M Doc/tutorial/classes.rst diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 0c0dca99f21f2..f781fecf832f0 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -143,10 +143,10 @@ language definition is evolving towards static name resolution, at "compile" time, so don't rely on dynamic name resolution! (In fact, local variables are already determined statically.) -A special quirk of Python is that -- if no :keyword:`global` statement is in -effect -- assignments to names always go into the innermost scope. Assignments -do not copy data --- they just bind names to objects. The same is true for -deletions: the statement ``del x`` removes the binding of ``x`` from the +A special quirk of Python is that -- if no :keyword:`global` or :keyword:`nonlocal` +statement is in effect -- assignments to names always go into the innermost scope. +Assignments do not copy data --- they just bind names to objects. The same is true +for deletions: the statement ``del x`` removes the binding of ``x`` from the namespace referenced by the local scope. In fact, all operations that introduce new names use the local scope: in particular, :keyword:`import` statements and function definitions bind the module or function name in the local scope. From webhook-mailer at python.org Thu Jan 23 16:01:58 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 23 Jan 2020 21:01:58 -0000 Subject: [Python-checkins] bpo-17005: Minor improvements to the documentation of TopologicalSorter (GH-18155) Message-ID: https://github.com/python/cpython/commit/65ecc390c1fa5acdd6348ae3f9843bbdcd8870d1 commit: 65ecc390c1fa5acdd6348ae3f9843bbdcd8870d1 branch: master author: Pablo Galindo committer: GitHub date: 2020-01-23T21:01:50Z summary: bpo-17005: Minor improvements to the documentation of TopologicalSorter (GH-18155) files: M Doc/library/functools.rst diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 8c408923b70a7..e708a0d99cd00 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -522,54 +522,46 @@ The :mod:`functools` module defines the following functions: Provides functionality to topologically sort a graph of hashable nodes. - A topological order is a linear ordering of the vertices in a graph such that for - every directed edge u -> v from vertex u to vertex v, vertex u comes before vertex - v in the ordering. For instance, the vertices of the graph may represent tasks to - be performed, and the edges may represent constraints that one task must be - performed before another; in this example, a topological ordering is just a valid - sequence for the tasks. A complete topological ordering is possible if and only if - the graph has no directed cycles, that is, if it is a directed acyclic graph. - - If the optional *graph* argument is provided it must be a dictionary representing - a directed acyclic graph where the keys are nodes and the values are iterables of - all predecessors of that node in the graph (the nodes that have edges that point - to the value in the key). Additional nodes can be added to the graph using the - :meth:`~TopologicalSorter.add` method. - - In the general case, the steps required to perform the sorting of a given graph - are as follows: - - * Create an instance of the :class:`TopologicalSorter` with an optional initial graph. + A topological order is a linear ordering of the vertices in a graph such that + for every directed edge u -> v from vertex u to vertex v, vertex u comes + before vertex v in the ordering. For instance, the vertices of the graph may + represent tasks to be performed, and the edges may represent constraints that + one task must be performed before another; in this example, a topological + ordering is just a valid sequence for the tasks. A complete topological + ordering is possible if and only if the graph has no directed cycles, that + is, if it is a directed acyclic graph. + + If the optional *graph* argument is provided it must be a dictionary + representing a directed acyclic graph where the keys are nodes and the values + are iterables of all predecessors of that node in the graph (the nodes that + have edges that point to the value in the key). Additional nodes can be added + to the graph using the :meth:`~TopologicalSorter.add` method. + + In the general case, the steps required to perform the sorting of a given + graph are as follows: + + * Create an instance of the :class:`TopologicalSorter` with an optional + initial graph. * Add additional nodes to the graph. * Call :meth:`~TopologicalSorter.prepare` on the graph. - * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over the - nodes returned by :meth:`~TopologicalSorter.get_ready` and process them. - Call :meth:`~TopologicalSorter.done` on each node as it finishes processing. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over + the nodes returned by :meth:`~TopologicalSorter.get_ready` and + process them. Call :meth:`~TopologicalSorter.done` on each node as it + finishes processing. In case just an immediate sorting of the nodes in the graph is required and - no parallelism is involved, the convenience method :meth:`TopologicalSorter.static_order` - can be used directly. For example, this method can be used to implement a simple - version of the C3 linearization algorithm used by Python to calculate the Method - Resolution Order (MRO) of a derived class: + no parallelism is involved, the convenience method + :meth:`TopologicalSorter.static_order` can be used directly: .. doctest:: - >>> class A: pass - >>> class B(A): pass - >>> class C(A): pass - >>> class D(B, C): pass - - >>> D.__mro__ - (, , , , ) - - >>> graph = {D: {B, C}, C: {A}, B: {A}, A:{object}} + >>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}} >>> ts = TopologicalSorter(graph) - >>> topological_order = tuple(ts.static_order()) - >>> tuple(reversed(topological_order)) - (, , , , ) + >>> tuple(ts.static_order()) + ('A', 'C', 'B', 'D') - The class is designed to easily support parallel processing of the nodes as they - become ready. For instance:: + The class is designed to easily support parallel processing of the nodes as + they become ready. For instance:: topological_sorter = TopologicalSorter() @@ -595,39 +587,39 @@ The :mod:`functools` module defines the following functions: .. method:: add(node, *predecessors) - Add a new node and its predecessors to the graph. Both the *node* and - all elements in *predecessors* must be hashable. + Add a new node and its predecessors to the graph. Both the *node* and all + elements in *predecessors* must be hashable. - If called multiple times with the same node argument, the set of dependencies - will be the union of all dependencies passed in. + If called multiple times with the same node argument, the set of + dependencies will be the union of all dependencies passed in. It is possible to add a node with no dependencies (*predecessors* is not provided) or to provide a dependency twice. If a node that has not been - provided before is included among *predecessors* it will be automatically added - to the graph with no predecessors of its own. + provided before is included among *predecessors* it will be automatically + added to the graph with no predecessors of its own. Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`. .. method:: prepare() - Mark the graph as finished and check for cycles in the graph. If any cycle is - detected, :exc:`CycleError` will be raised, but - :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many nodes - as possible until cycles block more progress. After a call to this function, - the graph cannot be modified, and therefore no more nodes can be added using - :meth:`~TopologicalSorter.add`. + Mark the graph as finished and check for cycles in the graph. If any cycle + is detected, :exc:`CycleError` will be raised, but + :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many + nodes as possible until cycles block more progress. After a call to this + function, the graph cannot be modified, and therefore no more nodes can be + added using :meth:`~TopologicalSorter.add`. .. method:: is_active() - Returns ``True`` if more progress can be made and ``False`` otherwise. Progress - can be made if cycles do not block the resolution and either there are still - nodes ready that haven't yet been returned by + Returns ``True`` if more progress can be made and ``False`` otherwise. + Progress can be made if cycles do not block the resolution and either + there are still nodes ready that haven't yet been returned by :meth:`TopologicalSorter.get_ready` or the number of nodes marked - :meth:`TopologicalSorter.done` is less than the number that have been returned - by :meth:`TopologicalSorter.get_ready`. + :meth:`TopologicalSorter.done` is less than the number that have been + returned by :meth:`TopologicalSorter.get_ready`. - The :meth:`~TopologicalSorter.__bool__` method of this class defers to this - function, so instead of:: + The :meth:`~TopologicalSorter.__bool__` method of this class defers to + this function, so instead of:: if ts.is_active(): ... @@ -637,29 +629,28 @@ The :mod:`functools` module defines the following functions: if ts: ... - Raises :exc:`ValueError` if called without calling :meth:`~TopologicalSorter.prepare` - previously. + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. .. method:: done(*nodes) Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as - processed, unblocking any successor of each node in *nodes* for being returned - in the future by a call to :meth:`TopologicalSorter.get_ready`. + processed, unblocking any successor of each node in *nodes* for being + returned in the future by a call to :meth:`TopologicalSorter.get_ready`. Raises :exc:`ValueError` if any node in *nodes* has already been marked as - processed by a previous call to this method or if a node was not added to the - graph by using :meth:`TopologicalSorter.add`, if called without calling - :meth:`~TopologicalSorter.prepare` or if node has not yet been returned by - :meth:`~TopologicalSorter.get_ready`. + processed by a previous call to this method or if a node was not added to + the graph by using :meth:`TopologicalSorter.add`, if called without + calling :meth:`~TopologicalSorter.prepare` or if node has not yet been + returned by :meth:`~TopologicalSorter.get_ready`. .. method:: get_ready() - Returns a ``tuple`` with all the nodes that are ready. Initially it returns all - nodes with no predecessors, and once those are marked as processed by calling - :meth:`TopologicalSorter.done`, further calls will return all new nodes that - have all their predecessors already processed. Once no more progress can be - made, empty tuples are returned. - made. + Returns a ``tuple`` with all the nodes that are ready. Initially it + returns all nodes with no predecessors, and once those are marked as + processed by calling :meth:`TopologicalSorter.done`, further calls will + return all new nodes that have all their predecessors already processed. + Once no more progress can be made, empty tuples are returned. Raises :exc:`ValueError` if called without calling :meth:`~TopologicalSorter.prepare` previously. @@ -694,9 +685,10 @@ The :mod:`functools` module defines the following functions: >>> print([*ts2.static_order()]) [0, 2, 1, 3] - This is due to the fact that "0" and "2" are in the same level in the graph (they - would have been returned in the same call to :meth:`~TopologicalSorter.get_ready`) - and the order between them is determined by the order of insertion. + This is due to the fact that "0" and "2" are in the same level in the + graph (they would have been returned in the same call to + :meth:`~TopologicalSorter.get_ready`) and the order between them is + determined by the order of insertion. If any cycle is detected, :exc:`CycleError` will be raised. From webhook-mailer at python.org Thu Jan 23 18:31:41 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 23:31:41 -0000 Subject: [Python-checkins] [3.8] bpo-35182: fix communicate() crash after child closes its pipes (GH-18117) (GH-18148) Message-ID: https://github.com/python/cpython/commit/5654f83b9706af88040f515791f1cdc5d81cd9d6 commit: 5654f83b9706af88040f515791f1cdc5d81cd9d6 branch: 3.8 author: Alex Rebert committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-23T15:31:29-08:00 summary: [3.8] bpo-35182: fix communicate() crash after child closes its pipes (GH-18117) (GH-18148) When communicate() is called in a loop, it crashes when the child process has already closed any piped standard stream, but still continues to be running Co-authored-by: Andriy Maletsky . (cherry picked from commit d3ae95e1e945ed20297e1c38ba43a18b7a868ab6) Co-authored-by: Alex Rebert https://bugs.python.org/issue35182 files: A Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst M Lib/subprocess.py M Lib/test/test_subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 85b9ea0785466..5c2c2f05093f7 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1848,9 +1848,9 @@ def _communicate(self, input, endtime, orig_timeout): with _PopenSelector() as selector: if self.stdin and input: selector.register(self.stdin, selectors.EVENT_WRITE) - if self.stdout: + if self.stdout and not self.stdout.closed: selector.register(self.stdout, selectors.EVENT_READ) - if self.stderr: + if self.stderr and not self.stderr.closed: selector.register(self.stderr, selectors.EVENT_READ) while selector.get_map(): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index b2afd127dfed8..80acb06e4f920 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -2910,6 +2910,17 @@ def test_stopped(self): self.assertEqual(returncode, -3) + def test_communicate_repeated_call_after_stdout_close(self): + proc = subprocess.Popen([sys.executable, '-c', + 'import os, time; os.close(1), time.sleep(2)'], + stdout=subprocess.PIPE) + while True: + try: + proc.communicate(timeout=0.1) + return + except subprocess.TimeoutExpired: + pass + @unittest.skipUnless(mswindows, "Windows specific tests") class Win32ProcessTestCase(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst new file mode 100644 index 0000000000000..9438cd8f9fd0b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst @@ -0,0 +1,3 @@ +Fixed :func:`Popen.communicate` subsequent call crash when the child process +has already closed any piped standard stream, but still continues to be +running. Patch by Andriy Maletsky. From webhook-mailer at python.org Thu Jan 23 18:32:35 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 23 Jan 2020 23:32:35 -0000 Subject: [Python-checkins] [3.7] bpo-35182: fix communicate() crash after child closes its pipes (GH-18117) (GH-18151) Message-ID: https://github.com/python/cpython/commit/61b3484cdf27ceca1c1069a351487d2db4b2b48c commit: 61b3484cdf27ceca1c1069a351487d2db4b2b48c branch: 3.7 author: Alex Rebert committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-23T15:32:31-08:00 summary: [3.7] bpo-35182: fix communicate() crash after child closes its pipes (GH-18117) (GH-18151) When communicate() is called in a loop, it crashes when the child process has already closed any piped standard stream, but still continues to be running Co-authored-by: Andriy Maletsky . (cherry picked from commit d3ae95e1e945ed20297e1c38ba43a18b7a868ab6) Co-authored-by: Alex Rebert https://bugs.python.org/issue35182 Automerge-Triggered-By: @gpshead files: A Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst M Lib/subprocess.py M Lib/test/test_subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index d1b6de5785789..3f99be551c515 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1697,9 +1697,9 @@ def _communicate(self, input, endtime, orig_timeout): with _PopenSelector() as selector: if self.stdin and input: selector.register(self.stdin, selectors.EVENT_WRITE) - if self.stdout: + if self.stdout and not self.stdout.closed: selector.register(self.stdout, selectors.EVENT_READ) - if self.stderr: + if self.stderr and not self.stderr.closed: selector.register(self.stderr, selectors.EVENT_READ) while selector.get_map(): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 9f494dab408ca..d024158e18a59 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -2848,6 +2848,17 @@ def test_stopped(self): self.assertEqual(returncode, -3) + def test_communicate_repeated_call_after_stdout_close(self): + proc = subprocess.Popen([sys.executable, '-c', + 'import os, time; os.close(1), time.sleep(2)'], + stdout=subprocess.PIPE) + while True: + try: + proc.communicate(timeout=0.1) + return + except subprocess.TimeoutExpired: + pass + @unittest.skipUnless(mswindows, "Windows specific tests") class Win32ProcessTestCase(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst new file mode 100644 index 0000000000000..9438cd8f9fd0b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst @@ -0,0 +1,3 @@ +Fixed :func:`Popen.communicate` subsequent call crash when the child process +has already closed any piped standard stream, but still continues to be +running. Patch by Andriy Maletsky. From webhook-mailer at python.org Fri Jan 24 03:14:26 2020 From: webhook-mailer at python.org (Chris Withers) Date: Fri, 24 Jan 2020 08:14:26 -0000 Subject: [Python-checkins] bpo-24928: Add test case for patch.dict using OrderedDict (GH -11437) Message-ID: https://github.com/python/cpython/commit/1d0c5e16eab29d55773cc4196bb90d2bf12e09dd commit: 1d0c5e16eab29d55773cc4196bb90d2bf12e09dd branch: master author: Emmanuel Arias committer: Chris Withers date: 2020-01-24T08:14:14Z summary: bpo-24928: Add test case for patch.dict using OrderedDict (GH -11437) * add test for path.dict using OrderedDict Co-authored-by: Yu Tomita nekobon at users.noreply.github.com files: M Lib/unittest/test/testmock/testpatch.py diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index e065a2c35fbee..dc4ccdbae242b 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -4,6 +4,7 @@ import os import sys +from collections import OrderedDict import unittest from unittest.test.testmock import support @@ -1834,6 +1835,25 @@ def foo(*a, x=0): self.assertEqual(foo(), 1) self.assertEqual(foo(), 0) + def test_patch_orderdict(self): + foo = OrderedDict() + foo['a'] = object() + foo['b'] = 'python' + + original = foo.copy() + update_values = list(zip('cdefghijklmnopqrstuvwxyz', range(26))) + patched_values = list(foo.items()) + update_values + + with patch.dict(foo, OrderedDict(update_values)): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + + with patch.dict(foo, update_values): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + def test_dotted_but_module_not_loaded(self): # This exercises the AttributeError branch of _dot_lookup. From webhook-mailer at python.org Fri Jan 24 03:38:37 2020 From: webhook-mailer at python.org (Chris Withers) Date: Fri, 24 Jan 2020 08:38:37 -0000 Subject: [Python-checkins] Fix `mock.patch.dict` to be stopped with `mock.patch.stopall` (#17606) Message-ID: https://github.com/python/cpython/commit/e131c9720d087c0c4988bd2a5c62020feb9d1d77 commit: e131c9720d087c0c4988bd2a5c62020feb9d1d77 branch: master author: Mario Corchero committer: Chris Withers date: 2020-01-24T08:38:32Z summary: Fix `mock.patch.dict` to be stopped with `mock.patch.stopall` (#17606) As the function was not registering in the active patches, the mocks started by `mock.patch.dict` were not being stopped when `mock.patch.stopall` was being called. files: A Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testpatch.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 5622917dc3743..3fafe594c5978 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1851,8 +1851,23 @@ def __exit__(self, *args): self._unpatch_dict() return False - start = __enter__ - stop = __exit__ + + def start(self): + """Activate a patch, returning any created mock.""" + result = self.__enter__() + _patch._active_patches.append(self) + return result + + + def stop(self): + """Stop an active patch.""" + try: + _patch._active_patches.remove(self) + except ValueError: + # If the patch hasn't been started this will fail + pass + + return self.__exit__() def _clear_dict(in_dict): diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index dc4ccdbae242b..438dfd8cfbcc0 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -1808,6 +1808,56 @@ def stop(self): self.assertEqual(stopped, ["three", "two", "one"]) + def test_patch_dict_stopall(self): + dic1 = {} + dic2 = {1: 'a'} + dic3 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + origdic3 = dic3.copy() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2, {2: 'b'}).start() + + @patch.dict(dic3) + def patched(): + del dic3[1] + + patched() + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + patch.stopall() + + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + + def test_patch_and_patch_dict_stopall(self): + original_unlink = os.unlink + original_chdir = os.chdir + dic1 = {} + dic2 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + + patch('os.unlink', something).start() + patch('os.chdir', something_else).start() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2).start() + del dic2[1] + + self.assertIsNot(os.unlink, original_unlink) + self.assertIsNot(os.chdir, original_chdir) + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + patch.stopall() + self.assertIs(os.unlink, original_unlink) + self.assertIs(os.chdir, original_chdir) + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + def test_special_attrs(self): def foo(x=0): diff --git a/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst b/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst new file mode 100644 index 0000000000000..0f72639310653 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst @@ -0,0 +1,2 @@ +Fix :func:`mock.patch.stopall` to stop active patches that were created with +:func:`mock.patch.dict`. From webhook-mailer at python.org Fri Jan 24 04:22:22 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 Jan 2020 09:22:22 -0000 Subject: [Python-checkins] bpo-39429: Add a new "Python Development Mode" doc page (GH-18132) Message-ID: https://github.com/python/cpython/commit/b9783d2e035d2babe8fcd9ec109044c0002c18a2 commit: b9783d2e035d2babe8fcd9ec109044c0002c18a2 branch: master author: Victor Stinner committer: GitHub date: 2020-01-24T10:22:18+01:00 summary: bpo-39429: Add a new "Python Development Mode" doc page (GH-18132) files: A Doc/library/devmode.rst M Doc/c-api/init_config.rst M Doc/library/asyncio-dev.rst M Doc/library/asyncio-eventloop.rst M Doc/library/development.rst M Doc/library/exceptions.rst M Doc/library/faulthandler.rst M Doc/library/stdtypes.rst M Doc/library/sys.rst M Doc/using/cmdline.rst M Doc/whatsnew/3.7.rst M Doc/whatsnew/3.9.rst M Include/cpython/initconfig.h diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 79a8815ed4199..108bd2c0245ea 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -466,7 +466,7 @@ PyConfig .. c:member:: int dev_mode - Development mode: see :option:`-X dev <-X>`. + If non-zero, enable the :ref:`Python Development Mode `. .. c:member:: int dump_refs diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index 101e7817a95e9..ff51c4fa3b20f 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -25,7 +25,7 @@ There are several ways to enable asyncio debug mode: * Setting the :envvar:`PYTHONASYNCIODEBUG` environment variable to ``1``. -* Using the :option:`-X` ``dev`` Python command line option. +* Using the :ref:`Python Development Mode `. * Passing ``debug=True`` to :func:`asyncio.run`. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 25a3692695d53..0029d94f0b598 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1200,7 +1200,7 @@ Enabling debug mode .. versionchanged:: 3.7 - The new ``-X dev`` command line option can now also be used + The new :ref:`Python Development Mode ` can now also be used to enable the debug mode. .. seealso:: diff --git a/Doc/library/development.rst b/Doc/library/development.rst index ab34e1f7ce5f6..9edce758688e2 100644 --- a/Doc/library/development.rst +++ b/Doc/library/development.rst @@ -18,12 +18,10 @@ The list of modules described in this chapter is: typing.rst pydoc.rst + devmode.rst doctest.rst unittest.rst unittest.mock.rst unittest.mock-examples.rst 2to3.rst test.rst - -See also the Python development mode: the :option:`-X` ``dev`` option and -:envvar:`PYTHONDEVMODE` environment variable. diff --git a/Doc/library/devmode.rst b/Doc/library/devmode.rst new file mode 100644 index 0000000000000..d5a40cdeeac5e --- /dev/null +++ b/Doc/library/devmode.rst @@ -0,0 +1,214 @@ +.. _devmode: + +Python Development Mode +======================= + +.. versionadded:: 3.7 + +The Python Development Mode introduces additional runtime checks that are too +expensive to be enabled by default. It should not be more verbose than the +default if the code is correct; new warnings are only emitted when an issue is +detected. + +It can be enabled using the :option:`-X dev <-X>` command line option or by +setting the :envvar:`PYTHONDEVMODE` environment variable to ``1``. + +Effects of the Python Development Mode +====================================== + +Enabling the Python Development Mode is similar to the following command, but +with additional effects described below:: + + PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python3 -W default -X faulthandler + +Effects of the Python Development Mode: + +* Add ``default`` :ref:`warning filter `. The + following warnings are shown: + + * :exc:`DeprecationWarning` + * :exc:`ImportWarning` + * :exc:`PendingDeprecationWarning` + * :exc:`ResourceWarning` + + Normally, the above warnings are filtered by the default :ref:`warning + filters `. + + It behaves as if the :option:`-W default <-W>` command line option is used. + + Use the :option:`-W error <-W>` command line option or set the + :envvar:`PYTHONWARNINGS` environment variable to ``error`` to treat warnings + as errors. + +* Install debug hooks on memory allocators to check for: + + * Buffer underflow + * Buffer overflow + * Memory allocator API violation + * Unsafe usage of the GIL + + See the :c:func:`PyMem_SetupDebugHooks` C function. + + It behaves as if the :envvar:`PYTHONMALLOC` environment variable is set to + ``debug``. + + To enable the Python Development Mode without installing debug hooks on + memory allocators, set the :envvar:`PYTHONMALLOC` environment variable to + ``default``. + +* Call :func:`faulthandler.enable` at Python startup to install handlers for + the :const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and + :const:`SIGILL` signals to dump the Python traceback on a crash. + + It behaves as if the :option:`-X faulthandler <-X>` command line option is + used or if the :envvar:`PYTHONFAULTHANDLER` environment variable is set to + ``1``. + +* Enable :ref:`asyncio debug mode `. For example, + :mod:`asyncio` checks for coroutines that were not awaited and logs them. + + It behaves as if the :envvar:`PYTHONASYNCIODEBUG` environment variable is set + to ``1``. + +* Check the *encoding* and *errors* arguments for string encoding and decoding + operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. + + By default, for best performance, the *errors* argument is only checked at + the first encoding/decoding error and the *encoding* argument is sometimes + ignored for empty strings. + +* The :class:`io.IOBase` destructor logs ``close()`` exceptions. +* Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to + ``True``. + +The Python Development Mode does not enable the :mod:`tracemalloc` module by +default, because the overhead cost (to performance and memory) would be too +large. Enabling the :mod:`tracemalloc` module provides additional information +on the origin of some errors. For example, :exc:`ResourceWarning` logs the +traceback where the resource was allocated, and a buffer overflow error logs +the traceback where the memory block was allocated. + +The Python Development Mode does not prevent the :option:`-O` command line +option from removing :keyword:`assert` statements nor from setting +:const:`__debug__` to ``False``. + +.. versionchanged:: 3.8 + The :class:`io.IOBase` destructor now logs ``close()`` exceptions. + +.. versionchanged:: 3.9 + The *encoding* and *errors* arguments are now checked for string encoding + and decoding operations. + + +ResourceWarning Example +======================= + +Example of a script counting the number of lines of the text file specified in +the command line:: + + import sys + + def main(): + fp = open(sys.argv[1]) + nlines = len(fp.readlines()) + print(nlines) + # The file is closed implicitly + + if __name__ == "__main__": + main() + +The script does not close the file explicitly. By default, Python does not emit +any warning. Example using README.txt, which has 269 lines: + +.. code-block:: shell-session + + $ python3 script.py README.txt + 269 + +Enabling the Python Development Mode displays a :exc:`ResourceWarning` warning: + +.. code-block:: shell-session + + $ python3 -X dev script.py README.txt + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + +In addition, enabling :mod:`tracemalloc` shows the line where the file was +opened: + +.. code-block:: shell-session + + $ python3 -X dev -X tracemalloc=5 script.py README.rst + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + Object allocated at (most recent call last): + File "script.py", lineno 10 + main() + File "script.py", lineno 4 + fp = open(sys.argv[1]) + +The fix is to close explicitly the file. Example using a context manager:: + + def main(): + # Close the file explicitly when exiting the with block + with open(sys.argv[1]) as fp: + nlines = len(fp.readlines()) + print(nlines) + +Not closing a resource explicitly can leave a resource open for way longer than +expected; it can cause severe issues upon exiting Python. It is bad in +CPython, but it is even worse in PyPy. Closing resources explicitly makes an +application more deterministic and more reliable. + + +Bad file descriptor error example +================================= + +Script displaying the first line of itself:: + + import os + + def main(): + fp = open(__file__) + firstline = fp.readline() + print(firstline.rstrip()) + os.close(fp.fileno()) + # The file is closed implicitly + + main() + +By default, Python does not emit any warning: + +.. code-block:: shell-session + + $ python3 script.py + import os + +The Python Development Mode shows a :exc:`ResourceWarning` and logs a "Bad file +descriptor" error when finalizing the file object: + +.. code-block:: shell-session + + $ python3 script.py + import os + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + Traceback (most recent call last): + File "script.py", line 10, in + main() + OSError: [Errno 9] Bad file descriptor + +``os.close(fp.fileno())`` closes the file descriptor. When the file object +finalizer tries to close the file descriptor again, it fails with the ``Bad +file descriptor`` error. A file descriptor must be closed only once. In the +worst case scenario, closing it twice can lead to a crash (see :issue:`18748` +for an example). + +The fix is to remove the ``os.close(fp.fileno())`` line, or open the file with +``closefd=False``. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 52a505e0a0ff8..df2cda9d67ad1 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -688,6 +688,10 @@ The following exceptions are used as warning categories; see the Base class for warnings about deprecated features when those warnings are intended for other Python developers. + Ignored by the default warning filters, except in the ``__main__`` module + (:pep:`565`). Enabling the :ref:`Python Development Mode ` shows + this warning. + .. exception:: PendingDeprecationWarning @@ -699,6 +703,9 @@ The following exceptions are used as warning categories; see the upcoming deprecation is unusual, and :exc:`DeprecationWarning` is preferred for already active deprecations. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: SyntaxWarning @@ -720,6 +727,9 @@ The following exceptions are used as warning categories; see the Base class for warnings about probable mistakes in module imports. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: UnicodeWarning @@ -733,8 +743,10 @@ The following exceptions are used as warning categories; see the .. exception:: ResourceWarning - Base class for warnings related to resource usage. Ignored by the default - warning filters. + Base class for warnings related to resource usage. + + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. .. versionadded:: 3.2 diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst index b588dfa18db2d..59274c1dd7ec3 100644 --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -40,6 +40,9 @@ alternatively be passed to :func:`faulthandler.enable`. The module is implemented in C, so tracebacks can be dumped on a crash or when Python is deadlocked. +The :ref:`Python Development Mode ` calls :func:`faulthandler.enable` +at Python startup. + Dumping the traceback --------------------- diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 3e25faaa42714..fd3401fd18a09 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1559,8 +1559,8 @@ expression support in the :mod:`re` module). list of possible encodings, see section :ref:`standard-encodings`. By default, the *errors* argument is not checked for best performances, but - only used at the first encoding error. Enable the development mode - (:option:`-X` ``dev`` option), or use a debug build, to check *errors*. + only used at the first encoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. .. versionchanged:: 3.1 Support for keyword arguments added. @@ -2596,8 +2596,8 @@ arbitrary binary data. list of possible encodings, see section :ref:`standard-encodings`. By default, the *errors* argument is not checked for best performances, but - only used at the first decoding error. Enable the development mode - (:option:`-X` ``dev`` option), or use a debug build, to check *errors*. + only used at the first decoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. .. note:: diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 351a8e4c9eafd..d28b3565c1c63 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -428,9 +428,9 @@ always available. The :term:`named tuple` *flags* exposes the status of command line flags. The attributes are read only. - ============================= ============================= + ============================= ================================================================ attribute flag - ============================= ============================= + ============================= ================================================================ :const:`debug` :option:`-d` :const:`inspect` :option:`-i` :const:`interactive` :option:`-i` @@ -444,9 +444,9 @@ always available. :const:`bytes_warning` :option:`-b` :const:`quiet` :option:`-q` :const:`hash_randomization` :option:`-R` - :const:`dev_mode` :option:`-X` ``dev`` - :const:`utf8_mode` :option:`-X` ``utf8`` - ============================= ============================= + :const:`dev_mode` :option:`-X dev <-X>` (:ref:`Python Development Mode `) + :const:`utf8_mode` :option:`-X utf8 <-X>` + ============================= ================================================================ .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. @@ -461,8 +461,9 @@ always available. Added ``isolated`` attribute for :option:`-I` ``isolated`` flag. .. versionchanged:: 3.7 - Added ``dev_mode`` attribute for the new :option:`-X` ``dev`` flag - and ``utf8_mode`` attribute for the new :option:`-X` ``utf8`` flag. + Added the ``dev_mode`` attribute for the new :ref:`Python Development + Mode ` and the ``utf8_mode`` attribute for the new :option:`-X` + ``utf8`` flag. .. data:: float_info diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 9e149806c380f..146003b147131 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -442,24 +442,9 @@ Miscellaneous options nested imports). Note that its output may be broken in multi-threaded application. Typical usage is ``python3 -X importtime -c 'import asyncio'``. See also :envvar:`PYTHONPROFILEIMPORTTIME`. - * ``-X dev``: enable CPython's "development mode", introducing additional - runtime checks which are too expensive to be enabled by default. It should - not be more verbose than the default if the code is correct: new warnings - are only emitted when an issue is detected. Effect of the developer mode: - - * Check *encoding* and *errors* arguments on string encoding and decoding - operations. Examples: :func:`open`, :meth:`str.encode` and - :meth:`bytes.decode`. - * Add ``default`` warning filter, as :option:`-W` ``default``. - * Install debug hooks on memory allocators: see the - :c:func:`PyMem_SetupDebugHooks` C function. - * Enable the :mod:`faulthandler` module to dump the Python traceback - on a crash. - * Enable :ref:`asyncio debug mode `. - * Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to - ``True``. - * :class:`io.IOBase` destructor logs ``close()`` exceptions. - + * ``-X dev``: enable :ref:`Python Development Mode `, introducing + additional runtime checks that are too expensive to be enabled by + default. * ``-X utf8`` enables UTF-8 mode for operating system interfaces, overriding the default locale-aware mode. ``-X utf8=0`` explicitly disables UTF-8 mode (even when it would otherwise activate automatically). @@ -890,8 +875,9 @@ conflict. .. envvar:: PYTHONDEVMODE - If this environment variable is set to a non-empty string, enable the - CPython "development mode". See the :option:`-X` ``dev`` option. + If this environment variable is set to a non-empty string, enable + :ref:`Python Development Mode `, introducing additional runtime + checks that are too expensive to be enabled by default. .. versionadded:: 3.7 diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 8a70fe22d52bd..04cfa57e1446f 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -102,7 +102,7 @@ CPython implementation improvements: * :ref:`PEP 538 `, legacy C locale coercion * :ref:`PEP 540 `, forced UTF-8 runtime mode * :ref:`PEP 552 `, deterministic .pycs -* :ref:`the new development runtime mode ` +* :ref:`New Python Development Mode ` * :ref:`PEP 565 `, improved :exc:`DeprecationWarning` handling @@ -479,15 +479,15 @@ Three new translations have been added: .. _whatsnew37-devmode: -Development Runtime Mode: -X dev +Python Development Mode (-X dev) -------------------------------- The new :option:`-X` ``dev`` command line option or the new :envvar:`PYTHONDEVMODE` environment variable can be used to enable -CPython's *development mode*. When in development mode, CPython performs +:ref:`Python Development Mode `. When in development mode, Python performs additional runtime checks that are too expensive to be enabled by default. -See :option:`-X` ``dev`` documentation for the full description of the effects -of this mode. +See :ref:`Python Development Mode ` documentation for the full +description. Other Language Changes diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a6e938faa991e..ff5cb1486f9bf 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -90,9 +90,10 @@ Other Language Changes in this case. (Contributed by Victor Stinner in :issue:`20443`.) -* In development mode and in debug build, *encoding* and *errors* arguments are - now checked on string encoding and decoding operations. Examples: - :func:`open`, :meth:`str.encode` and :meth:`bytes.decode`. +* In the :ref:`Python Development Mode ` and in debug build, the + *encoding* and *errors* arguments are now checked for string encoding and + decoding operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. By default, for best performance, the *errors* argument is only checked at the first encoding/decoding error and the *encoding* argument is sometimes diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 4b5ceafe02dbc..54e662347e3b2 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -113,7 +113,11 @@ typedef struct { "POSIX", otherwise it is set to 0. Inherit Py_UTF8Mode value value. */ int utf8_mode; - int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ + /* If non-zero, enable the Python Development Mode. + + Set to 1 by the -X dev command line option. Set by the PYTHONDEVMODE + environment variable. */ + int dev_mode; /* Memory allocator: PYTHONMALLOC env var. See PyMemAllocatorName for valid values. */ @@ -131,7 +135,7 @@ typedef struct { int isolated; /* Isolated mode? see PyPreConfig.isolated */ int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ - int dev_mode; /* Development mode? See PyPreConfig.dev_mode */ + int dev_mode; /* Python Development Mode? See PyPreConfig.dev_mode */ /* Install signal handlers? Yes by default. */ int install_signal_handlers; From webhook-mailer at python.org Fri Jan 24 05:03:27 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 Jan 2020 10:03:27 -0000 Subject: [Python-checkins] bpo-39426: Fix outdated default and highest protocols in docs (GH-18154) Message-ID: https://github.com/python/cpython/commit/e9652e8d58392f5022759ba06b444ce970eb12db commit: e9652e8d58392f5022759ba06b444ce970eb12db branch: master author: Mark Dickinson committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-24T02:03:22-08:00 summary: bpo-39426: Fix outdated default and highest protocols in docs (GH-18154) Some portions of the pickle documentation hadn't been updated for the pickle protocol changes in Python 3.8 (new protocol 5, default protocol 4). This PR fixes those docs. https://bugs.python.org/issue39426 files: M Lib/pickle.py M Modules/_pickle.c M Modules/clinic/_pickle.c.h diff --git a/Lib/pickle.py b/Lib/pickle.py index 01d41422aa4a6..d7adc162c98de 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -409,9 +409,9 @@ def __init__(self, file, protocol=None, *, fix_imports=True, """This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the - given protocol; supported protocols are 0, 1, 2, 3 and 4. The - default protocol is 4. It was introduced in Python 3.4, it is - incompatible with previous versions. + given protocol; supported protocols are 0, 1, 2, 3, 4 and 5. + The default protocol is 4. It was introduced in Python 3.4, and + is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol version supported. The higher the protocol used, the diff --git a/Modules/_pickle.c b/Modules/_pickle.c index baa0a27419693..25d5c8da92068 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4645,8 +4645,9 @@ _pickle.Pickler.__init__ This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 3; a backward-incompatible protocol designed for Python 3. +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible +with previous versions. Specifying a negative protocol version selects the highest protocol version supported. The higher the protocol used, the more recent the @@ -4678,7 +4679,7 @@ static int _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=0abedc50590d259b input=bb886e00443a7811]*/ +/*[clinic end generated code: output=0abedc50590d259b input=a7c969699bf5dad3]*/ { _Py_IDENTIFIER(persistent_id); _Py_IDENTIFIER(dispatch_table); @@ -7635,8 +7636,8 @@ This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more efficient. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 4. It was introduced in Python 3.4, it is incompatible +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol @@ -7662,7 +7663,7 @@ static PyObject * _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=706186dba996490c input=cfdcaf573ed6e46c]*/ +/*[clinic end generated code: output=706186dba996490c input=5ed6653da99cd97c]*/ { PicklerObject *pickler = _Pickler_New(); @@ -7705,8 +7706,8 @@ _pickle.dumps Return the pickled representation of the object as a bytes object. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 4. It was introduced in Python 3.4, it is incompatible +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol @@ -7726,7 +7727,7 @@ into *file* as part of the pickle stream. It is an error if static PyObject * _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=fbab0093a5580fdf input=9f334d535ff7194f]*/ +/*[clinic end generated code: output=fbab0093a5580fdf input=e543272436c6f987]*/ { PyObject *result; PicklerObject *pickler = _Pickler_New(); diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 9da3f1195a3bf..0457a433e79fb 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -69,8 +69,9 @@ PyDoc_STRVAR(_pickle_Pickler___init____doc__, "This takes a binary file for writing a pickle data stream.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 3; a backward-incompatible protocol designed for Python 3.\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" +"with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" "version supported. The higher the protocol used, the more recent the\n" @@ -463,8 +464,8 @@ PyDoc_STRVAR(_pickle_dump__doc__, "be more efficient.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 4. It was introduced in Python 3.4, it is incompatible\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" "with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" @@ -550,8 +551,8 @@ PyDoc_STRVAR(_pickle_dumps__doc__, "Return the pickled representation of the object as a bytes object.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 4. It was introduced in Python 3.4, it is incompatible\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" "with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" @@ -835,4 +836,4 @@ _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=de075ec48d4ee0e1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e2506823be1960c5 input=a9049054013a1b77]*/ From webhook-mailer at python.org Fri Jan 24 05:20:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 Jan 2020 10:20:40 -0000 Subject: [Python-checkins] bpo-39426: Fix outdated default and highest protocols in docs (GH-18154) Message-ID: https://github.com/python/cpython/commit/a46728a570e30e88df253eab17ad6c4372a422da commit: a46728a570e30e88df253eab17ad6c4372a422da branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-24T02:20:35-08:00 summary: bpo-39426: Fix outdated default and highest protocols in docs (GH-18154) Some portions of the pickle documentation hadn't been updated for the pickle protocol changes in Python 3.8 (new protocol 5, default protocol 4). This PR fixes those docs. https://bugs.python.org/issue39426 (cherry picked from commit e9652e8d58392f5022759ba06b444ce970eb12db) Co-authored-by: Mark Dickinson files: M Lib/pickle.py M Modules/_pickle.c M Modules/clinic/_pickle.c.h diff --git a/Lib/pickle.py b/Lib/pickle.py index 71aa57d500ecc..515cb8a0bb3f1 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -409,9 +409,9 @@ def __init__(self, file, protocol=None, *, fix_imports=True, """This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the - given protocol; supported protocols are 0, 1, 2, 3 and 4. The - default protocol is 4. It was introduced in Python 3.4, it is - incompatible with previous versions. + given protocol; supported protocols are 0, 1, 2, 3, 4 and 5. + The default protocol is 4. It was introduced in Python 3.4, and + is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol version supported. The higher the protocol used, the diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 8ee7d8ee2a793..8150bf3b33dc3 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4647,8 +4647,9 @@ _pickle.Pickler.__init__ This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 3; a backward-incompatible protocol designed for Python 3. +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible +with previous versions. Specifying a negative protocol version selects the highest protocol version supported. The higher the protocol used, the more recent the @@ -4680,7 +4681,7 @@ static int _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=0abedc50590d259b input=bb886e00443a7811]*/ +/*[clinic end generated code: output=0abedc50590d259b input=a7c969699bf5dad3]*/ { _Py_IDENTIFIER(persistent_id); _Py_IDENTIFIER(dispatch_table); @@ -7633,8 +7634,8 @@ This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more efficient. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 4. It was introduced in Python 3.4, it is incompatible +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol @@ -7660,7 +7661,7 @@ static PyObject * _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=706186dba996490c input=cfdcaf573ed6e46c]*/ +/*[clinic end generated code: output=706186dba996490c input=5ed6653da99cd97c]*/ { PicklerObject *pickler = _Pickler_New(); @@ -7703,8 +7704,8 @@ _pickle.dumps Return the pickled representation of the object as a bytes object. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 4. It was introduced in Python 3.4, it is incompatible +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol @@ -7724,7 +7725,7 @@ into *file* as part of the pickle stream. It is an error if static PyObject * _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=fbab0093a5580fdf input=9f334d535ff7194f]*/ +/*[clinic end generated code: output=fbab0093a5580fdf input=e543272436c6f987]*/ { PyObject *result; PicklerObject *pickler = _Pickler_New(); diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 9da3f1195a3bf..0457a433e79fb 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -69,8 +69,9 @@ PyDoc_STRVAR(_pickle_Pickler___init____doc__, "This takes a binary file for writing a pickle data stream.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 3; a backward-incompatible protocol designed for Python 3.\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" +"with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" "version supported. The higher the protocol used, the more recent the\n" @@ -463,8 +464,8 @@ PyDoc_STRVAR(_pickle_dump__doc__, "be more efficient.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 4. It was introduced in Python 3.4, it is incompatible\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" "with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" @@ -550,8 +551,8 @@ PyDoc_STRVAR(_pickle_dumps__doc__, "Return the pickled representation of the object as a bytes object.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 4. It was introduced in Python 3.4, it is incompatible\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" "with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" @@ -835,4 +836,4 @@ _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=de075ec48d4ee0e1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e2506823be1960c5 input=a9049054013a1b77]*/ From webhook-mailer at python.org Fri Jan 24 05:35:08 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 Jan 2020 10:35:08 -0000 Subject: [Python-checkins] bpo-39361: Document the removal of PyTypeObject.tp_print (GH-18125) Message-ID: https://github.com/python/cpython/commit/2d5097663d7f80921fb07cdcd26c9d59cf71f1a2 commit: 2d5097663d7f80921fb07cdcd26c9d59cf71f1a2 branch: master author: Ammar Askar committer: Victor Stinner date: 2020-01-24T11:35:01+01:00 summary: bpo-39361: Document the removal of PyTypeObject.tp_print (GH-18125) files: M Doc/whatsnew/3.9.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ff5cb1486f9bf..9b5b4fb378519 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -323,6 +323,11 @@ Build and C API Changes removed in Python 3.3. (Contributed by Victor Stinner in :issue:`38896`.) +* The ``tp_print`` slot of :ref:`PyTypeObject ` has been removed. + It was used for printing objects to files in Python 2.7 and before. Since + Python 3.0, it has been ignored and unused. + (Contributed by Jeroen Demeyer in :issue:`36974`.) + Deprecated ========== From webhook-mailer at python.org Fri Jan 24 05:53:49 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 Jan 2020 10:53:49 -0000 Subject: [Python-checkins] bpo-39413: Implement os.unsetenv() on Windows (GH-18163) Message-ID: https://github.com/python/cpython/commit/161e7b36b1ea871a1352ccfc1d4f4c1eda76830f commit: 161e7b36b1ea871a1352ccfc1d4f4c1eda76830f branch: master author: Victor Stinner committer: GitHub date: 2020-01-24T11:53:44+01:00 summary: bpo-39413: Implement os.unsetenv() on Windows (GH-18163) The os.unsetenv() function is now also available on Windows. files: A Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst M Doc/library/os.rst M Doc/whatsnew/3.9.rst M Lib/test/test_os.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4fec647828e25..de3e5603e109f 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -645,6 +645,9 @@ process and user. .. availability:: most flavors of Unix, Windows. + .. versionchanged:: 3.9 + The function is now also available on Windows. + .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 9b5b4fb378519..751562e875e6d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -224,6 +224,9 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. +The :func:`os.unsetenv` function is now also available on Windows. +(Contributed by Victor Stinner in :issue:`39413`.) + poplib ------ diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 82c441c204835..dbdc00c2fea22 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -953,17 +953,44 @@ def test_environb(self): value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape') self.assertEqual(os.environ['bytes'], value_str) + @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") + @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") + def test_putenv_unsetenv(self): + name = "PYTHONTESTVAR" + value = "testvalue" + code = f'import os; print(repr(os.environ.get({name!r})))' + + with support.EnvironmentVarGuard() as env: + env.pop(name, None) + + os.putenv(name, value) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(value)) + + os.unsetenv(name) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(None)) + # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) - def test_unset_error(self): + @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") + @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") + def test_putenv_unsetenv_error(self): + # Empty variable name is invalid. + # "=" and null character are not allowed in a variable name. + for name in ('', '=name', 'na=me', 'name=', 'name\0', 'na\0me'): + self.assertRaises((OSError, ValueError), os.putenv, name, "value") + self.assertRaises((OSError, ValueError), os.unsetenv, name) + if sys.platform == "win32": - # an environment variable is limited to 32,767 characters - key = 'x' * 50000 - self.assertRaises(ValueError, os.environ.__delitem__, key) - else: - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + # On Windows, an environment variable string ("name=value" string) + # is limited to 32,767 characters + longstr = 'x' * 32_768 + self.assertRaises(ValueError, os.putenv, longstr, "1") + self.assertRaises(ValueError, os.putenv, "X", longstr) + self.assertRaises(ValueError, os.unsetenv, longstr) def test_key_type(self): missing = 'missingkey' diff --git a/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst new file mode 100644 index 0000000000000..a185ab5efe2ed --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst @@ -0,0 +1 @@ +The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 13a69cd5f0e4d..0f5995ec6400c 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6125,7 +6125,43 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #endif /* ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) */ -#if defined(HAVE_UNSETENV) +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os_unsetenv__doc__, +"unsetenv($module, name, /)\n" +"--\n" +"\n" +"Delete an environment variable."); + +#define OS_UNSETENV_METHODDEF \ + {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name); + +static PyObject * +os_unsetenv(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("unsetenv", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + name = arg; + return_value = os_unsetenv_impl(module, name); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6157,7 +6193,7 @@ os_unsetenv(PyObject *module, PyObject *arg) return return_value; } -#endif /* defined(HAVE_UNSETENV) */ +#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8773,4 +8809,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=6f42d8be634f5942 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0348cbdff48691e3 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6a687529df0c0..3a8e6aacb2afd 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10083,23 +10083,9 @@ posix_putenv_dict_setitem(PyObject *name, PyObject *value) #ifdef MS_WINDOWS -/*[clinic input] -os.putenv - - name: unicode - value: unicode - / - -Change or add an environment variable. -[clinic start generated code]*/ - -static PyObject * -os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) -/*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ +static PyObject* +win32_putenv(PyObject *name, PyObject *value) { - const wchar_t *env; - Py_ssize_t size; - /* Search from index 1 because on Windows starting '=' is allowed for defining hidden environment variables. */ if (PyUnicode_GET_LENGTH(name) == 0 || @@ -10108,36 +10094,68 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } - PyObject *unicode = PyUnicode_FromFormat("%U=%U", name, value); + PyObject *unicode; + if (value != NULL) { + unicode = PyUnicode_FromFormat("%U=%U", name, value); + } + else { + unicode = PyUnicode_FromFormat("%U=", name); + } if (unicode == NULL) { return NULL; } - env = PyUnicode_AsUnicodeAndSize(unicode, &size); - if (env == NULL) - goto error; + Py_ssize_t size; + /* PyUnicode_AsWideCharString() rejects embedded null characters */ + wchar_t *env = PyUnicode_AsWideCharString(unicode, &size); + Py_DECREF(unicode); + + if (env == NULL) { + return NULL; + } if (size > _MAX_ENV) { PyErr_Format(PyExc_ValueError, "the environment variable is longer than %u characters", _MAX_ENV); - goto error; - } - if (wcslen(env) != (size_t)size) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto error; + PyMem_Free(env); + return NULL; } - if (_wputenv(env)) { + /* _wputenv() and SetEnvironmentVariableW() update the environment in the + Process Environment Block (PEB). _wputenv() also updates CRT 'environ' + and '_wenviron' variables, whereas SetEnvironmentVariableW() does not. + + Prefer _wputenv() to be compatible with C libraries using CRT + variables and CRT functions using these variables (ex: getenv()). */ + int err = _wputenv(env); + PyMem_Free(env); + + if (err) { posix_error(); - goto error; + return NULL; } - Py_DECREF(unicode); Py_RETURN_NONE; +} +#endif -error: - Py_DECREF(unicode); - return NULL; + +#ifdef MS_WINDOWS +/*[clinic input] +os.putenv + + name: unicode + value: unicode + / + +Change or add an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) +/*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ +{ + return win32_putenv(name, value); } /* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ #elif (defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS) @@ -10186,7 +10204,23 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) #endif /* defined(HAVE_SETENV) || defined(HAVE_PUTENV) */ -#ifdef HAVE_UNSETENV +#ifdef MS_WINDOWS +/*[clinic input] +os.unsetenv + name: unicode + / + +Delete an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ +{ + return win32_putenv(name, NULL); +} +/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ +#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) /*[clinic input] os.unsetenv name: FSConverter @@ -10199,16 +10233,13 @@ static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=54c4137ab1834f02 input=2bb5288a599c7107]*/ { -#ifndef HAVE_BROKEN_UNSETENV - int err; -#endif - #ifdef HAVE_BROKEN_UNSETENV unsetenv(PyBytes_AS_STRING(name)); #else - err = unsetenv(PyBytes_AS_STRING(name)); - if (err) + int err = unsetenv(PyBytes_AS_STRING(name)); + if (err) { return posix_error(); + } #endif #ifdef PY_PUTENV_DICT From webhook-mailer at python.org Fri Jan 24 08:05:52 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 Jan 2020 13:05:52 -0000 Subject: [Python-checkins] bpo-39395: putenv() and unsetenv() always available (GH-18135) Message-ID: https://github.com/python/cpython/commit/b8d1262e8afe7b907b4a394a191739571092acdb commit: b8d1262e8afe7b907b4a394a191739571092acdb branch: master author: Victor Stinner committer: GitHub date: 2020-01-24T14:05:48+01:00 summary: bpo-39395: putenv() and unsetenv() always available (GH-18135) The os.putenv() and os.unsetenv() functions are now always available. On non-Windows platforms, Python now requires setenv() and unsetenv() functions to build. Remove putenv_dict from posixmodule.c: it's not longer needed. files: A Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst A Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst M Doc/library/os.rst M Doc/whatsnew/3.9.rst M Lib/os.py M Lib/test/test_os.py M Lib/test/test_posix.py M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/library/os.rst b/Doc/library/os.rst index de3e5603e109f..f59423c6f2d4e 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -111,9 +111,9 @@ process and user. to the environment made after this time are not reflected in ``os.environ``, except for changes made by modifying ``os.environ`` directly. - If the platform supports the :func:`putenv` function, this mapping may be used - to modify the environment as well as query the environment. :func:`putenv` will - be called automatically when the mapping is modified. + This mapping may be used to modify the environment as well as query the + environment. :func:`putenv` will be called automatically when the mapping + is modified. On Unix, keys and values use :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :data:`environb` if you would like @@ -130,14 +130,10 @@ process and user. cause memory leaks. Refer to the system documentation for :c:func:`putenv`. - If :func:`putenv` is not provided, a modified copy of this mapping may be - passed to the appropriate process-creation functions to cause child processes - to use a modified environment. - - If the platform supports the :func:`unsetenv` function, you can delete items in - this mapping to unset environment variables. :func:`unsetenv` will be called - automatically when an item is deleted from ``os.environ``, and when - one of the :meth:`pop` or :meth:`clear` methods is called. + You can delete items in this mapping to unset environment variables. + :func:`unsetenv` will be called automatically when an item is deleted from + ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + called. .. data:: environb @@ -439,17 +435,18 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - .. availability:: most flavors of Unix, Windows. + Assignments to items in ``os.environ`` are automatically translated into + corresponding calls to :func:`putenv`; however, calls to :func:`putenv` + don't update ``os.environ``, so it is actually preferable to assign to items + of ``os.environ``. .. note:: On some platforms, including FreeBSD and Mac OS X, setting ``environ`` may - cause memory leaks. Refer to the system documentation for putenv. + cause memory leaks. Refer to the system documentation for :c:func:`putenv`. - When :func:`putenv` is supported, assignments to items in ``os.environ`` are - automatically translated into corresponding calls to :func:`putenv`; however, - calls to :func:`putenv` don't update ``os.environ``, so it is actually - preferable to assign to items of ``os.environ``. + .. versionchanged:: 3.9 + The function is now always available. .. function:: setegid(egid) @@ -638,15 +635,13 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - When :func:`unsetenv` is supported, deletion of items in ``os.environ`` is - automatically translated into a corresponding call to :func:`unsetenv`; however, - calls to :func:`unsetenv` don't update ``os.environ``, so it is actually - preferable to delete items of ``os.environ``. - - .. availability:: most flavors of Unix, Windows. + Deletion of items in ``os.environ`` is automatically translated into a + corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` + don't update ``os.environ``, so it is actually preferable to delete items of + ``os.environ``. .. versionchanged:: 3.9 - The function is now also available on Windows. + The function is now always available and is also available on Windows. .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 751562e875e6d..a4c4266bfc35d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -227,6 +227,10 @@ descriptors. The :func:`os.unsetenv` function is now also available on Windows. (Contributed by Victor Stinner in :issue:`39413`.) +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. +(Contributed by Victor Stinner in :issue:`39395`.) + poplib ------ @@ -331,6 +335,10 @@ Build and C API Changes Python 3.0, it has been ignored and unused. (Contributed by Jeroen Demeyer in :issue:`36974`.) +* On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` + functions are now required to build Python. + (Contributed by Victor Stinner in :issue:`39395`.) + Deprecated ========== diff --git a/Lib/os.py b/Lib/os.py index ca418edbc5736..7ae102617e8b1 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -654,17 +654,15 @@ def get_exec_path(env=None): return path_list.split(pathsep) -# Change environ to automatically call putenv(), unsetenv if they exist. +# Change environ to automatically call putenv() and unsetenv() from _collections_abc import MutableMapping class _Environ(MutableMapping): - def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue): self.encodekey = encodekey self.decodekey = decodekey self.encodevalue = encodevalue self.decodevalue = decodevalue - self.putenv = putenv - self.unsetenv = unsetenv self._data = data def __getitem__(self, key): @@ -678,12 +676,12 @@ def __getitem__(self, key): def __setitem__(self, key, value): key = self.encodekey(key) value = self.encodevalue(value) - self.putenv(key, value) + putenv(key, value) self._data[key] = value def __delitem__(self, key): encodedkey = self.encodekey(key) - self.unsetenv(encodedkey) + unsetenv(encodedkey) try: del self._data[encodedkey] except KeyError: @@ -712,22 +710,6 @@ def setdefault(self, key, value): self[key] = value return self[key] -try: - _putenv = putenv -except NameError: - _putenv = lambda key, value: None -else: - if "putenv" not in __all__: - __all__.append("putenv") - -try: - _unsetenv = unsetenv -except NameError: - _unsetenv = lambda key: _putenv(key, "") -else: - if "unsetenv" not in __all__: - __all__.append("unsetenv") - def _createenviron(): if name == 'nt': # Where Env Var Names Must Be UPPERCASE @@ -755,8 +737,7 @@ def decode(value): data = environ return _Environ(data, encodekey, decode, - encode, decode, - _putenv, _unsetenv) + encode, decode) # unicode environ environ = _createenviron() @@ -781,8 +762,7 @@ def _check_bytes(value): # bytes environ environb = _Environ(environ._data, _check_bytes, bytes, - _check_bytes, bytes, - _putenv, _unsetenv) + _check_bytes, bytes) del _check_bytes def getenvb(key, default=None): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index dbdc00c2fea22..9e3a1695dfb34 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -953,8 +953,6 @@ def test_environb(self): value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape') self.assertEqual(os.environ['bytes'], value_str) - @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") - @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") def test_putenv_unsetenv(self): name = "PYTHONTESTVAR" value = "testvalue" @@ -975,8 +973,6 @@ def test_putenv_unsetenv(self): # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) - @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") - @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") def test_putenv_unsetenv_error(self): # Empty variable name is invalid. # "=" and null character are not allowed in a variable name. diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 4df882b621085..fad26d88be2f3 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -969,7 +969,6 @@ def test_environ(self): self.assertEqual(type(k), item_type) self.assertEqual(type(v), item_type) - @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()") def test_putenv(self): with self.assertRaises(ValueError): os.putenv('FRUIT\0VEGETABLE', 'cabbage') diff --git a/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst b/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst new file mode 100644 index 0000000000000..aa2146a11d9d7 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst @@ -0,0 +1,2 @@ +On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` functions +are now required to build Python. diff --git a/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst b/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst new file mode 100644 index 0000000000000..cf713709dcfbb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst @@ -0,0 +1,2 @@ +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 0f5995ec6400c..48dd7a74b3bf2 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6082,7 +6082,7 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #endif /* defined(MS_WINDOWS) */ -#if ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6123,7 +6123,7 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -#endif /* ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) */ +#endif /* !defined(MS_WINDOWS) */ #if defined(MS_WINDOWS) @@ -6161,7 +6161,7 @@ os_unsetenv(PyObject *module, PyObject *arg) #endif /* defined(MS_WINDOWS) */ -#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6193,7 +6193,7 @@ os_unsetenv(PyObject *module, PyObject *arg) return return_value; } -#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ +#endif /* !defined(MS_WINDOWS) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8809,4 +8809,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=0348cbdff48691e3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5d99f90cead7c0e1 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3a8e6aacb2afd..b71eddf90b70e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,22 +819,8 @@ dir_fd_converter(PyObject *o, void *p) } } -/* Windows _wputenv() and setenv() copy the arguments and so don't require - the caller to manage the variable memory. Only Unix putenv() requires - putenv_dict. */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) && !defined(HAVE_SETENV) -# define PY_PUTENV_DICT -#endif - typedef struct { PyObject *billion; -#ifdef PY_PUTENV_DICT - /* putenv() requires that the caller manages the environment variable - memory. Use a Python dictionary for that: name => env, where env is a - string like "name=value". On Windows, dict keys and values are Unicode - strings. On Unix, they are bytes strings. */ - PyObject *putenv_dict; -#endif PyObject *DirEntryType; PyObject *ScandirIteratorType; #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2118,9 +2104,6 @@ static int _posix_clear(PyObject *module) { Py_CLEAR(_posixstate(module)->billion); -#ifdef PY_PUTENV_DICT - Py_CLEAR(_posixstate(module)->putenv_dict); -#endif Py_CLEAR(_posixstate(module)->DirEntryType); Py_CLEAR(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2145,9 +2128,6 @@ static int _posix_traverse(PyObject *module, visitproc visit, void *arg) { Py_VISIT(_posixstate(module)->billion); -#ifdef PY_PUTENV_DICT - Py_VISIT(_posixstate(module)->putenv_dict); -#endif Py_VISIT(_posixstate(module)->DirEntryType); Py_VISIT(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -10065,23 +10045,6 @@ os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, #endif /* HAVE_POSIX_FADVISE && !POSIX_FADVISE_AIX_BUG */ -#ifdef PY_PUTENV_DICT -static void -posix_putenv_dict_setitem(PyObject *name, PyObject *value) -{ - /* Install the first arg and newstr in putenv_dict; - * this will cause previous value to be collected. This has to - * happen after the real putenv() call because the old value - * was still accessible until then. */ - if (PyDict_SetItem(_posixstate_global->putenv_dict, name, value)) - /* really not much we can do; just leak */ - PyErr_Clear(); - else - Py_DECREF(value); -} -#endif /* PY_PUTENV_DICT */ - - #ifdef MS_WINDOWS static PyObject* win32_putenv(PyObject *name, PyObject *value) @@ -10157,8 +10120,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) { return win32_putenv(name, value); } -/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ -#elif (defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS) +#else /*[clinic input] os.putenv @@ -10181,27 +10143,12 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) return NULL; } -#ifdef HAVE_SETENV if (setenv(name_string, value_string, 1)) { return posix_error(); } -#else - PyObject *bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); - if (bytes == NULL) { - return NULL; - } - - char *env = PyBytes_AS_STRING(bytes); - if (putenv(env)) { - Py_DECREF(bytes); - return posix_error(); - } - - posix_putenv_dict_setitem(name, bytes); -#endif Py_RETURN_NONE; } -#endif /* defined(HAVE_SETENV) || defined(HAVE_PUTENV) */ +#endif /* !defined(MS_WINDOWS) */ #ifdef MS_WINDOWS @@ -10219,8 +10166,7 @@ os_unsetenv_impl(PyObject *module, PyObject *name) { return win32_putenv(name, NULL); } -/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ -#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) +#else /*[clinic input] os.unsetenv name: FSConverter @@ -10242,24 +10188,9 @@ os_unsetenv_impl(PyObject *module, PyObject *name) } #endif -#ifdef PY_PUTENV_DICT - /* Remove the key from putenv_dict; - * this will cause it to be collected. This has to - * happen after the real unsetenv() call because the - * old value was still accessible until then. - */ - if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { - /* really not much we can do; just leak */ - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - return NULL; - } - PyErr_Clear(); - } -#endif - Py_RETURN_NONE; } -#endif /* HAVE_UNSETENV */ +#endif /* !MS_WINDOWS */ /*[clinic input] @@ -14553,12 +14484,6 @@ INITFUNC(void) Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); -#ifdef PY_PUTENV_DICT - /* Save putenv() parameters as values here, so we can collect them when they - * get re-set with another call for the same key. */ - _posixstate(m)->putenv_dict = PyDict_New(); -#endif - #if defined(HAVE_WAITID) && !defined(__APPLE__) waitid_result_desc.name = MODNAME ".waitid_result"; PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc); diff --git a/configure b/configure index e96683622b304..85120e498d1fa 100755 --- a/configure +++ b/configure @@ -11548,9 +11548,9 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ @@ -11558,7 +11558,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/configure.ac b/configure.ac index 36c165b2f2e42..ab8e1b7d27ac2 100644 --- a/configure.ac +++ b/configure.ac @@ -3598,9 +3598,9 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ @@ -3608,7 +3608,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn) # Force lchmod off for Linux. Linux disallows changing the mode of symbolic diff --git a/pyconfig.h.in b/pyconfig.h.in index 1918fab8bdbe7..b5602134d703a 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -802,9 +802,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PTY_H -/* Define to 1 if you have the `putenv' function. */ -#undef HAVE_PUTENV - /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE @@ -895,9 +892,6 @@ /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID -/* Define to 1 if you have the `setenv' function. */ -#undef HAVE_SETENV - /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID @@ -1266,9 +1260,6 @@ /* Define to 1 if you have the `unlinkat' function. */ #undef HAVE_UNLINKAT -/* Define to 1 if you have the `unsetenv' function. */ -#undef HAVE_UNSETENV - /* Define if you have a useable wchar_t type defined in wchar.h; useable means wchar_t must be an unsigned type with at least 16 bits. (see Include/unicodeobject.h). */ From webhook-mailer at python.org Fri Jan 24 08:14:34 2020 From: webhook-mailer at python.org (Chris Withers) Date: Fri, 24 Jan 2020 13:14:34 -0000 Subject: [Python-checkins] bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) Message-ID: https://github.com/python/cpython/commit/66b00a9d3aacf6ed49412f48743e4913104a2bb3 commit: 66b00a9d3aacf6ed49412f48743e4913104a2bb3 branch: master author: Karthikeyan Singaravelan committer: Chris Withers date: 2020-01-24T13:14:29Z summary: bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) files: A Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 3fafe594c5978..92b596f672c28 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -817,6 +817,10 @@ def _get_call_signature_from_name(self, name): if child is None or isinstance(child, _SpecState): break else: + # If an autospecced object is attached using attach_mock the + # child would be a function with mock object as attribute from + # which signature has to be derived. + child = _extract_mock(child) children = child._mock_children sig = child._spec_signature diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 01bc479444652..1030d12323d36 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1922,6 +1922,35 @@ def test_attach_mock_patch_autospec(self): self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child') + def test_attach_mock_patch_autospec_signature(self): + with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_meth') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + + with mock.patch(f'{__name__}.something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_func') + something(1) + manager.assert_has_calls([call.attach_func(1)]) + something.assert_has_calls([call(1)]) + mocked.assert_has_calls([call(1)]) + + with mock.patch(f'{__name__}.Something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_obj') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_obj(), + call.attach_obj().meth(1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(1, 2, 3, d=4)]) + mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)]) + + def test_attribute_deletion(self): for mock in (Mock(), MagicMock(), NonCallableMagicMock(), NonCallableMock()): diff --git a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst new file mode 100644 index 0000000000000..de80e89e00e2d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst @@ -0,0 +1,2 @@ +Use signature from inner mock for autospecced methods attached with +:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. From webhook-mailer at python.org Fri Jan 24 08:27:09 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 Jan 2020 13:27:09 -0000 Subject: [Python-checkins] Improve test coverage for AsyncMock. (GH-17906) Message-ID: https://github.com/python/cpython/commit/0ea7309927d1b3efde9be986528b8855f0f4c955 commit: 0ea7309927d1b3efde9be986528b8855f0f4c955 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-24T05:27:04-08:00 summary: Improve test coverage for AsyncMock. (GH-17906) * Add test for nested async decorator patch. * Add test for side_effect and wraps with a function. * Add test for side_effect with an exception in the iterable. (cherry picked from commit 54f743eb315f00b0ff45e115dde7a5d506034153) Co-authored-by: Karthikeyan Singaravelan files: M Lib/unittest/test/testmock/testasync.py diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index be8e3117c466b..0bd7ae4929c3e 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -72,9 +72,17 @@ def test_async(mock_method): test_async() def test_async_def_patch(self): - @patch(f"{__name__}.async_func", AsyncMock()) - async def test_async(): + @patch(f"{__name__}.async_func", return_value=1) + @patch(f"{__name__}.async_func_args", return_value=2) + async def test_async(func_args_mock, func_mock): + self.assertEqual(func_args_mock._mock_name, "async_func_args") + self.assertEqual(func_mock._mock_name, "async_func") + self.assertIsInstance(async_func, AsyncMock) + self.assertIsInstance(async_func_args, AsyncMock) + + self.assertEqual(await async_func(), 1) + self.assertEqual(await async_func_args(1, 2, c=3), 2) asyncio.run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -370,22 +378,40 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): with self.assertRaises(Exception): await mock(5) - async def test_add_side_effect_function(self): + async def test_add_side_effect_coroutine(self): async def addition(var): return var + 1 mock = AsyncMock(side_effect=addition) result = await mock(5) self.assertEqual(result, 6) + async def test_add_side_effect_normal_function(self): + def addition(var): + return var + 1 + mock = AsyncMock(side_effect=addition) + result = await mock(5) + self.assertEqual(result, 6) + async def test_add_side_effect_iterable(self): vals = [1, 2, 3] mock = AsyncMock(side_effect=vals) for item in vals: - self.assertEqual(item, await mock()) + self.assertEqual(await mock(), item) with self.assertRaises(StopAsyncIteration) as e: await mock() + async def test_add_side_effect_exception_iterable(self): + class SampleException(Exception): + pass + + vals = [1, SampleException("foo")] + mock = AsyncMock(side_effect=vals) + self.assertEqual(await mock(), 1) + + with self.assertRaises(SampleException) as e: + await mock() + async def test_return_value_AsyncMock(self): value = AsyncMock(return_value=10) mock = AsyncMock(return_value=value) @@ -432,6 +458,21 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): mock.assert_awaited() self.assertTrue(ran) + async def test_wraps_normal_function(self): + value = 1 + + ran = False + def inner(): + nonlocal ran + ran = True + return value + + mock = AsyncMock(wraps=inner) + result = await mock() + self.assertEqual(result, value) + mock.assert_awaited() + self.assertTrue(ran) + class AsyncMagicMethods(unittest.TestCase): def test_async_magic_methods_return_async_mocks(self): m_mock = MagicMock() @@ -854,6 +895,10 @@ def test_assert_awaited_once(self): self.mock.assert_awaited_once() def test_assert_awaited_with(self): + msg = 'Not awaited' + with self.assertRaisesRegex(AssertionError, msg): + self.mock.assert_awaited_with('foo') + asyncio.run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): From webhook-mailer at python.org Fri Jan 24 09:51:26 2020 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Fri, 24 Jan 2020 14:51:26 -0000 Subject: [Python-checkins] bpo-39390 shutil: fix argument types for ignore callback (GH-18122) Message-ID: https://github.com/python/cpython/commit/88704334e5262c6cd395a0809d4ef810f33f3ca5 commit: 88704334e5262c6cd395a0809d4ef810f33f3ca5 branch: master author: mbarkhau committer: Giampaolo Rodola date: 2020-01-24T15:51:16+01:00 summary: bpo-39390 shutil: fix argument types for ignore callback (GH-18122) files: A Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst M Lib/shutil.py M Lib/test/test_shutil.py diff --git a/Lib/shutil.py b/Lib/shutil.py index 8f609b312d331..9a83a3242ed91 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -442,7 +442,7 @@ def _ignore_patterns(path, names): def _copytree(entries, src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks, dirs_exist_ok=False): if ignore is not None: - ignored_names = ignore(src, {x.name for x in entries}) + ignored_names = ignore(os.fspath(src), [x.name for x in entries]) else: ignored_names = set() diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 460b979ba9332..076c450e09bf6 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -579,6 +579,48 @@ def _filter(src, names): shutil.rmtree(src_dir) shutil.rmtree(os.path.dirname(dst_dir)) + def test_copytree_arg_types_of_ignore(self): + join = os.path.join + exists = os.path.exists + + tmp_dir = self.mkdtemp() + src_dir = join(tmp_dir, "source") + + os.mkdir(join(src_dir)) + os.mkdir(join(src_dir, 'test_dir')) + os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) + write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + + invokations = [] + + def _ignore(src, names): + invokations.append(src) + self.assertIsInstance(src, str) + self.assertIsInstance(names, list) + self.assertEqual(len(names), len(set(names))) + for name in names: + self.assertIsInstance(name, str) + return [] + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(src_dir, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + src_dir_entry = list(os.scandir(tmp_dir))[0] + self.assertIsInstance(src_dir_entry, os.DirEntry) + shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + self.assertEqual(len(invokations), 9) + def test_copytree_retains_permissions(self): tmp_dir = self.mkdtemp() src_dir = os.path.join(tmp_dir, 'source') diff --git a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst new file mode 100644 index 0000000000000..ffa961ea4cd22 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst @@ -0,0 +1,2 @@ +Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. From webhook-mailer at python.org Fri Jan 24 12:05:28 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 24 Jan 2020 17:05:28 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in GC collect() (GH-18164) Message-ID: https://github.com/python/cpython/commit/656c45ec9a9dc2e94cec199ebde553a6979e0e05 commit: 656c45ec9a9dc2e94cec199ebde553a6979e0e05 branch: master author: Victor Stinner committer: GitHub date: 2020-01-24T18:05:24+01:00 summary: bpo-38631: Avoid Py_FatalError() in GC collect() (GH-18164) collect() should not get an exception, but it does, logging the exception is enough. Override sys.unraisablehook to decide how to handle unraisable exceptions. Py_FatalError() should be avoided whenever possible. files: M Modules/gcmodule.c diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index aacdb3f45a179..99a6c9ed91d36 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -118,9 +118,6 @@ gc_decref(PyGC_Head *g) g->_gc_prev -= 1 << _PyGC_PREV_SHIFT; } -/* Python string to use if unhandled exception occurs */ -static PyObject *gc_str = NULL; - /* set for debugging information */ #define DEBUG_STATS (1<<0) /* print collection statistics */ #define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */ @@ -1310,10 +1307,7 @@ collect(PyThreadState *tstate, int generation, _PyErr_Clear(tstate); } else { - if (gc_str == NULL) - gc_str = PyUnicode_FromString("garbage collection"); - PyErr_WriteUnraisable(gc_str); - Py_FatalError("unexpected exception during garbage collection"); + _PyErr_WriteUnraisableMsg("in garbage collection", NULL); } } From webhook-mailer at python.org Fri Jan 24 12:56:13 2020 From: webhook-mailer at python.org (Ethan Furman) Date: Fri, 24 Jan 2020 17:56:13 -0000 Subject: [Python-checkins] bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Message-ID: https://github.com/python/cpython/commit/9017e0bd5e124ae6d2ed94b9e9cacb2e86270980 commit: 9017e0bd5e124ae6d2ed94b9e9cacb2e86270980 branch: master author: Serhiy Storchaka committer: Ethan Furman date: 2020-01-24T09:55:52-08:00 summary: bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Use `from ... import ...` to ensure module is fully loaded before accessing its attributes. files: A Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst M Lib/tarfile.py diff --git a/Lib/tarfile.py b/Lib/tarfile.py index d0b748cea1723..90a2c95b315b3 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1655,13 +1655,12 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): + from gzip import GzipFile + except ImportError: raise CompressionError("gzip module is not available") try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + fileobj = GzipFile(name, mode + "b", compresslevel, fileobj) except OSError: if fileobj is not None and mode == 'r': raise ReadError("not a gzip file") @@ -1689,12 +1688,11 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import bz2 + from bz2 import BZ2File except ImportError: raise CompressionError("bz2 module is not available") - fileobj = bz2.BZ2File(fileobj or name, mode, - compresslevel=compresslevel) + fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel) try: t = cls.taropen(name, mode, fileobj, **kwargs) @@ -1718,15 +1716,15 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import lzma + from lzma import LZMAFile, LZMAError except ImportError: raise CompressionError("lzma module is not available") - fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset) + fileobj = LZMAFile(fileobj or name, mode, preset=preset) try: t = cls.taropen(name, mode, fileobj, **kwargs) - except (lzma.LZMAError, EOFError): + except (LZMAError, EOFError): fileobj.close() if mode == 'r': raise ReadError("not an lzma file") diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst new file mode 100644 index 0000000000000..712fc5d34bbe0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst @@ -0,0 +1 @@ +Fixed race condition in lazy imports in :mod:`tarfile`. From webhook-mailer at python.org Fri Jan 24 15:10:52 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 Jan 2020 20:10:52 -0000 Subject: [Python-checkins] bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Message-ID: https://github.com/python/cpython/commit/ea4a61fec842c94107eef46e5030b89a086f94bb commit: ea4a61fec842c94107eef46e5030b89a086f94bb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-24T12:10:42-08:00 summary: bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Use `from ... import ...` to ensure module is fully loaded before accessing its attributes. (cherry picked from commit 9017e0bd5e124ae6d2ed94b9e9cacb2e86270980) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst M Lib/tarfile.py diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 2c06f9160c658..d31b9cbb51d65 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1655,13 +1655,12 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): + from gzip import GzipFile + except ImportError: raise CompressionError("gzip module is not available") try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + fileobj = GzipFile(name, mode + "b", compresslevel, fileobj) except OSError: if fileobj is not None and mode == 'r': raise ReadError("not a gzip file") @@ -1689,12 +1688,11 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import bz2 + from bz2 import BZ2File except ImportError: raise CompressionError("bz2 module is not available") - fileobj = bz2.BZ2File(fileobj or name, mode, - compresslevel=compresslevel) + fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel) try: t = cls.taropen(name, mode, fileobj, **kwargs) @@ -1718,15 +1716,15 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import lzma + from lzma import LZMAFile, LZMAError except ImportError: raise CompressionError("lzma module is not available") - fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset) + fileobj = LZMAFile(fileobj or name, mode, preset=preset) try: t = cls.taropen(name, mode, fileobj, **kwargs) - except (lzma.LZMAError, EOFError): + except (LZMAError, EOFError): fileobj.close() if mode == 'r': raise ReadError("not an lzma file") diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst new file mode 100644 index 0000000000000..712fc5d34bbe0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst @@ -0,0 +1 @@ +Fixed race condition in lazy imports in :mod:`tarfile`. From webhook-mailer at python.org Fri Jan 24 15:10:57 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 24 Jan 2020 20:10:57 -0000 Subject: [Python-checkins] bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Message-ID: https://github.com/python/cpython/commit/1a274359283d3d1f4f60dd527843f72e0368caf3 commit: 1a274359283d3d1f4f60dd527843f72e0368caf3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-24T12:10:52-08:00 summary: bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Use `from ... import ...` to ensure module is fully loaded before accessing its attributes. (cherry picked from commit 9017e0bd5e124ae6d2ed94b9e9cacb2e86270980) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst M Lib/tarfile.py diff --git a/Lib/tarfile.py b/Lib/tarfile.py index edd31e96fb469..3b596cbf49d27 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1629,13 +1629,12 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): + from gzip import GzipFile + except ImportError: raise CompressionError("gzip module is not available") try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + fileobj = GzipFile(name, mode + "b", compresslevel, fileobj) except OSError: if fileobj is not None and mode == 'r': raise ReadError("not a gzip file") @@ -1663,12 +1662,11 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import bz2 + from bz2 import BZ2File except ImportError: raise CompressionError("bz2 module is not available") - fileobj = bz2.BZ2File(fileobj or name, mode, - compresslevel=compresslevel) + fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel) try: t = cls.taropen(name, mode, fileobj, **kwargs) @@ -1692,15 +1690,15 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import lzma + from lzma import LZMAFile, LZMAError except ImportError: raise CompressionError("lzma module is not available") - fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset) + fileobj = LZMAFile(fileobj or name, mode, preset=preset) try: t = cls.taropen(name, mode, fileobj, **kwargs) - except (lzma.LZMAError, EOFError): + except (LZMAError, EOFError): fileobj.close() if mode == 'r': raise ReadError("not an lzma file") diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst new file mode 100644 index 0000000000000..712fc5d34bbe0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst @@ -0,0 +1 @@ +Fixed race condition in lazy imports in :mod:`tarfile`. From webhook-mailer at python.org Sat Jan 25 04:01:18 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sat, 25 Jan 2020 09:01:18 -0000 Subject: [Python-checkins] bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Message-ID: https://github.com/python/cpython/commit/d0d9fa8c5e30aff71b6d5e8b2673396622f33270 commit: d0d9fa8c5e30aff71b6d5e8b2673396622f33270 branch: master author: Cheryl Sabella committer: Terry Jan Reedy date: 2020-01-25T04:00:54-05:00 summary: bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 708292ebee9f1..eda7c2788764d 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,9 @@ Released on 2020-10-05? ====================================== -bpo-39050: Make Settings dialog Help button work again. +bpo-39388: Settings dialog Cancel button cancels pending changes. + +bpo-39050: Settings dialog Help button again displays help text. bpo-32989: Add tests for editor newline_and_indent_event method. Remove unneeded arguments and dead code from pyparse diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 0e007b516ea5e..2f95c9ccaa0c5 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -191,6 +191,7 @@ def cancel(self): Methods: destroy: inherited """ + changes.clear() self.destroy() def destroy(self): diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 7c575d0e5992c..817a35217bf3c 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,17 +47,24 @@ def tearDownModule(): root.destroy() root = dialog = None -class ConfigDialogTest(unittest.TestCase): - def test_help(self): +class DialogTest(unittest.TestCase): + + @mock.patch(__name__+'.dialog.destroy', new_callable=Func) + def test_cancel(self, destroy): + changes['main']['something'] = 1 + dialog.cancel() + self.assertEqual(changes['main'], {}) + self.assertEqual(destroy.called, 1) + + @mock.patch('idlelib.configdialog.view_text', new_callable=Func) + def test_help(self, view): dialog.note.select(dialog.keyspage) - saved = configdialog.view_text - view = configdialog.view_text = Func() dialog.help() s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click')) - self.assertTrue(s.endswith('a different name.\n')) - configdialog.view_text = saved + self.assertTrue(s.startswith('When you click') and + s.endswith('a different name.\n')) + class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst new file mode 100644 index 0000000000000..42bbfb168c19d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst @@ -0,0 +1 @@ +IDLE Settings Cancel button now cancels pending changes From webhook-mailer at python.org Sat Jan 25 04:17:59 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 25 Jan 2020 09:17:59 -0000 Subject: [Python-checkins] bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Message-ID: https://github.com/python/cpython/commit/a23449285430081ea317cc1f203c80c410bbd8b9 commit: a23449285430081ea317cc1f203c80c410bbd8b9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-25T01:17:54-08:00 summary: bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Co-authored-by: Terry Jan Reedy (cherry picked from commit d0d9fa8c5e30aff71b6d5e8b2673396622f33270) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 729d405116a3d..b7217335fe281 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,9 @@ Released on 2019-12-16? ====================================== -bpo-39050: Make Settings dialog Help button work again. +bpo-39388: Settings dialog Cancel button cancels pending changes. + +bpo-39050: Settings dialog Help button again displays help text. bpo-32989: Add tests for editor newline_and_indent_event method. Remove unneeded arguments and dead code from pyparse diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 0e007b516ea5e..2f95c9ccaa0c5 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -191,6 +191,7 @@ def cancel(self): Methods: destroy: inherited """ + changes.clear() self.destroy() def destroy(self): diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 7c575d0e5992c..817a35217bf3c 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,17 +47,24 @@ def tearDownModule(): root.destroy() root = dialog = None -class ConfigDialogTest(unittest.TestCase): - def test_help(self): +class DialogTest(unittest.TestCase): + + @mock.patch(__name__+'.dialog.destroy', new_callable=Func) + def test_cancel(self, destroy): + changes['main']['something'] = 1 + dialog.cancel() + self.assertEqual(changes['main'], {}) + self.assertEqual(destroy.called, 1) + + @mock.patch('idlelib.configdialog.view_text', new_callable=Func) + def test_help(self, view): dialog.note.select(dialog.keyspage) - saved = configdialog.view_text - view = configdialog.view_text = Func() dialog.help() s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click')) - self.assertTrue(s.endswith('a different name.\n')) - configdialog.view_text = saved + self.assertTrue(s.startswith('When you click') and + s.endswith('a different name.\n')) + class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst new file mode 100644 index 0000000000000..42bbfb168c19d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst @@ -0,0 +1 @@ +IDLE Settings Cancel button now cancels pending changes From webhook-mailer at python.org Sat Jan 25 04:18:33 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 25 Jan 2020 09:18:33 -0000 Subject: [Python-checkins] bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Message-ID: https://github.com/python/cpython/commit/fd9ce2b924263c1f5c5a2f3f3095fe6ae97c1432 commit: fd9ce2b924263c1f5c5a2f3f3095fe6ae97c1432 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-25T01:18:28-08:00 summary: bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Co-authored-by: Terry Jan Reedy (cherry picked from commit d0d9fa8c5e30aff71b6d5e8b2673396622f33270) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index f3c3cbad5a98f..23901f3aa5f1c 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,9 @@ Released on 2019-12-16? ====================================== -bpo-39050: Make Settings dialog Help button work again. +bpo-39388: Settings dialog Cancel button cancels pending changes. + +bpo-39050: Settings dialog Help button again displays help text. bpo-32989: Add tests for editor newline_and_indent_event method. Remove unneeded arguments and dead code from pyparse diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 0e007b516ea5e..2f95c9ccaa0c5 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -191,6 +191,7 @@ def cancel(self): Methods: destroy: inherited """ + changes.clear() self.destroy() def destroy(self): diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 7c575d0e5992c..817a35217bf3c 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,17 +47,24 @@ def tearDownModule(): root.destroy() root = dialog = None -class ConfigDialogTest(unittest.TestCase): - def test_help(self): +class DialogTest(unittest.TestCase): + + @mock.patch(__name__+'.dialog.destroy', new_callable=Func) + def test_cancel(self, destroy): + changes['main']['something'] = 1 + dialog.cancel() + self.assertEqual(changes['main'], {}) + self.assertEqual(destroy.called, 1) + + @mock.patch('idlelib.configdialog.view_text', new_callable=Func) + def test_help(self, view): dialog.note.select(dialog.keyspage) - saved = configdialog.view_text - view = configdialog.view_text = Func() dialog.help() s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click')) - self.assertTrue(s.endswith('a different name.\n')) - configdialog.view_text = saved + self.assertTrue(s.startswith('When you click') and + s.endswith('a different name.\n')) + class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst new file mode 100644 index 0000000000000..42bbfb168c19d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst @@ -0,0 +1 @@ +IDLE Settings Cancel button now cancels pending changes From webhook-mailer at python.org Sat Jan 25 05:17:51 2020 From: webhook-mailer at python.org (Chris Withers) Date: Sat, 25 Jan 2020 10:17:51 -0000 Subject: [Python-checkins] bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18116) Message-ID: https://github.com/python/cpython/commit/62865f4532094017a9b780b704686ca9734bc329 commit: 62865f4532094017a9b780b704686ca9734bc329 branch: master author: Matthew Kokotovich committer: Chris Withers date: 2020-01-25T10:17:47Z summary: bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18116) files: A Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 92b596f672c28..047ae7c25599b 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -46,6 +46,8 @@ def _is_async_obj(obj): if _is_instance_mock(obj) and not isinstance(obj, AsyncMock): return False + if hasattr(obj, '__func__'): + obj = getattr(obj, '__func__') return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 73d31a2966882..43b87498ef373 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -19,6 +19,15 @@ def __init__(self): def normal_method(self): pass + @classmethod + async def async_class_method(cls): + pass + + @staticmethod + async def async_static_method(): + pass + + class AwaitableClass: def __await__(self): yield @@ -71,6 +80,20 @@ def test_async(mock_method): test_async() + def test_is_AsyncMock_patch_staticmethod(self): + @patch.object(AsyncClass, 'async_static_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + def test_is_AsyncMock_patch_classmethod(self): + @patch.object(AsyncClass, 'async_class_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + def test_async_def_patch(self): @patch(f"{__name__}.async_func", return_value=1) @patch(f"{__name__}.async_func_args", return_value=2) diff --git a/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst new file mode 100644 index 0000000000000..52c4ee1b33bda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst @@ -0,0 +1 @@ +Allow AsyncMock to correctly patch static/class methods From webhook-mailer at python.org Sat Jan 25 05:53:58 2020 From: webhook-mailer at python.org (Chris Withers) Date: Sat, 25 Jan 2020 10:53:58 -0000 Subject: [Python-checkins] bpo-37955: correct mock.patch docs with respect to the returned type (GH-15521) Message-ID: https://github.com/python/cpython/commit/40c080934b3d49311209b1cb690c2ea1e04df7e7 commit: 40c080934b3d49311209b1cb690c2ea1e04df7e7 branch: master author: Paulo Henrique Silva committer: Chris Withers date: 2020-01-25T10:53:54Z summary: bpo-37955: correct mock.patch docs with respect to the returned type (GH-15521) files: M Doc/library/unittest.mock.rst M Lib/unittest/mock.py diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 8394304cfdd9a..515bdd060a198 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1401,7 +1401,8 @@ patch "as"; very useful if :func:`patch` is creating a mock object for you. :func:`patch` takes arbitrary keyword arguments. These will be passed to - the :class:`Mock` (or *new_callable*) on construction. + :class:`AsyncMock` if the patched object is asynchronous, to + :class:`MagicMock` otherwise or to *new_callable* if specified. ``patch.dict(...)``, ``patch.multiple(...)`` and ``patch.object(...)`` are available for alternate use-cases. diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 047ae7c25599b..a97542a2ddf00 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1730,7 +1730,8 @@ def patch( "as"; very useful if `patch` is creating a mock object for you. `patch` takes arbitrary keyword arguments. These will be passed to - the `Mock` (or `new_callable`) on construction. + `AsyncMock` if the patched object is asynchronous, to `MagicMock` + otherwise or to `new_callable` if specified. `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are available for alternate use-cases. From webhook-mailer at python.org Sat Jan 25 09:53:12 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Sat, 25 Jan 2020 14:53:12 -0000 Subject: [Python-checkins] bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) (GH-18167) Message-ID: https://github.com/python/cpython/commit/a5906b2bfce9560568dee1dcc3550e74e742dd34 commit: a5906b2bfce9560568dee1dcc3550e74e742dd34 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Karthikeyan Singaravelan date: 2020-01-25T20:23:08+05:30 summary: bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) (GH-18167) If an autospecced object is attached using attach_mock the child would be a function with mock object as attribute from which signature has to be derived. (cherry picked from commit 66b00a9d3aacf6ed49412f48743e4913104a2bb3) Co-authored-by: Karthikeyan Singaravelan files: A Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index e92ccf168dbbd..34f2dd77ec6cd 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -825,6 +825,10 @@ def _get_call_signature_from_name(self, name): if child is None or isinstance(child, _SpecState): break else: + # If an autospecced object is attached using attach_mock the + # child would be a function with mock object as attribute from + # which signature has to be derived. + child = _extract_mock(child) children = child._mock_children sig = child._spec_signature diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 6dc2725427ec5..1cde45e9aea55 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1914,6 +1914,35 @@ def test_attach_mock_patch_autospec(self): self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child') + def test_attach_mock_patch_autospec_signature(self): + with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_meth') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + + with mock.patch(f'{__name__}.something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_func') + something(1) + manager.assert_has_calls([call.attach_func(1)]) + something.assert_has_calls([call(1)]) + mocked.assert_has_calls([call(1)]) + + with mock.patch(f'{__name__}.Something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_obj') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_obj(), + call.attach_obj().meth(1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(1, 2, 3, d=4)]) + mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)]) + + def test_attribute_deletion(self): for mock in (Mock(), MagicMock(), NonCallableMagicMock(), NonCallableMock()): diff --git a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst new file mode 100644 index 0000000000000..de80e89e00e2d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst @@ -0,0 +1,2 @@ +Use signature from inner mock for autospecced methods attached with +:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. From webhook-mailer at python.org Sat Jan 25 09:55:02 2020 From: webhook-mailer at python.org (Karthikeyan Singaravelan) Date: Sat, 25 Jan 2020 14:55:02 -0000 Subject: [Python-checkins] bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) (#18166) Message-ID: https://github.com/python/cpython/commit/71d2b3344f4560ffee14fccd320b20e7add50fec commit: 71d2b3344f4560ffee14fccd320b20e7add50fec branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Karthikeyan Singaravelan date: 2020-01-25T20:24:57+05:30 summary: bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) (#18166) If an autospecced object is attached using attach_mock the child would be a function with mock object as attribute from which signature has to be derived. (cherry picked from commit 66b00a9d3aacf6ed49412f48743e4913104a2bb3) Co-authored-by: Karthikeyan Singaravelan files: A Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 213e596629965..372a6719be9fa 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -794,6 +794,10 @@ def _get_call_signature_from_name(self, name): if child is None or isinstance(child, _SpecState): break else: + # If an autospecced object is attached using attach_mock the + # child would be a function with mock object as attribute from + # which signature has to be derived. + child = _extract_mock(child) children = child._mock_children sig = child._spec_signature diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 3046d4cfe6393..12772d39fcd99 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1863,6 +1863,35 @@ def test_attach_mock_patch_autospec(self): self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child') + def test_attach_mock_patch_autospec_signature(self): + with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_meth') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + + with mock.patch(f'{__name__}.something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_func') + something(1) + manager.assert_has_calls([call.attach_func(1)]) + something.assert_has_calls([call(1)]) + mocked.assert_has_calls([call(1)]) + + with mock.patch(f'{__name__}.Something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_obj') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_obj(), + call.attach_obj().meth(1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(1, 2, 3, d=4)]) + mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)]) + + def test_attribute_deletion(self): for mock in (Mock(), MagicMock(), NonCallableMagicMock(), NonCallableMock()): diff --git a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst new file mode 100644 index 0000000000000..de80e89e00e2d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst @@ -0,0 +1,2 @@ +Use signature from inner mock for autospecced methods attached with +:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. From webhook-mailer at python.org Sat Jan 25 10:08:18 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 25 Jan 2020 15:08:18 -0000 Subject: [Python-checkins] Update 3.8.rst (GH-18173) Message-ID: https://github.com/python/cpython/commit/9bfb4a7061a3bc4fc5632bccfdf9ed61f62679f7 commit: 9bfb4a7061a3bc4fc5632bccfdf9ed61f62679f7 branch: master author: fireattack committer: Cheryl Sabella date: 2020-01-25T10:08:13-05:00 summary: Update 3.8.rst (GH-18173) Fixed the name of the contributor (@selik). files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 0927a965dd3de..fabc1c597eca7 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -725,7 +725,7 @@ csv The :class:`csv.DictReader` now returns instances of :class:`dict` instead of a :class:`collections.OrderedDict`. The tool is now faster and uses less memory while still preserving the field order. -(Contributed by Michael Seek in :issue:`34003`.) +(Contributed by Michael Selik in :issue:`34003`.) curses From webhook-mailer at python.org Sat Jan 25 10:44:50 2020 From: webhook-mailer at python.org (Chris Withers) Date: Sat, 25 Jan 2020 15:44:50 -0000 Subject: [Python-checkins] bpo-38932: Mock fully resets child objects on reset_mock(). (GH-17409) Message-ID: https://github.com/python/cpython/commit/aef7dc89879d099dc704bd8037b8a7686fb72838 commit: aef7dc89879d099dc704bd8037b8a7686fb72838 branch: master author: Vegard Stikbakke committer: Chris Withers date: 2020-01-25T15:44:46Z summary: bpo-38932: Mock fully resets child objects on reset_mock(). (GH-17409) files: A Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index a97542a2ddf00..beed717522bba 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -592,7 +592,7 @@ def reset_mock(self, visited=None,*, return_value=False, side_effect=False): for child in self._mock_children.values(): if isinstance(child, _SpecState) or child is _deleted: continue - child.reset_mock(visited) + child.reset_mock(visited, return_value=return_value, side_effect=side_effect) ret = self._mock_return_value if _is_instance_mock(ret) and ret is not self: diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 1030d12323d36..1329346ae7246 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1636,11 +1636,23 @@ def test_reset_return(self): self.assertNotEqual(m.side_effect, None) def test_reset_sideeffect(self): - m = Mock(return_value=10, side_effect=[2,3]) + m = Mock(return_value=10, side_effect=[2, 3]) m.reset_mock(side_effect=True) self.assertEqual(m.return_value, 10) self.assertEqual(m.side_effect, None) + def test_reset_return_with_children(self): + m = MagicMock(f=MagicMock(return_value=1)) + self.assertEqual(m.f(), 1) + m.reset_mock(return_value=True) + self.assertNotEqual(m.f(), 1) + + def test_reset_return_with_children_side_effect(self): + m = MagicMock(f=MagicMock(side_effect=[2, 3])) + self.assertNotEqual(m.f.side_effect, None) + m.reset_mock(side_effect=True) + self.assertEqual(m.f.side_effect, None) + def test_mock_add_spec(self): class _One(object): one = 1 diff --git a/Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst b/Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst new file mode 100644 index 0000000000000..d9ce8e816bc0a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst @@ -0,0 +1 @@ +Mock fully resets child objects on reset_mock(). Patch by Vegard Stikbakke From webhook-mailer at python.org Sat Jan 25 12:33:40 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 25 Jan 2020 17:33:40 -0000 Subject: [Python-checkins] Update 3.8.rst (GH-18173) (#18182) Message-ID: https://github.com/python/cpython/commit/079dfe082a4c7eb4038afbb1097fca9d90b83e1a commit: 079dfe082a4c7eb4038afbb1097fca9d90b83e1a branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Cheryl Sabella date: 2020-01-25T12:33:36-05:00 summary: Update 3.8.rst (GH-18173) (#18182) Fixed the name of the contributor (@selik). (cherry picked from commit 9bfb4a7061a3bc4fc5632bccfdf9ed61f62679f7) Co-authored-by: fireattack files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 546fa2d5f016e..7bc91a9fc19bf 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -727,7 +727,7 @@ csv The :class:`csv.DictReader` now returns instances of :class:`dict` instead of a :class:`collections.OrderedDict`. The tool is now faster and uses less memory while still preserving the field order. -(Contributed by Michael Seek in :issue:`34003`.) +(Contributed by Michael Selik in :issue:`34003`.) curses From webhook-mailer at python.org Sat Jan 25 13:50:04 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 25 Jan 2020 18:50:04 -0000 Subject: [Python-checkins] bpo-15243: Document __prepare__ as classmethod (GH-17124) Message-ID: https://github.com/python/cpython/commit/7de617455ed788e6730c40cf854c4b72b0432194 commit: 7de617455ed788e6730c40cf854c4b72b0432194 branch: master author: alclarks <57201106+alclarks at users.noreply.github.com> committer: Berker Peksag date: 2020-01-25T21:49:58+03:00 summary: bpo-15243: Document __prepare__ as classmethod (GH-17124) files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 1442fbeb33d76..9520f824287f6 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1945,7 +1945,8 @@ Preparing the class namespace Once the appropriate metaclass has been identified, then the class namespace is prepared. If the metaclass has a ``__prepare__`` attribute, it is called as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the -additional keyword arguments, if any, come from the class definition). +additional keyword arguments, if any, come from the class definition). The +``__prepare__`` method should be implemented as a :func:`classmethod`. If the metaclass has no ``__prepare__`` attribute, then the class namespace is initialised as an empty ordered mapping. From webhook-mailer at python.org Sat Jan 25 14:04:21 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 25 Jan 2020 19:04:21 -0000 Subject: [Python-checkins] bpo-15243: Document __prepare__ as classmethod (GH-17124) Message-ID: https://github.com/python/cpython/commit/321491a536c378227f9d574703f7c06f89c67dcf commit: 321491a536c378227f9d574703f7c06f89c67dcf branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2020-01-25T22:04:16+03:00 summary: bpo-15243: Document __prepare__ as classmethod (GH-17124) (cherry picked from commit 7de617455ed788e6730c40cf854c4b72b0432194) Co-authored-by: alclarks <57201106+alclarks at users.noreply.github.com> files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index e801ee392f195..7b3bf0d2f5f36 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1945,7 +1945,8 @@ Preparing the class namespace Once the appropriate metaclass has been identified, then the class namespace is prepared. If the metaclass has a ``__prepare__`` attribute, it is called as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the -additional keyword arguments, if any, come from the class definition). +additional keyword arguments, if any, come from the class definition). The +``__prepare__`` method should be implemented as a :func:`classmethod`. If the metaclass has no ``__prepare__`` attribute, then the class namespace is initialised as an empty ordered mapping. From webhook-mailer at python.org Sat Jan 25 14:05:00 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 25 Jan 2020 19:05:00 -0000 Subject: [Python-checkins] bpo-15243: Document __prepare__ as classmethod (GH-17124) Message-ID: https://github.com/python/cpython/commit/548685e364af3d366d3aef924b2077ee6f8d13dc commit: 548685e364af3d366d3aef924b2077ee6f8d13dc branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2020-01-25T22:04:55+03:00 summary: bpo-15243: Document __prepare__ as classmethod (GH-17124) (cherry picked from commit 7de617455ed788e6730c40cf854c4b72b0432194) Co-authored-by: alclarks <57201106+alclarks at users.noreply.github.com> files: M Doc/reference/datamodel.rst diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 7d6cc34373b6c..d25357db43468 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1931,7 +1931,8 @@ Preparing the class namespace Once the appropriate metaclass has been identified, then the class namespace is prepared. If the metaclass has a ``__prepare__`` attribute, it is called as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the -additional keyword arguments, if any, come from the class definition). +additional keyword arguments, if any, come from the class definition). The +``__prepare__`` method should be implemented as a :func:`classmethod`. If the metaclass has no ``__prepare__`` attribute, then the class namespace is initialised as an empty ordered mapping. From webhook-mailer at python.org Sat Jan 25 14:23:04 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 25 Jan 2020 19:23:04 -0000 Subject: [Python-checkins] bpo-36654: Add examples for using tokenize module programmically (#12947) Message-ID: https://github.com/python/cpython/commit/4b09dc79f4d08d85f2cc945563e9c8ef1e531d7b commit: 4b09dc79f4d08d85f2cc945563e9c8ef1e531d7b branch: master author: Windson yang committer: Berker Peksag date: 2020-01-25T22:23:00+03:00 summary: bpo-36654: Add examples for using tokenize module programmically (#12947) files: M Doc/library/tokenize.rst diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index b208ba46d17d9..96778f23f8f06 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -278,3 +278,22 @@ The exact token type names can be displayed using the :option:`-e` option: 4,10-4,11: RPAR ')' 4,11-4,12: NEWLINE '\n' 5,0-5,0: ENDMARKER '' + +Example of tokenizing a file programmatically, reading unicode +strings instead of bytes with :func:`generate_tokens`:: + + import tokenize + + with tokenize.open('hello.py') as f: + tokens = tokenize.generate_tokens(f.readline) + for token in tokens: + print(token) + +Or reading bytes directly with :func:`.tokenize`:: + + import tokenize + + with open('hello.py', 'rb') as f: + tokens = tokenize.tokenize(f.readline) + for token in tokens: + print(token) From webhook-mailer at python.org Sat Jan 25 14:34:41 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 25 Jan 2020 19:34:41 -0000 Subject: [Python-checkins] bpo-36654: Add examples for using tokenize module programmatically (GH-18187) Message-ID: https://github.com/python/cpython/commit/1cf0df4f1bcc38dfd70a152af20cf584de531ea7 commit: 1cf0df4f1bcc38dfd70a152af20cf584de531ea7 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2020-01-25T22:34:36+03:00 summary: bpo-36654: Add examples for using tokenize module programmatically (GH-18187) (cherry picked from commit 4b09dc79f4d08d85f2cc945563e9c8ef1e531d7b) Co-authored-by: Windson yang files: M Doc/library/tokenize.rst diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index b208ba46d17d9..96778f23f8f06 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -278,3 +278,22 @@ The exact token type names can be displayed using the :option:`-e` option: 4,10-4,11: RPAR ')' 4,11-4,12: NEWLINE '\n' 5,0-5,0: ENDMARKER '' + +Example of tokenizing a file programmatically, reading unicode +strings instead of bytes with :func:`generate_tokens`:: + + import tokenize + + with tokenize.open('hello.py') as f: + tokens = tokenize.generate_tokens(f.readline) + for token in tokens: + print(token) + +Or reading bytes directly with :func:`.tokenize`:: + + import tokenize + + with open('hello.py', 'rb') as f: + tokens = tokenize.tokenize(f.readline) + for token in tokens: + print(token) From webhook-mailer at python.org Sat Jan 25 14:36:09 2020 From: webhook-mailer at python.org (Berker Peksag) Date: Sat, 25 Jan 2020 19:36:09 -0000 Subject: [Python-checkins] bpo-36654: Add examples for using tokenize module programmatically (GH-12947) Message-ID: https://github.com/python/cpython/commit/6dbd843dedc9e05c0e3f4714294837f0a83deebe commit: 6dbd843dedc9e05c0e3f4714294837f0a83deebe branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Berker Peksag date: 2020-01-25T22:36:04+03:00 summary: bpo-36654: Add examples for using tokenize module programmatically (GH-12947) (cherry picked from commit 4b09dc79f4d08d85f2cc945563e9c8ef1e531d7b) Co-authored-by: Windson yang files: M Doc/library/tokenize.rst diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index 4c0a0ceef7dc4..4dd56f9e7c8bf 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -267,3 +267,22 @@ The exact token type names can be displayed using the :option:`-e` option: 4,10-4,11: RPAR ')' 4,11-4,12: NEWLINE '\n' 5,0-5,0: ENDMARKER '' + +Example of tokenizing a file programmatically, reading unicode +strings instead of bytes with :func:`generate_tokens`:: + + import tokenize + + with tokenize.open('hello.py') as f: + tokens = tokenize.generate_tokens(f.readline) + for token in tokens: + print(token) + +Or reading bytes directly with :func:`.tokenize`:: + + import tokenize + + with open('hello.py', 'rb') as f: + tokens = tokenize.tokenize(f.readline) + for token in tokens: + print(token) From webhook-mailer at python.org Sat Jan 25 14:40:32 2020 From: webhook-mailer at python.org (Ned Deily) Date: Sat, 25 Jan 2020 19:40:32 -0000 Subject: [Python-checkins] bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) (GH-17875) Message-ID: https://github.com/python/cpython/commit/eec7636bfd07412b5872c0683636e9e98bf79a8c commit: eec7636bfd07412b5872c0683636e9e98bf79a8c branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2020-01-25T14:40:27-05:00 summary: bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) (GH-17875) (cherry picked from commit 2e9012a3e1e316c54e27f51ba5849ba06eab7da2) Co-authored-by: YoSTEALTH <35307184+YoSTEALTH at users.noreply.github.com> files: M Doc/library/enum.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 19277d76995fe..7538084767d76 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -55,7 +55,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. + Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` From webhook-mailer at python.org Sat Jan 25 14:41:30 2020 From: webhook-mailer at python.org (Ned Deily) Date: Sat, 25 Jan 2020 19:41:30 -0000 Subject: [Python-checkins] bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) (GH-17876) Message-ID: https://github.com/python/cpython/commit/b0a6ec256b460f071e33b4633e5bec450d8e6394 commit: b0a6ec256b460f071e33b4633e5bec450d8e6394 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2020-01-25T14:41:25-05:00 summary: bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) (GH-17876) (cherry picked from commit 2e9012a3e1e316c54e27f51ba5849ba06eab7da2) Co-authored-by: YoSTEALTH <35307184+YoSTEALTH at users.noreply.github.com> files: M Doc/library/enum.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index a6285ffaf1911..38221199dcdb7 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -55,7 +55,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. + Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` From webhook-mailer at python.org Sat Jan 25 17:19:10 2020 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 25 Jan 2020 22:19:10 -0000 Subject: [Python-checkins] bpo-39374: Updated sorting documentation (GH-18177) Message-ID: https://github.com/python/cpython/commit/8271441d8b6e1f8eae1457c437da24e775801d9f commit: 8271441d8b6e1f8eae1457c437da24e775801d9f branch: master author: Juhana Jauhiainen committer: Raymond Hettinger date: 2020-01-25T14:18:58-08:00 summary: bpo-39374: Updated sorting documentation (GH-18177) files: M Doc/howto/sorting.rst diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index 1d6d5c45b4d9f..a8efe65353d6e 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -43,16 +43,18 @@ Key Functions ============= Both :meth:`list.sort` and :func:`sorted` have a *key* parameter to specify a -function to be called on each list element prior to making comparisons. +function (or other callable) to be called on each list element prior to making +comparisons. For example, here's a case-insensitive string comparison: >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] -The value of the *key* parameter should be a function that takes a single argument -and returns a key to use for sorting purposes. This technique is fast because -the key function is called exactly once for each input record. +The value of the *key* parameter should be a function (or other callable) that +takes a single argument and returns a key to use for sorting purposes. This +technique is fast because the key function is called exactly once for each +input record. A common pattern is to sort complex objects using some of the object's indices as keys. For example: From webhook-mailer at python.org Sat Jan 25 21:08:05 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sun, 26 Jan 2020 02:08:05 -0000 Subject: [Python-checkins] Fix linecache.py add lazycache to __all__ and use dict.clear to clear the cache (GH-4641) Message-ID: https://github.com/python/cpython/commit/4515a590a4a4c09231a66e81782f33b4bfcd5054 commit: 4515a590a4a4c09231a66e81782f33b4bfcd5054 branch: master author: ?? committer: Cheryl Sabella date: 2020-01-25T21:07:40-05:00 summary: Fix linecache.py add lazycache to __all__ and use dict.clear to clear the cache (GH-4641) files: A Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst M Lib/linecache.py diff --git a/Lib/linecache.py b/Lib/linecache.py index 3afcce1f0a145..ddd0abf2cf01d 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -10,17 +10,8 @@ import os import tokenize -__all__ = ["getline", "clearcache", "checkcache"] +__all__ = ["getline", "clearcache", "checkcache", "lazycache"] -def getline(filename, lineno, module_globals=None): - lines = getlines(filename, module_globals) - if 1 <= lineno <= len(lines): - return lines[lineno-1] - else: - return '' - - -# The cache # The cache. Maps filenames to either a thunk which will provide source code, # or a tuple (size, mtime, lines, fullname) once loaded. @@ -29,9 +20,17 @@ def getline(filename, lineno, module_globals=None): def clearcache(): """Clear the cache entirely.""" + cache.clear() - global cache - cache = {} + +def getline(filename, lineno, module_globals=None): + """Get a line for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno - 1] + return '' def getlines(filename, module_globals=None): @@ -56,11 +55,10 @@ def checkcache(filename=None): if filename is None: filenames = list(cache.keys()) + elif filename in cache: + filenames = [filename] else: - if filename in cache: - filenames = [filename] - else: - return + return for filename in filenames: entry = cache[filename] @@ -109,8 +107,10 @@ def updatecache(filename, module_globals=None): # for this module. return [] cache[filename] = ( - len(data), None, - [line+'\n' for line in data.splitlines()], fullname + len(data), + None, + [line + '\n' for line in data.splitlines()], + fullname ) return cache[filename][2] diff --git a/Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst b/Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst new file mode 100644 index 0000000000000..fc8f36fb02194 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst @@ -0,0 +1,3 @@ +* Add `lazycache` function to `__all__`. +* Use `dict.clear` to clear the cache. +* Refactoring `getline` function and `checkcache` function. From webhook-mailer at python.org Sat Jan 25 23:21:22 2020 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sun, 26 Jan 2020 04:21:22 -0000 Subject: [Python-checkins] bpo-36018: Add another example for NormalDist() (#18191) Message-ID: https://github.com/python/cpython/commit/10355ed7f132ed10f1e0d8bd64ccb744b86b1cce commit: 10355ed7f132ed10f1e0d8bd64ccb744b86b1cce branch: master author: Raymond Hettinger committer: GitHub date: 2020-01-25T20:21:17-08:00 summary: bpo-36018: Add another example for NormalDist() (#18191) files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 4c7239c1895fb..09b02cabf21f8 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -772,6 +772,42 @@ Carlo simulation `_: >>> quantiles(map(model, X, Y, Z)) # doctest: +SKIP [1.4591308524824727, 1.8035946855390597, 2.175091447274739] +Normal distributions can be used to approximate `Binomial +distributions `_ +when the sample size is large and when the probability of a successful +trial is near 50%. + +For example, an open source conference has 750 attendees and two rooms with a +500 person capacity. There is a talk about Python and another about Ruby. +In previous conferences, 65% of the attendees preferred to listen to Python +talks. Assuming the population preferences haven't changed, what is the +probability that the rooms will stay within their capacity limits? + +.. doctest:: + + >>> n = 750 # Sample size + >>> p = 0.65 # Preference for Python + >>> q = 1.0 - p # Preference for Ruby + >>> k = 500 # Room capacity + + >>> # Approximation using the cumulative normal distribution + >>> from math import sqrt + >>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4) + 0.8402 + + >>> # Solution using the cumulative binomial distribution + >>> from math import comb, fsum + >>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4) + 0.8402 + + >>> # Approximation using a simulation + >>> from random import seed, choices + >>> seed(8675309) + >>> def trial(): + ... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python') + >>> mean(trial() <= k for i in range(10_000)) + 0.8398 + Normal distributions commonly arise in machine learning problems. Wikipedia has a `nice example of a Naive Bayesian Classifier From webhook-mailer at python.org Sun Jan 26 00:24:18 2020 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sun, 26 Jan 2020 05:24:18 -0000 Subject: [Python-checkins] bpo-36018: Add another example for NormalDist() (GH-18191) (GH-18192) Message-ID: https://github.com/python/cpython/commit/eebcff8c071b38b53bd429892524ba8518cbeb98 commit: eebcff8c071b38b53bd429892524ba8518cbeb98 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2020-01-25T21:24:13-08:00 summary: bpo-36018: Add another example for NormalDist() (GH-18191) (GH-18192) files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 4c7239c1895fb..09b02cabf21f8 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -772,6 +772,42 @@ Carlo simulation `_: >>> quantiles(map(model, X, Y, Z)) # doctest: +SKIP [1.4591308524824727, 1.8035946855390597, 2.175091447274739] +Normal distributions can be used to approximate `Binomial +distributions `_ +when the sample size is large and when the probability of a successful +trial is near 50%. + +For example, an open source conference has 750 attendees and two rooms with a +500 person capacity. There is a talk about Python and another about Ruby. +In previous conferences, 65% of the attendees preferred to listen to Python +talks. Assuming the population preferences haven't changed, what is the +probability that the rooms will stay within their capacity limits? + +.. doctest:: + + >>> n = 750 # Sample size + >>> p = 0.65 # Preference for Python + >>> q = 1.0 - p # Preference for Ruby + >>> k = 500 # Room capacity + + >>> # Approximation using the cumulative normal distribution + >>> from math import sqrt + >>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4) + 0.8402 + + >>> # Solution using the cumulative binomial distribution + >>> from math import comb, fsum + >>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4) + 0.8402 + + >>> # Approximation using a simulation + >>> from random import seed, choices + >>> seed(8675309) + >>> def trial(): + ... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python') + >>> mean(trial() <= k for i in range(10_000)) + 0.8398 + Normal distributions commonly arise in machine learning problems. Wikipedia has a `nice example of a Naive Bayesian Classifier From webhook-mailer at python.org Sun Jan 26 10:30:34 2020 From: webhook-mailer at python.org (Chris Withers) Date: Sun, 26 Jan 2020 15:30:34 -0000 Subject: [Python-checkins] [3.8] bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18190) Message-ID: https://github.com/python/cpython/commit/19be85c76503535c101b38194d282187de0ff631 commit: 19be85c76503535c101b38194d282187de0ff631 branch: 3.8 author: Matthew Kokotovich committer: Chris Withers date: 2020-01-26T15:30:27Z summary: [3.8] bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18190) (cherry picked from commit 62865f4532094017a9b780b704686ca9734bc329) Co-authored-by: Matthew Kokotovich files: A Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 34f2dd77ec6cd..66ace80cb5f9c 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -48,6 +48,8 @@ def _is_async_obj(obj): if _is_instance_mock(obj) and not isinstance(obj, AsyncMock): return False + if hasattr(obj, '__func__'): + obj = getattr(obj, '__func__') return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 0bd7ae4929c3e..e68022afdccea 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -19,6 +19,15 @@ def __init__(self): def normal_method(self): pass + @classmethod + async def async_class_method(cls): + pass + + @staticmethod + async def async_static_method(): + pass + + class AwaitableClass: def __await__(self): yield @@ -71,6 +80,20 @@ def test_async(mock_method): test_async() + def test_is_AsyncMock_patch_staticmethod(self): + @patch.object(AsyncClass, 'async_static_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + def test_is_AsyncMock_patch_classmethod(self): + @patch.object(AsyncClass, 'async_class_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + def test_async_def_patch(self): @patch(f"{__name__}.async_func", return_value=1) @patch(f"{__name__}.async_func_args", return_value=2) diff --git a/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst new file mode 100644 index 0000000000000..52c4ee1b33bda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst @@ -0,0 +1 @@ +Allow AsyncMock to correctly patch static/class methods From webhook-mailer at python.org Mon Jan 27 01:48:30 2020 From: webhook-mailer at python.org (Chris Withers) Date: Mon, 27 Jan 2020 06:48:30 -0000 Subject: [Python-checkins] bpo-25597: Ensure wraps' return value is used for magic methods in MagicMock (#16029) Message-ID: https://github.com/python/cpython/commit/72b1004657e60c900e4cd031b2635b587f4b280e commit: 72b1004657e60c900e4cd031b2635b587f4b280e branch: master author: Karthikeyan Singaravelan committer: Chris Withers date: 2020-01-27T06:48:15Z summary: bpo-25597: Ensure wraps' return value is used for magic methods in MagicMock (#16029) files: A Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index beed717522bba..1acafc51df1d6 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2033,6 +2033,12 @@ def __aiter__(): def _set_return_value(mock, method, name): + # If _mock_wraps is present then attach it so that wrapped object + # is used for return value is used when called. + if mock._mock_wraps is not None: + method._mock_wraps = getattr(mock._mock_wraps, name) + return + fixed = _return_values.get(name, DEFAULT) if fixed is not DEFAULT: method.return_value = fixed diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 1329346ae7246..677346725bdd2 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -715,6 +715,53 @@ def method(self): pass self.assertRaises(StopIteration, mock.method) + def test_magic_method_wraps_dict(self): + data = {'foo': 'bar'} + + wrapped_dict = MagicMock(wraps=data) + self.assertEqual(wrapped_dict.get('foo'), 'bar') + self.assertEqual(wrapped_dict['foo'], 'bar') + self.assertTrue('foo' in wrapped_dict) + + # return_value is non-sentinel and takes precedence over wrapped value. + wrapped_dict.get.return_value = 'return_value' + self.assertEqual(wrapped_dict.get('foo'), 'return_value') + + # return_value is sentinel and hence wrapped value is returned. + wrapped_dict.get.return_value = sentinel.DEFAULT + self.assertEqual(wrapped_dict.get('foo'), 'bar') + + self.assertEqual(wrapped_dict.get('baz'), None) + with self.assertRaises(KeyError): + wrapped_dict['baz'] + self.assertFalse('bar' in wrapped_dict) + + data['baz'] = 'spam' + self.assertEqual(wrapped_dict.get('baz'), 'spam') + self.assertEqual(wrapped_dict['baz'], 'spam') + self.assertTrue('baz' in wrapped_dict) + + del data['baz'] + self.assertEqual(wrapped_dict.get('baz'), None) + + + def test_magic_method_wraps_class(self): + + class Foo: + + def __getitem__(self, index): + return index + + def __custom_method__(self): + return "foo" + + + klass = MagicMock(wraps=Foo) + obj = klass() + self.assertEqual(obj.__getitem__(2), 2) + self.assertEqual(obj.__custom_method__(), "foo") + + def test_exceptional_side_effect(self): mock = Mock(side_effect=AttributeError) self.assertRaises(AttributeError, mock) diff --git a/Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst b/Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst new file mode 100644 index 0000000000000..5ad8c6d90fa03 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst @@ -0,0 +1,3 @@ +Ensure, if ``wraps`` is supplied to :class:`unittest.mock.MagicMock`, it is used +to calculate return values for the magic methods instead of using the default +return values. Patch by Karthikeyan Singaravelan. From webhook-mailer at python.org Mon Jan 27 04:57:51 2020 From: webhook-mailer at python.org (Mark Shannon) Date: Mon, 27 Jan 2020 09:57:51 -0000 Subject: [Python-checkins] bpo-39320: Handle unpacking of **values in compiler (GH-18141) Message-ID: https://github.com/python/cpython/commit/8a4cd700a7426341c2074a2b580306d2d60ec839 commit: 8a4cd700a7426341c2074a2b580306d2d60ec839 branch: master author: Mark Shannon committer: GitHub date: 2020-01-27T09:57:45Z summary: bpo-39320: Handle unpacking of **values in compiler (GH-18141) * Add DICT_UPDATE and DICT_MERGE bytecodes. Use them for ** unpacking. * Remove BUILD_MAP_UNPACK and BUILD_MAP_UNPACK_WITH_CALL, as they are now unused. * Update magic number for ** unpacking opcodes. * Update dis.rst to incorporate new bytecodes. * Add blurb entry. files: A Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst M Doc/library/dis.rst M Include/opcode.h M Lib/importlib/_bootstrap_external.py M Lib/opcode.py M Python/ceval.c M Python/compile.c M Python/importlib.h M Python/importlib_external.h M Python/opcode_targets.h diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d5d30a03aeadd..61233d98a0d18 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -873,32 +873,25 @@ All of the following opcodes use their arguments. .. versionadded:: 3.9 -.. opcode:: SET_UPDATE +.. opcode:: SET_UPDATE (i) Calls ``set.update(TOS1[-i], TOS)``. Used to build sets. .. versionadded:: 3.9 -.. opcode:: BUILD_MAP_UNPACK (count) +.. opcode:: DICT_UPDATE (i) - Pops *count* mappings from the stack, merges them into a single dictionary, - and pushes the result. Implements dictionary unpacking in dictionary - displays ``{**x, **y, **z}``. + Calls ``dict.update(TOS1[-i], TOS)``. Used to build dicts. - .. versionadded:: 3.5 + .. versionadded:: 3.9 -.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (count) +.. opcode:: DICT_MERGE - This is similar to :opcode:`BUILD_MAP_UNPACK`, - but is used for ``f(**x, **y, **z)`` call syntax. The stack item at - position ``count + 2`` should be the corresponding callable ``f``. + Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys. - .. versionadded:: 3.5 - .. versionchanged:: 3.6 - The position of the callable is determined by adding 2 to the opcode - argument instead of encoding it in the second byte of the argument. + .. versionadded:: 3.9 .. opcode:: LOAD_ATTR (namei) diff --git a/Include/opcode.h b/Include/opcode.h index 1c5cd335f3622..19944fac0b9f2 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -117,8 +117,6 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 -#define BUILD_MAP_UNPACK 150 -#define BUILD_MAP_UNPACK_WITH_CALL 151 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 @@ -127,6 +125,8 @@ extern "C" { #define CALL_METHOD 161 #define LIST_EXTEND 162 #define SET_UPDATE 163 +#define DICT_MERGE 164 +#define DICT_UPDATE 165 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 6c703fa3f75fa..2434cf06fd444 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -276,6 +276,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) # Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) # Python 3.9a2 3424 (simplify bytecodes for *value unpacking) +# Python 3.9a2 3425 (simplify bytecodes for **value unpacking) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -285,7 +286,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3424).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3425).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/opcode.py b/Lib/opcode.py index 5bc2ddc357163..ac1aa535f66ff 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -200,9 +200,6 @@ def jabs_op(name, op): def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 -def_op('BUILD_MAP_UNPACK', 150) -def_op('BUILD_MAP_UNPACK_WITH_CALL', 151) - jrel_op('SETUP_ASYNC_WITH', 154) def_op('FORMAT_VALUE', 155) @@ -214,5 +211,7 @@ def jabs_op(name, op): def_op('LIST_EXTEND', 162) def_op('SET_UPDATE', 163) +def_op('DICT_MERGE', 164) +def_op('DICT_UPDATE', 165) del def_op, name_op, jrel_op, jabs_op diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst new file mode 100644 index 0000000000000..9508574f6c0f4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst @@ -0,0 +1,4 @@ + +Replace two complex bytecodes for building dicts with two simpler ones. +The new bytecodes ``DICT_MERGE`` and ``DICT_UPDATE`` have been added +The old bytecodes ``BUILD_MAP_UNPACK`` and ``BUILD_MAP_UNPACK_WITH_CALL`` have been removed. diff --git a/Python/ceval.c b/Python/ceval.c index 528ad7fdd1e20..673b401e6aba3 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2801,49 +2801,32 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; - - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (PyDict_Update(sum, arg) < 0) { - if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - _PyErr_Format(tstate, PyExc_TypeError, - "'%.200s' object is not a mapping", - arg->ob_type->tp_name); - } - Py_DECREF(sum); - goto error; + case TARGET(DICT_UPDATE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); + if (PyDict_Update(dict, update) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not a mapping", + update->ob_type->tp_name); } + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK_WITH_CALL): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; + case TARGET(DICT_MERGE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (_PyDict_MergeEx(sum, arg, 2) < 0) { - Py_DECREF(sum); - format_kwargs_error(tstate, PEEK(2 + oparg), arg); - goto error; - } + if (_PyDict_MergeEx(dict, update, 2) < 0) { + format_kwargs_error(tstate, PEEK(2 + oparg), update); + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); PREDICT(CALL_FUNCTION_EX); DISPATCH(); } diff --git a/Python/compile.c b/Python/compile.c index 9ed29f4a1f9e5..6776df54d47d0 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1007,9 +1007,6 @@ stack_effect(int opcode, int oparg, int jump) case BUILD_SET: case BUILD_STRING: return 1-oparg; - case BUILD_MAP_UNPACK: - case BUILD_MAP_UNPACK_WITH_CALL: - return 1 - oparg; case BUILD_MAP: return 1 - 2*oparg; case BUILD_CONST_KEY_MAP: @@ -1125,6 +1122,8 @@ stack_effect(int opcode, int oparg, int jump) return 0; case LIST_EXTEND: case SET_UPDATE: + case DICT_MERGE: + case DICT_UPDATE: return -1; default: return PY_INVALID_STACK_EFFECT; @@ -3868,37 +3867,58 @@ static int compiler_dict(struct compiler *c, expr_ty e) { Py_ssize_t i, n, elements; - int containers; + int have_dict; int is_unpacking = 0; n = asdl_seq_LEN(e->v.Dict.values); - containers = 0; + have_dict = 0; elements = 0; for (i = 0; i < n; i++) { is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL; - if (elements == 0xFFFF || (elements && is_unpacking)) { - if (!compiler_subdict(c, e, i - elements, i)) - return 0; - containers++; - elements = 0; - } if (is_unpacking) { + if (elements) { + if (!compiler_subdict(c, e, i - elements, i)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + if (have_dict == 0) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); - containers++; + ADDOP_I(c, DICT_UPDATE, 1); } else { - elements++; + if (elements == 0xFFFF) { + if (!compiler_subdict(c, e, i - elements, i)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + else { + elements++; + } } } - if (elements || containers == 0) { - if (!compiler_subdict(c, e, n - elements, n)) + if (elements) { + if (!compiler_subdict(c, e, n - elements, n)) { return 0; - containers++; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; } - /* If there is more than one dict, they need to be merged into a new - * dict. If there is one dict and it's an unpacking, then it needs - * to be copied into a new dict." */ - if (containers > 1 || is_unpacking) { - ADDOP_I(c, BUILD_MAP_UNPACK, containers); + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); } return 1; } @@ -4263,8 +4283,8 @@ compiler_call_helper(struct compiler *c, } /* Then keyword arguments */ if (nkwelts) { - /* the number of dictionaries on the stack */ - Py_ssize_t nsubkwargs = 0; + /* Has a new dict been pushed */ + int have_dict = 0; nseen = 0; /* the number of keyword arguments on the stack following */ for (i = 0; i < nkwelts; i++) { @@ -4272,13 +4292,18 @@ compiler_call_helper(struct compiler *c, if (kw->arg == NULL) { /* A keyword argument unpacking. */ if (nseen) { - if (!compiler_subkwargs(c, keywords, i - nseen, i)) + if (!compiler_subkwargs(c, keywords, i - nseen, i)) { return 0; - nsubkwargs++; + } + have_dict = 1; nseen = 0; } + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, kw->value); - nsubkwargs++; + ADDOP_I(c, DICT_MERGE, 1); } else { nseen++; @@ -4286,14 +4311,15 @@ compiler_call_helper(struct compiler *c, } if (nseen) { /* Pack up any trailing keyword arguments. */ - if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) + if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) { return 0; - nsubkwargs++; - } - if (nsubkwargs > 1) { - /* Pack it all up */ - ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs); + } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } + have_dict = 1; } + assert(have_dict); } ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0); return 1; diff --git a/Python/importlib.h b/Python/importlib.h index 3a84e9bb1d81f..7f999704f31a3 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -368,680 +368,824 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101, 194,0,0,0,115,12,0,0,0,0,6,8,1,2,1,12, 1,12,3,6,2,114,64,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,79, - 0,0,0,115,10,0,0,0,124,0,124,1,124,2,142,1, - 83,0,41,1,97,46,1,0,0,114,101,109,111,118,101,95, - 105,109,112,111,114,116,108,105,98,95,102,114,97,109,101,115, - 32,105,110,32,105,109,112,111,114,116,46,99,32,119,105,108, - 108,32,97,108,119,97,121,115,32,114,101,109,111,118,101,32, - 115,101,113,117,101,110,99,101,115,10,32,32,32,32,111,102, - 32,105,109,112,111,114,116,108,105,98,32,102,114,97,109,101, - 115,32,116,104,97,116,32,101,110,100,32,119,105,116,104,32, - 97,32,99,97,108,108,32,116,111,32,116,104,105,115,32,102, - 117,110,99,116,105,111,110,10,10,32,32,32,32,85,115,101, - 32,105,116,32,105,110,115,116,101,97,100,32,111,102,32,97, - 32,110,111,114,109,97,108,32,99,97,108,108,32,105,110,32, - 112,108,97,99,101,115,32,119,104,101,114,101,32,105,110,99, - 108,117,100,105,110,103,32,116,104,101,32,105,109,112,111,114, - 116,108,105,98,10,32,32,32,32,102,114,97,109,101,115,32, - 105,110,116,114,111,100,117,99,101,115,32,117,110,119,97,110, - 116,101,100,32,110,111,105,115,101,32,105,110,116,111,32,116, - 104,101,32,116,114,97,99,101,98,97,99,107,32,40,101,46, - 103,46,32,119,104,101,110,32,101,120,101,99,117,116,105,110, - 103,10,32,32,32,32,109,111,100,117,108,101,32,99,111,100, - 101,41,10,32,32,32,32,114,10,0,0,0,41,3,218,1, - 102,114,54,0,0,0,90,4,107,119,100,115,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,25,95,99,97, - 108,108,95,119,105,116,104,95,102,114,97,109,101,115,95,114, - 101,109,111,118,101,100,211,0,0,0,115,2,0,0,0,0, - 8,114,66,0,0,0,114,37,0,0,0,41,1,218,9,118, - 101,114,98,111,115,105,116,121,99,1,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,4,0,0,0,71,0,0, - 0,115,54,0,0,0,116,0,106,1,106,2,124,1,107,5, - 114,50,124,0,160,3,100,1,161,1,115,30,100,2,124,0, - 23,0,125,0,116,4,124,0,106,5,124,2,142,0,116,0, - 106,6,100,3,141,2,1,0,100,4,83,0,41,5,122,61, - 80,114,105,110,116,32,116,104,101,32,109,101,115,115,97,103, - 101,32,116,111,32,115,116,100,101,114,114,32,105,102,32,45, - 118,47,80,89,84,72,79,78,86,69,82,66,79,83,69,32, - 105,115,32,116,117,114,110,101,100,32,111,110,46,41,2,250, - 1,35,122,7,105,109,112,111,114,116,32,122,2,35,32,41, - 1,90,4,102,105,108,101,78,41,7,114,15,0,0,0,218, - 5,102,108,97,103,115,218,7,118,101,114,98,111,115,101,218, - 10,115,116,97,114,116,115,119,105,116,104,218,5,112,114,105, - 110,116,114,44,0,0,0,218,6,115,116,100,101,114,114,41, - 3,218,7,109,101,115,115,97,103,101,114,67,0,0,0,114, - 54,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,222,0,0,0,115,8,0,0,0,0,2, - 12,1,10,1,8,1,114,75,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 3,0,0,0,115,26,0,0,0,135,0,102,1,100,1,100, - 2,132,8,125,1,116,0,124,1,136,0,131,2,1,0,124, - 1,83,0,41,3,122,49,68,101,99,111,114,97,116,111,114, - 32,116,111,32,118,101,114,105,102,121,32,116,104,101,32,110, - 97,109,101,100,32,109,111,100,117,108,101,32,105,115,32,98, - 117,105,108,116,45,105,110,46,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0, - 0,115,38,0,0,0,124,1,116,0,106,1,118,1,114,28, - 116,2,100,1,160,3,124,1,161,1,124,1,100,2,141,2, - 130,1,136,0,124,0,124,1,131,2,83,0,41,3,78,250, - 29,123,33,114,125,32,105,115,32,110,111,116,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,114,16, - 0,0,0,41,4,114,15,0,0,0,218,20,98,117,105,108, - 116,105,110,95,109,111,100,117,108,101,95,110,97,109,101,115, - 218,11,73,109,112,111,114,116,69,114,114,111,114,114,44,0, - 0,0,169,2,114,30,0,0,0,218,8,102,117,108,108,110, - 97,109,101,169,1,218,3,102,120,110,114,10,0,0,0,114, - 11,0,0,0,218,25,95,114,101,113,117,105,114,101,115,95, - 98,117,105,108,116,105,110,95,119,114,97,112,112,101,114,232, - 0,0,0,115,10,0,0,0,0,1,10,1,10,1,2,255, - 6,2,122,52,95,114,101,113,117,105,114,101,115,95,98,117, - 105,108,116,105,110,46,60,108,111,99,97,108,115,62,46,95, - 114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,110, - 95,119,114,97,112,112,101,114,169,1,114,12,0,0,0,41, - 2,114,82,0,0,0,114,83,0,0,0,114,10,0,0,0, - 114,81,0,0,0,114,11,0,0,0,218,17,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,230,0,0, - 0,115,6,0,0,0,0,2,12,5,10,1,114,85,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, - 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, - 0,131,2,1,0,124,1,83,0,41,3,122,47,68,101,99, - 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121, - 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108, - 101,32,105,115,32,102,114,111,122,101,110,46,99,2,0,0, + 0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,79, + 0,0,0,115,14,0,0,0,124,0,124,1,105,0,124,2, + 164,1,142,1,83,0,41,1,97,46,1,0,0,114,101,109, + 111,118,101,95,105,109,112,111,114,116,108,105,98,95,102,114, + 97,109,101,115,32,105,110,32,105,109,112,111,114,116,46,99, + 32,119,105,108,108,32,97,108,119,97,121,115,32,114,101,109, + 111,118,101,32,115,101,113,117,101,110,99,101,115,10,32,32, + 32,32,111,102,32,105,109,112,111,114,116,108,105,98,32,102, + 114,97,109,101,115,32,116,104,97,116,32,101,110,100,32,119, + 105,116,104,32,97,32,99,97,108,108,32,116,111,32,116,104, + 105,115,32,102,117,110,99,116,105,111,110,10,10,32,32,32, + 32,85,115,101,32,105,116,32,105,110,115,116,101,97,100,32, + 111,102,32,97,32,110,111,114,109,97,108,32,99,97,108,108, + 32,105,110,32,112,108,97,99,101,115,32,119,104,101,114,101, + 32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,105, + 109,112,111,114,116,108,105,98,10,32,32,32,32,102,114,97, + 109,101,115,32,105,110,116,114,111,100,117,99,101,115,32,117, + 110,119,97,110,116,101,100,32,110,111,105,115,101,32,105,110, + 116,111,32,116,104,101,32,116,114,97,99,101,98,97,99,107, + 32,40,101,46,103,46,32,119,104,101,110,32,101,120,101,99, + 117,116,105,110,103,10,32,32,32,32,109,111,100,117,108,101, + 32,99,111,100,101,41,10,32,32,32,32,114,10,0,0,0, + 41,3,218,1,102,114,54,0,0,0,90,4,107,119,100,115, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 25,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109, + 101,115,95,114,101,109,111,118,101,100,211,0,0,0,115,2, + 0,0,0,0,8,114,66,0,0,0,114,37,0,0,0,41, + 1,218,9,118,101,114,98,111,115,105,116,121,99,1,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,4,0,0, + 0,71,0,0,0,115,54,0,0,0,116,0,106,1,106,2, + 124,1,107,5,114,50,124,0,160,3,100,1,161,1,115,30, + 100,2,124,0,23,0,125,0,116,4,124,0,106,5,124,2, + 142,0,116,0,106,6,100,3,141,2,1,0,100,4,83,0, + 41,5,122,61,80,114,105,110,116,32,116,104,101,32,109,101, + 115,115,97,103,101,32,116,111,32,115,116,100,101,114,114,32, + 105,102,32,45,118,47,80,89,84,72,79,78,86,69,82,66, + 79,83,69,32,105,115,32,116,117,114,110,101,100,32,111,110, + 46,41,2,250,1,35,122,7,105,109,112,111,114,116,32,122, + 2,35,32,41,1,90,4,102,105,108,101,78,41,7,114,15, + 0,0,0,218,5,102,108,97,103,115,218,7,118,101,114,98, + 111,115,101,218,10,115,116,97,114,116,115,119,105,116,104,218, + 5,112,114,105,110,116,114,44,0,0,0,218,6,115,116,100, + 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,67, + 0,0,0,114,54,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,222,0,0,0,115,8,0, + 0,0,0,2,12,1,10,1,8,1,114,75,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,3,0,0,0,115,26,0,0,0,135,0,102, + 1,100,1,100,2,132,8,125,1,116,0,124,1,136,0,131, + 2,1,0,124,1,83,0,41,3,122,49,68,101,99,111,114, + 97,116,111,114,32,116,111,32,118,101,114,105,102,121,32,116, + 104,101,32,110,97,109,101,100,32,109,111,100,117,108,101,32, + 105,115,32,98,117,105,108,116,45,105,110,46,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,19,0,0,0,115,38,0,0,0,116,0,160,1,124,1, - 161,1,115,28,116,2,100,1,160,3,124,1,161,1,124,1, + 0,19,0,0,0,115,38,0,0,0,124,1,116,0,106,1, + 118,1,114,28,116,2,100,1,160,3,124,1,161,1,124,1, 100,2,141,2,130,1,136,0,124,0,124,1,131,2,83,0, - 169,3,78,122,27,123,33,114,125,32,105,115,32,110,111,116, - 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 114,16,0,0,0,41,4,114,56,0,0,0,218,9,105,115, - 95,102,114,111,122,101,110,114,78,0,0,0,114,44,0,0, - 0,114,79,0,0,0,114,81,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,24,95,114,101,113,117,105,114,101,115, - 95,102,114,111,122,101,110,95,119,114,97,112,112,101,114,243, - 0,0,0,115,10,0,0,0,0,1,10,1,10,1,2,255, - 6,2,122,50,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,46,60,108,111,99,97,108,115,62,46,95,114, - 101,113,117,105,114,101,115,95,102,114,111,122,101,110,95,119, - 114,97,112,112,101,114,114,84,0,0,0,41,2,114,82,0, - 0,0,114,88,0,0,0,114,10,0,0,0,114,81,0,0, - 0,114,11,0,0,0,218,16,95,114,101,113,117,105,114,101, - 115,95,102,114,111,122,101,110,241,0,0,0,115,6,0,0, - 0,0,2,12,5,10,1,114,89,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, - 0,67,0,0,0,115,62,0,0,0,116,0,124,1,124,0, - 131,2,125,2,124,1,116,1,106,2,118,0,114,50,116,1, - 106,2,124,1,25,0,125,3,116,3,124,2,124,3,131,2, - 1,0,116,1,106,2,124,1,25,0,83,0,116,4,124,2, - 131,1,83,0,100,1,83,0,41,2,122,128,76,111,97,100, - 32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,109, - 111,100,117,108,101,32,105,110,116,111,32,115,121,115,46,109, - 111,100,117,108,101,115,32,97,110,100,32,114,101,116,117,114, - 110,32,105,116,46,10,10,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,108,111,97,100,101, - 114,46,101,120,101,99,95,109,111,100,117,108,101,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,78,41,5,218, - 16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,101, - 114,114,15,0,0,0,218,7,109,111,100,117,108,101,115,218, - 5,95,101,120,101,99,218,5,95,108,111,97,100,41,4,114, - 30,0,0,0,114,80,0,0,0,218,4,115,112,101,99,218, - 6,109,111,100,117,108,101,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,17,95,108,111,97,100,95,109,111, - 100,117,108,101,95,115,104,105,109,253,0,0,0,115,12,0, - 0,0,0,6,10,1,10,1,10,1,10,1,10,2,114,96, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,8,0,0,0,67,0,0,0,115,218,0,0, - 0,116,0,124,0,100,1,100,0,131,3,125,1,116,1,124, - 1,100,2,131,2,114,54,122,12,124,1,160,2,124,0,161, - 1,87,0,83,0,4,0,116,3,121,52,1,0,1,0,1, - 0,89,0,110,2,48,0,122,10,124,0,106,4,125,2,87, - 0,110,18,4,0,116,5,121,82,1,0,1,0,1,0,89, - 0,110,18,48,0,124,2,100,0,117,1,114,100,116,6,124, - 2,131,1,83,0,122,10,124,0,106,7,125,3,87,0,110, - 22,4,0,116,5,121,132,1,0,1,0,1,0,100,3,125, - 3,89,0,110,2,48,0,122,10,124,0,106,8,125,4,87, - 0,110,56,4,0,116,5,121,200,1,0,1,0,1,0,124, - 1,100,0,117,0,114,180,100,4,160,9,124,3,161,1,6, - 0,89,0,83,0,100,5,160,9,124,3,124,1,161,2,6, - 0,89,0,83,0,89,0,110,14,48,0,100,6,160,9,124, - 3,124,4,161,2,83,0,100,0,83,0,41,7,78,218,10, - 95,95,108,111,97,100,101,114,95,95,218,11,109,111,100,117, - 108,101,95,114,101,112,114,250,1,63,250,13,60,109,111,100, - 117,108,101,32,123,33,114,125,62,250,20,60,109,111,100,117, - 108,101,32,123,33,114,125,32,40,123,33,114,125,41,62,250, - 23,60,109,111,100,117,108,101,32,123,33,114,125,32,102,114, - 111,109,32,123,33,114,125,62,41,10,114,6,0,0,0,114, - 4,0,0,0,114,98,0,0,0,218,9,69,120,99,101,112, - 116,105,111,110,218,8,95,95,115,112,101,99,95,95,218,14, - 65,116,116,114,105,98,117,116,101,69,114,114,111,114,218,22, - 95,109,111,100,117,108,101,95,114,101,112,114,95,102,114,111, - 109,95,115,112,101,99,114,1,0,0,0,218,8,95,95,102, - 105,108,101,95,95,114,44,0,0,0,41,5,114,95,0,0, - 0,218,6,108,111,97,100,101,114,114,94,0,0,0,114,17, - 0,0,0,218,8,102,105,108,101,110,97,109,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,12,95,109, - 111,100,117,108,101,95,114,101,112,114,13,1,0,0,115,46, - 0,0,0,0,2,12,1,10,4,2,1,12,1,12,1,6, - 1,2,1,10,1,12,1,6,2,8,1,8,4,2,1,10, - 1,12,1,10,1,2,1,10,1,12,1,8,1,14,2,22, - 2,114,110,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 114,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,2,100,2,100,3,156,3,100,4,100,5,132,2, - 90,4,100,6,100,7,132,0,90,5,100,8,100,9,132,0, - 90,6,101,7,100,10,100,11,132,0,131,1,90,8,101,8, - 106,9,100,12,100,11,132,0,131,1,90,8,101,7,100,13, - 100,14,132,0,131,1,90,10,101,7,100,15,100,16,132,0, - 131,1,90,11,101,11,106,9,100,17,100,16,132,0,131,1, - 90,11,100,2,83,0,41,18,218,10,77,111,100,117,108,101, - 83,112,101,99,97,208,5,0,0,84,104,101,32,115,112,101, - 99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,97, - 32,109,111,100,117,108,101,44,32,117,115,101,100,32,102,111, - 114,32,108,111,97,100,105,110,103,46,10,10,32,32,32,32, - 65,32,109,111,100,117,108,101,39,115,32,115,112,101,99,32, - 105,115,32,116,104,101,32,115,111,117,114,99,101,32,102,111, - 114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98, - 111,117,116,32,116,104,101,32,109,111,100,117,108,101,46,32, - 32,70,111,114,10,32,32,32,32,100,97,116,97,32,97,115, - 115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104, - 101,32,109,111,100,117,108,101,44,32,105,110,99,108,117,100, - 105,110,103,32,115,111,117,114,99,101,44,32,117,115,101,32, - 116,104,101,32,115,112,101,99,39,115,10,32,32,32,32,108, - 111,97,100,101,114,46,10,10,32,32,32,32,96,110,97,109, - 101,96,32,105,115,32,116,104,101,32,97,98,115,111,108,117, - 116,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, - 111,100,117,108,101,46,32,32,96,108,111,97,100,101,114,96, - 32,105,115,32,116,104,101,32,108,111,97,100,101,114,10,32, - 32,32,32,116,111,32,117,115,101,32,119,104,101,110,32,108, - 111,97,100,105,110,103,32,116,104,101,32,109,111,100,117,108, - 101,46,32,32,96,112,97,114,101,110,116,96,32,105,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,10, - 32,32,32,32,112,97,99,107,97,103,101,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,105,110,46,32,32,84, - 104,101,32,112,97,114,101,110,116,32,105,115,32,100,101,114, - 105,118,101,100,32,102,114,111,109,32,116,104,101,32,110,97, - 109,101,46,10,10,32,32,32,32,96,105,115,95,112,97,99, - 107,97,103,101,96,32,100,101,116,101,114,109,105,110,101,115, - 32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,105, - 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,112, - 97,99,107,97,103,101,32,111,114,10,32,32,32,32,110,111, - 116,46,32,32,79,110,32,109,111,100,117,108,101,115,32,116, - 104,105,115,32,105,115,32,114,101,102,108,101,99,116,101,100, - 32,98,121,32,116,104,101,32,96,95,95,112,97,116,104,95, - 95,96,32,97,116,116,114,105,98,117,116,101,46,10,10,32, - 32,32,32,96,111,114,105,103,105,110,96,32,105,115,32,116, - 104,101,32,115,112,101,99,105,102,105,99,32,108,111,99,97, - 116,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101, - 32,108,111,97,100,101,114,32,102,114,111,109,32,119,104,105, - 99,104,32,116,111,10,32,32,32,32,108,111,97,100,32,116, - 104,101,32,109,111,100,117,108,101,44,32,105,102,32,116,104, - 97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,105, - 115,32,97,118,97,105,108,97,98,108,101,46,32,32,87,104, - 101,110,32,102,105,108,101,110,97,109,101,32,105,115,10,32, - 32,32,32,115,101,116,44,32,111,114,105,103,105,110,32,119, - 105,108,108,32,109,97,116,99,104,46,10,10,32,32,32,32, - 96,104,97,115,95,108,111,99,97,116,105,111,110,96,32,105, - 110,100,105,99,97,116,101,115,32,116,104,97,116,32,97,32, - 115,112,101,99,39,115,32,34,111,114,105,103,105,110,34,32, - 114,101,102,108,101,99,116,115,32,97,32,108,111,99,97,116, - 105,111,110,46,10,32,32,32,32,87,104,101,110,32,116,104, - 105,115,32,105,115,32,84,114,117,101,44,32,96,95,95,102, - 105,108,101,95,95,96,32,97,116,116,114,105,98,117,116,101, - 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,105, - 115,32,115,101,116,46,10,10,32,32,32,32,96,99,97,99, - 104,101,100,96,32,105,115,32,116,104,101,32,108,111,99,97, - 116,105,111,110,32,111,102,32,116,104,101,32,99,97,99,104, - 101,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, - 44,32,105,102,32,97,110,121,46,32,32,73,116,10,32,32, - 32,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111, - 32,116,104,101,32,96,95,95,99,97,99,104,101,100,95,95, - 96,32,97,116,116,114,105,98,117,116,101,46,10,10,32,32, - 32,32,96,115,117,98,109,111,100,117,108,101,95,115,101,97, - 114,99,104,95,108,111,99,97,116,105,111,110,115,96,32,105, - 115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,111, - 102,32,112,97,116,104,32,101,110,116,114,105,101,115,32,116, - 111,10,32,32,32,32,115,101,97,114,99,104,32,119,104,101, - 110,32,105,109,112,111,114,116,105,110,103,32,115,117,98,109, - 111,100,117,108,101,115,46,32,32,73,102,32,115,101,116,44, - 32,105,115,95,112,97,99,107,97,103,101,32,115,104,111,117, - 108,100,32,98,101,10,32,32,32,32,84,114,117,101,45,45, - 97,110,100,32,70,97,108,115,101,32,111,116,104,101,114,119, - 105,115,101,46,10,10,32,32,32,32,80,97,99,107,97,103, - 101,115,32,97,114,101,32,115,105,109,112,108,121,32,109,111, - 100,117,108,101,115,32,116,104,97,116,32,40,109,97,121,41, - 32,104,97,118,101,32,115,117,98,109,111,100,117,108,101,115, - 46,32,32,73,102,32,97,32,115,112,101,99,10,32,32,32, - 32,104,97,115,32,97,32,110,111,110,45,78,111,110,101,32, - 118,97,108,117,101,32,105,110,32,96,115,117,98,109,111,100, - 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, - 105,111,110,115,96,44,32,116,104,101,32,105,109,112,111,114, - 116,10,32,32,32,32,115,121,115,116,101,109,32,119,105,108, - 108,32,99,111,110,115,105,100,101,114,32,109,111,100,117,108, - 101,115,32,108,111,97,100,101,100,32,102,114,111,109,32,116, - 104,101,32,115,112,101,99,32,97,115,32,112,97,99,107,97, - 103,101,115,46,10,10,32,32,32,32,79,110,108,121,32,102, - 105,110,100,101,114,115,32,40,115,101,101,32,105,109,112,111, - 114,116,108,105,98,46,97,98,99,46,77,101,116,97,80,97, - 116,104,70,105,110,100,101,114,32,97,110,100,10,32,32,32, - 32,105,109,112,111,114,116,108,105,98,46,97,98,99,46,80, - 97,116,104,69,110,116,114,121,70,105,110,100,101,114,41,32, - 115,104,111,117,108,100,32,109,111,100,105,102,121,32,77,111, - 100,117,108,101,83,112,101,99,32,105,110,115,116,97,110,99, - 101,115,46,10,10,32,32,32,32,78,41,3,218,6,111,114, - 105,103,105,110,218,12,108,111,97,100,101,114,95,115,116,97, - 116,101,218,10,105,115,95,112,97,99,107,97,103,101,99,3, - 0,0,0,0,0,0,0,3,0,0,0,6,0,0,0,2, - 0,0,0,67,0,0,0,115,54,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,124,3,124,0,95,2,124,4, - 124,0,95,3,124,5,114,32,103,0,110,2,100,0,124,0, - 95,4,100,1,124,0,95,5,100,0,124,0,95,6,100,0, - 83,0,41,2,78,70,41,7,114,17,0,0,0,114,108,0, - 0,0,114,112,0,0,0,114,113,0,0,0,218,26,115,117, + 41,3,78,250,29,123,33,114,125,32,105,115,32,110,111,116, + 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,114,16,0,0,0,41,4,114,15,0,0,0,218,20, + 98,117,105,108,116,105,110,95,109,111,100,117,108,101,95,110, + 97,109,101,115,218,11,73,109,112,111,114,116,69,114,114,111, + 114,114,44,0,0,0,169,2,114,30,0,0,0,218,8,102, + 117,108,108,110,97,109,101,169,1,218,3,102,120,110,114,10, + 0,0,0,114,11,0,0,0,218,25,95,114,101,113,117,105, + 114,101,115,95,98,117,105,108,116,105,110,95,119,114,97,112, + 112,101,114,232,0,0,0,115,10,0,0,0,0,1,10,1, + 10,1,2,255,6,2,122,52,95,114,101,113,117,105,114,101, + 115,95,98,117,105,108,116,105,110,46,60,108,111,99,97,108, + 115,62,46,95,114,101,113,117,105,114,101,115,95,98,117,105, + 108,116,105,110,95,119,114,97,112,112,101,114,169,1,114,12, + 0,0,0,41,2,114,82,0,0,0,114,83,0,0,0,114, + 10,0,0,0,114,81,0,0,0,114,11,0,0,0,218,17, + 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, + 110,230,0,0,0,115,6,0,0,0,0,2,12,5,10,1, + 114,85,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,26, + 0,0,0,135,0,102,1,100,1,100,2,132,8,125,1,116, + 0,124,1,136,0,131,2,1,0,124,1,83,0,41,3,122, + 47,68,101,99,111,114,97,116,111,114,32,116,111,32,118,101, + 114,105,102,121,32,116,104,101,32,110,97,109,101,100,32,109, + 111,100,117,108,101,32,105,115,32,102,114,111,122,101,110,46, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,19,0,0,0,115,38,0,0,0,116,0, + 160,1,124,1,161,1,115,28,116,2,100,1,160,3,124,1, + 161,1,124,1,100,2,141,2,130,1,136,0,124,0,124,1, + 131,2,83,0,169,3,78,122,27,123,33,114,125,32,105,115, + 32,110,111,116,32,97,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,114,16,0,0,0,41,4,114,56,0,0,0, + 218,9,105,115,95,102,114,111,122,101,110,114,78,0,0,0, + 114,44,0,0,0,114,79,0,0,0,114,81,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,24,95,114,101,113,117, + 105,114,101,115,95,102,114,111,122,101,110,95,119,114,97,112, + 112,101,114,243,0,0,0,115,10,0,0,0,0,1,10,1, + 10,1,2,255,6,2,122,50,95,114,101,113,117,105,114,101, + 115,95,102,114,111,122,101,110,46,60,108,111,99,97,108,115, + 62,46,95,114,101,113,117,105,114,101,115,95,102,114,111,122, + 101,110,95,119,114,97,112,112,101,114,114,84,0,0,0,41, + 2,114,82,0,0,0,114,88,0,0,0,114,10,0,0,0, + 114,81,0,0,0,114,11,0,0,0,218,16,95,114,101,113, + 117,105,114,101,115,95,102,114,111,122,101,110,241,0,0,0, + 115,6,0,0,0,0,2,12,5,10,1,114,89,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,3,0,0,0,67,0,0,0,115,62,0,0,0,116,0, + 124,1,124,0,131,2,125,2,124,1,116,1,106,2,118,0, + 114,50,116,1,106,2,124,1,25,0,125,3,116,3,124,2, + 124,3,131,2,1,0,116,1,106,2,124,1,25,0,83,0, + 116,4,124,2,131,1,83,0,100,1,83,0,41,2,122,128, + 76,111,97,100,32,116,104,101,32,115,112,101,99,105,102,105, + 101,100,32,109,111,100,117,108,101,32,105,110,116,111,32,115, + 121,115,46,109,111,100,117,108,101,115,32,97,110,100,32,114, + 101,116,117,114,110,32,105,116,46,10,10,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,108, + 111,97,100,101,114,46,101,120,101,99,95,109,111,100,117,108, + 101,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, + 78,41,5,218,16,115,112,101,99,95,102,114,111,109,95,108, + 111,97,100,101,114,114,15,0,0,0,218,7,109,111,100,117, + 108,101,115,218,5,95,101,120,101,99,218,5,95,108,111,97, + 100,41,4,114,30,0,0,0,114,80,0,0,0,218,4,115, + 112,101,99,218,6,109,111,100,117,108,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,17,95,108,111,97, + 100,95,109,111,100,117,108,101,95,115,104,105,109,253,0,0, + 0,115,12,0,0,0,0,6,10,1,10,1,10,1,10,1, + 10,2,114,96,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,8,0,0,0,67,0,0,0, + 115,218,0,0,0,116,0,124,0,100,1,100,0,131,3,125, + 1,116,1,124,1,100,2,131,2,114,54,122,12,124,1,160, + 2,124,0,161,1,87,0,83,0,4,0,116,3,121,52,1, + 0,1,0,1,0,89,0,110,2,48,0,122,10,124,0,106, + 4,125,2,87,0,110,18,4,0,116,5,121,82,1,0,1, + 0,1,0,89,0,110,18,48,0,124,2,100,0,117,1,114, + 100,116,6,124,2,131,1,83,0,122,10,124,0,106,7,125, + 3,87,0,110,22,4,0,116,5,121,132,1,0,1,0,1, + 0,100,3,125,3,89,0,110,2,48,0,122,10,124,0,106, + 8,125,4,87,0,110,56,4,0,116,5,121,200,1,0,1, + 0,1,0,124,1,100,0,117,0,114,180,100,4,160,9,124, + 3,161,1,6,0,89,0,83,0,100,5,160,9,124,3,124, + 1,161,2,6,0,89,0,83,0,89,0,110,14,48,0,100, + 6,160,9,124,3,124,4,161,2,83,0,100,0,83,0,41, + 7,78,218,10,95,95,108,111,97,100,101,114,95,95,218,11, + 109,111,100,117,108,101,95,114,101,112,114,250,1,63,250,13, + 60,109,111,100,117,108,101,32,123,33,114,125,62,250,20,60, + 109,111,100,117,108,101,32,123,33,114,125,32,40,123,33,114, + 125,41,62,250,23,60,109,111,100,117,108,101,32,123,33,114, + 125,32,102,114,111,109,32,123,33,114,125,62,41,10,114,6, + 0,0,0,114,4,0,0,0,114,98,0,0,0,218,9,69, + 120,99,101,112,116,105,111,110,218,8,95,95,115,112,101,99, + 95,95,218,14,65,116,116,114,105,98,117,116,101,69,114,114, + 111,114,218,22,95,109,111,100,117,108,101,95,114,101,112,114, + 95,102,114,111,109,95,115,112,101,99,114,1,0,0,0,218, + 8,95,95,102,105,108,101,95,95,114,44,0,0,0,41,5, + 114,95,0,0,0,218,6,108,111,97,100,101,114,114,94,0, + 0,0,114,17,0,0,0,218,8,102,105,108,101,110,97,109, + 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,12,95,109,111,100,117,108,101,95,114,101,112,114,13,1, + 0,0,115,46,0,0,0,0,2,12,1,10,4,2,1,12, + 1,12,1,6,1,2,1,10,1,12,1,6,2,8,1,8, + 4,2,1,10,1,12,1,10,1,2,1,10,1,12,1,8, + 1,14,2,22,2,114,110,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,114,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,2,100,2,100,3,156,3,100,4, + 100,5,132,2,90,4,100,6,100,7,132,0,90,5,100,8, + 100,9,132,0,90,6,101,7,100,10,100,11,132,0,131,1, + 90,8,101,8,106,9,100,12,100,11,132,0,131,1,90,8, + 101,7,100,13,100,14,132,0,131,1,90,10,101,7,100,15, + 100,16,132,0,131,1,90,11,101,11,106,9,100,17,100,16, + 132,0,131,1,90,11,100,2,83,0,41,18,218,10,77,111, + 100,117,108,101,83,112,101,99,97,208,5,0,0,84,104,101, + 32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102, + 111,114,32,97,32,109,111,100,117,108,101,44,32,117,115,101, + 100,32,102,111,114,32,108,111,97,100,105,110,103,46,10,10, + 32,32,32,32,65,32,109,111,100,117,108,101,39,115,32,115, + 112,101,99,32,105,115,32,116,104,101,32,115,111,117,114,99, + 101,32,102,111,114,32,105,110,102,111,114,109,97,116,105,111, + 110,32,97,98,111,117,116,32,116,104,101,32,109,111,100,117, + 108,101,46,32,32,70,111,114,10,32,32,32,32,100,97,116, + 97,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116, + 104,32,116,104,101,32,109,111,100,117,108,101,44,32,105,110, + 99,108,117,100,105,110,103,32,115,111,117,114,99,101,44,32, + 117,115,101,32,116,104,101,32,115,112,101,99,39,115,10,32, + 32,32,32,108,111,97,100,101,114,46,10,10,32,32,32,32, + 96,110,97,109,101,96,32,105,115,32,116,104,101,32,97,98, + 115,111,108,117,116,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,46,32,32,96,108,111,97, + 100,101,114,96,32,105,115,32,116,104,101,32,108,111,97,100, + 101,114,10,32,32,32,32,116,111,32,117,115,101,32,119,104, + 101,110,32,108,111,97,100,105,110,103,32,116,104,101,32,109, + 111,100,117,108,101,46,32,32,96,112,97,114,101,110,116,96, + 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,10,32,32,32,32,112,97,99,107,97,103,101,32, + 116,104,101,32,109,111,100,117,108,101,32,105,115,32,105,110, + 46,32,32,84,104,101,32,112,97,114,101,110,116,32,105,115, + 32,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104, + 101,32,110,97,109,101,46,10,10,32,32,32,32,96,105,115, + 95,112,97,99,107,97,103,101,96,32,100,101,116,101,114,109, + 105,110,101,115,32,105,102,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100, + 32,97,32,112,97,99,107,97,103,101,32,111,114,10,32,32, + 32,32,110,111,116,46,32,32,79,110,32,109,111,100,117,108, + 101,115,32,116,104,105,115,32,105,115,32,114,101,102,108,101, + 99,116,101,100,32,98,121,32,116,104,101,32,96,95,95,112, + 97,116,104,95,95,96,32,97,116,116,114,105,98,117,116,101, + 46,10,10,32,32,32,32,96,111,114,105,103,105,110,96,32, + 105,115,32,116,104,101,32,115,112,101,99,105,102,105,99,32, + 108,111,99,97,116,105,111,110,32,117,115,101,100,32,98,121, + 32,116,104,101,32,108,111,97,100,101,114,32,102,114,111,109, + 32,119,104,105,99,104,32,116,111,10,32,32,32,32,108,111, + 97,100,32,116,104,101,32,109,111,100,117,108,101,44,32,105, + 102,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105, + 111,110,32,105,115,32,97,118,97,105,108,97,98,108,101,46, + 32,32,87,104,101,110,32,102,105,108,101,110,97,109,101,32, + 105,115,10,32,32,32,32,115,101,116,44,32,111,114,105,103, + 105,110,32,119,105,108,108,32,109,97,116,99,104,46,10,10, + 32,32,32,32,96,104,97,115,95,108,111,99,97,116,105,111, + 110,96,32,105,110,100,105,99,97,116,101,115,32,116,104,97, + 116,32,97,32,115,112,101,99,39,115,32,34,111,114,105,103, + 105,110,34,32,114,101,102,108,101,99,116,115,32,97,32,108, + 111,99,97,116,105,111,110,46,10,32,32,32,32,87,104,101, + 110,32,116,104,105,115,32,105,115,32,84,114,117,101,44,32, + 96,95,95,102,105,108,101,95,95,96,32,97,116,116,114,105, + 98,117,116,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,115,101,116,46,10,10,32,32,32,32, + 96,99,97,99,104,101,100,96,32,105,115,32,116,104,101,32, + 108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32, + 99,97,99,104,101,100,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,44,32,105,102,32,97,110,121,46,32,32,73, + 116,10,32,32,32,32,99,111,114,114,101,115,112,111,110,100, + 115,32,116,111,32,116,104,101,32,96,95,95,99,97,99,104, + 101,100,95,95,96,32,97,116,116,114,105,98,117,116,101,46, + 10,10,32,32,32,32,96,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,96,32,105,115,32,116,104,101,32,115,101,113,117,101,110, + 99,101,32,111,102,32,112,97,116,104,32,101,110,116,114,105, + 101,115,32,116,111,10,32,32,32,32,115,101,97,114,99,104, + 32,119,104,101,110,32,105,109,112,111,114,116,105,110,103,32, + 115,117,98,109,111,100,117,108,101,115,46,32,32,73,102,32, + 115,101,116,44,32,105,115,95,112,97,99,107,97,103,101,32, + 115,104,111,117,108,100,32,98,101,10,32,32,32,32,84,114, + 117,101,45,45,97,110,100,32,70,97,108,115,101,32,111,116, + 104,101,114,119,105,115,101,46,10,10,32,32,32,32,80,97, + 99,107,97,103,101,115,32,97,114,101,32,115,105,109,112,108, + 121,32,109,111,100,117,108,101,115,32,116,104,97,116,32,40, + 109,97,121,41,32,104,97,118,101,32,115,117,98,109,111,100, + 117,108,101,115,46,32,32,73,102,32,97,32,115,112,101,99, + 10,32,32,32,32,104,97,115,32,97,32,110,111,110,45,78, + 111,110,101,32,118,97,108,117,101,32,105,110,32,96,115,117, 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,218,13,95,115,101,116,95,102, - 105,108,101,97,116,116,114,218,7,95,99,97,99,104,101,100, - 41,6,114,30,0,0,0,114,17,0,0,0,114,108,0,0, - 0,114,112,0,0,0,114,113,0,0,0,114,114,0,0,0, + 111,99,97,116,105,111,110,115,96,44,32,116,104,101,32,105, + 109,112,111,114,116,10,32,32,32,32,115,121,115,116,101,109, + 32,119,105,108,108,32,99,111,110,115,105,100,101,114,32,109, + 111,100,117,108,101,115,32,108,111,97,100,101,100,32,102,114, + 111,109,32,116,104,101,32,115,112,101,99,32,97,115,32,112, + 97,99,107,97,103,101,115,46,10,10,32,32,32,32,79,110, + 108,121,32,102,105,110,100,101,114,115,32,40,115,101,101,32, + 105,109,112,111,114,116,108,105,98,46,97,98,99,46,77,101, + 116,97,80,97,116,104,70,105,110,100,101,114,32,97,110,100, + 10,32,32,32,32,105,109,112,111,114,116,108,105,98,46,97, + 98,99,46,80,97,116,104,69,110,116,114,121,70,105,110,100, + 101,114,41,32,115,104,111,117,108,100,32,109,111,100,105,102, + 121,32,77,111,100,117,108,101,83,112,101,99,32,105,110,115, + 116,97,110,99,101,115,46,10,10,32,32,32,32,78,41,3, + 218,6,111,114,105,103,105,110,218,12,108,111,97,100,101,114, + 95,115,116,97,116,101,218,10,105,115,95,112,97,99,107,97, + 103,101,99,3,0,0,0,0,0,0,0,3,0,0,0,6, + 0,0,0,2,0,0,0,67,0,0,0,115,54,0,0,0, + 124,1,124,0,95,0,124,2,124,0,95,1,124,3,124,0, + 95,2,124,4,124,0,95,3,124,5,114,32,103,0,110,2, + 100,0,124,0,95,4,100,1,124,0,95,5,100,0,124,0, + 95,6,100,0,83,0,41,2,78,70,41,7,114,17,0,0, + 0,114,108,0,0,0,114,112,0,0,0,114,113,0,0,0, + 218,26,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,218,13,95,115, + 101,116,95,102,105,108,101,97,116,116,114,218,7,95,99,97, + 99,104,101,100,41,6,114,30,0,0,0,114,17,0,0,0, + 114,108,0,0,0,114,112,0,0,0,114,113,0,0,0,114, + 114,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,31,0,0,0,86,1,0,0,115,14,0,0, + 0,0,2,6,1,6,1,6,1,6,1,14,3,6,1,122, + 19,77,111,100,117,108,101,83,112,101,99,46,95,95,105,110, + 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,6,0,0,0,67,0,0,0,115,102,0, + 0,0,100,1,160,0,124,0,106,1,161,1,100,2,160,0, + 124,0,106,2,161,1,103,2,125,1,124,0,106,3,100,0, + 117,1,114,52,124,1,160,4,100,3,160,0,124,0,106,3, + 161,1,161,1,1,0,124,0,106,5,100,0,117,1,114,80, + 124,1,160,4,100,4,160,0,124,0,106,5,161,1,161,1, + 1,0,100,5,160,0,124,0,106,6,106,7,100,6,160,8, + 124,1,161,1,161,2,83,0,41,7,78,122,9,110,97,109, + 101,61,123,33,114,125,122,11,108,111,97,100,101,114,61,123, + 33,114,125,122,11,111,114,105,103,105,110,61,123,33,114,125, + 122,29,115,117,98,109,111,100,117,108,101,95,115,101,97,114, + 99,104,95,108,111,99,97,116,105,111,110,115,61,123,125,122, + 6,123,125,40,123,125,41,122,2,44,32,41,9,114,44,0, + 0,0,114,17,0,0,0,114,108,0,0,0,114,112,0,0, + 0,218,6,97,112,112,101,110,100,114,115,0,0,0,218,9, + 95,95,99,108,97,115,115,95,95,114,1,0,0,0,218,4, + 106,111,105,110,41,2,114,30,0,0,0,114,54,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 31,0,0,0,86,1,0,0,115,14,0,0,0,0,2,6, - 1,6,1,6,1,6,1,14,3,6,1,122,19,77,111,100, - 117,108,101,83,112,101,99,46,95,95,105,110,105,116,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,6,0,0,0,67,0,0,0,115,102,0,0,0,100,1, - 160,0,124,0,106,1,161,1,100,2,160,0,124,0,106,2, - 161,1,103,2,125,1,124,0,106,3,100,0,117,1,114,52, - 124,1,160,4,100,3,160,0,124,0,106,3,161,1,161,1, - 1,0,124,0,106,5,100,0,117,1,114,80,124,1,160,4, - 100,4,160,0,124,0,106,5,161,1,161,1,1,0,100,5, - 160,0,124,0,106,6,106,7,100,6,160,8,124,1,161,1, - 161,2,83,0,41,7,78,122,9,110,97,109,101,61,123,33, - 114,125,122,11,108,111,97,100,101,114,61,123,33,114,125,122, - 11,111,114,105,103,105,110,61,123,33,114,125,122,29,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,61,123,125,122,6,123,125,40, - 123,125,41,122,2,44,32,41,9,114,44,0,0,0,114,17, - 0,0,0,114,108,0,0,0,114,112,0,0,0,218,6,97, - 112,112,101,110,100,114,115,0,0,0,218,9,95,95,99,108, - 97,115,115,95,95,114,1,0,0,0,218,4,106,111,105,110, - 41,2,114,30,0,0,0,114,54,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,47,0,0,0, - 98,1,0,0,115,20,0,0,0,0,1,10,1,10,255,4, - 2,10,1,18,1,10,1,8,1,4,255,6,2,122,19,77, - 111,100,117,108,101,83,112,101,99,46,95,95,114,101,112,114, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,8,0,0,0,67,0,0,0,115,106,0,0,0, - 124,0,106,0,125,2,122,72,124,0,106,1,124,1,106,1, - 107,2,111,76,124,0,106,2,124,1,106,2,107,2,111,76, - 124,0,106,3,124,1,106,3,107,2,111,76,124,2,124,1, - 106,0,107,2,111,76,124,0,106,4,124,1,106,4,107,2, - 111,76,124,0,106,5,124,1,106,5,107,2,87,0,83,0, - 4,0,116,6,121,100,1,0,1,0,1,0,116,7,6,0, - 89,0,83,0,48,0,100,0,83,0,114,13,0,0,0,41, - 8,114,115,0,0,0,114,17,0,0,0,114,108,0,0,0, - 114,112,0,0,0,218,6,99,97,99,104,101,100,218,12,104, - 97,115,95,108,111,99,97,116,105,111,110,114,105,0,0,0, - 218,14,78,111,116,73,109,112,108,101,109,101,110,116,101,100, - 41,3,114,30,0,0,0,90,5,111,116,104,101,114,90,4, - 115,109,115,108,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,6,95,95,101,113,95,95,108,1,0,0,115, - 30,0,0,0,0,1,6,1,2,1,12,1,10,255,2,2, - 10,254,2,3,8,253,2,4,10,252,2,5,10,251,4,6, - 12,1,122,17,77,111,100,117,108,101,83,112,101,99,46,95, - 95,101,113,95,95,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,58, - 0,0,0,124,0,106,0,100,0,117,0,114,52,124,0,106, - 1,100,0,117,1,114,52,124,0,106,2,114,52,116,3,100, - 0,117,0,114,38,116,4,130,1,116,3,160,5,124,0,106, - 1,161,1,124,0,95,0,124,0,106,0,83,0,114,13,0, - 0,0,41,6,114,117,0,0,0,114,112,0,0,0,114,116, - 0,0,0,218,19,95,98,111,111,116,115,116,114,97,112,95, - 101,120,116,101,114,110,97,108,218,19,78,111,116,73,109,112, - 108,101,109,101,110,116,101,100,69,114,114,111,114,90,11,95, - 103,101,116,95,99,97,99,104,101,100,114,46,0,0,0,114, + 47,0,0,0,98,1,0,0,115,20,0,0,0,0,1,10, + 1,10,255,4,2,10,1,18,1,10,1,8,1,4,255,6, + 2,122,19,77,111,100,117,108,101,83,112,101,99,46,95,95, + 114,101,112,114,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,8,0,0,0,67,0,0,0,115, + 106,0,0,0,124,0,106,0,125,2,122,72,124,0,106,1, + 124,1,106,1,107,2,111,76,124,0,106,2,124,1,106,2, + 107,2,111,76,124,0,106,3,124,1,106,3,107,2,111,76, + 124,2,124,1,106,0,107,2,111,76,124,0,106,4,124,1, + 106,4,107,2,111,76,124,0,106,5,124,1,106,5,107,2, + 87,0,83,0,4,0,116,6,121,100,1,0,1,0,1,0, + 116,7,6,0,89,0,83,0,48,0,100,0,83,0,114,13, + 0,0,0,41,8,114,115,0,0,0,114,17,0,0,0,114, + 108,0,0,0,114,112,0,0,0,218,6,99,97,99,104,101, + 100,218,12,104,97,115,95,108,111,99,97,116,105,111,110,114, + 105,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,41,3,114,30,0,0,0,90,5,111,116,104, + 101,114,90,4,115,109,115,108,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,6,95,95,101,113,95,95,108, + 1,0,0,115,30,0,0,0,0,1,6,1,2,1,12,1, + 10,255,2,2,10,254,2,3,8,253,2,4,10,252,2,5, + 10,251,4,6,12,1,122,17,77,111,100,117,108,101,83,112, + 101,99,46,95,95,101,113,95,95,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,115,58,0,0,0,124,0,106,0,100,0,117,0,114, + 52,124,0,106,1,100,0,117,1,114,52,124,0,106,2,114, + 52,116,3,100,0,117,0,114,38,116,4,130,1,116,3,160, + 5,124,0,106,1,161,1,124,0,95,0,124,0,106,0,83, + 0,114,13,0,0,0,41,6,114,117,0,0,0,114,112,0, + 0,0,114,116,0,0,0,218,19,95,98,111,111,116,115,116, + 114,97,112,95,101,120,116,101,114,110,97,108,218,19,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,90,11,95,103,101,116,95,99,97,99,104,101,100,114,46, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,121,0,0,0,120,1,0,0,115,12,0,0,0, + 0,2,10,1,16,1,8,1,4,1,14,1,122,17,77,111, + 100,117,108,101,83,112,101,99,46,99,97,99,104,101,100,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,10,0,0,0,124,1,124, + 0,95,0,100,0,83,0,114,13,0,0,0,41,1,114,117, + 0,0,0,41,2,114,30,0,0,0,114,121,0,0,0,114, 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,121, - 0,0,0,120,1,0,0,115,12,0,0,0,0,2,10,1, - 16,1,8,1,4,1,14,1,122,17,77,111,100,117,108,101, - 83,112,101,99,46,99,97,99,104,101,100,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,10,0,0,0,124,1,124,0,95,0,100, - 0,83,0,114,13,0,0,0,41,1,114,117,0,0,0,41, - 2,114,30,0,0,0,114,121,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,121,0,0,0,129, - 1,0,0,115,2,0,0,0,0,2,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,36,0,0,0,124,0,106,0,100,1,117,0, - 114,26,124,0,106,1,160,2,100,2,161,1,100,3,25,0, - 83,0,124,0,106,1,83,0,100,1,83,0,41,4,122,32, - 84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,39,115,32,112,97,114,101,110,116,46, - 78,218,1,46,114,22,0,0,0,41,3,114,115,0,0,0, - 114,17,0,0,0,218,10,114,112,97,114,116,105,116,105,111, - 110,114,46,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,6,112,97,114,101,110,116,133,1,0, - 0,115,6,0,0,0,0,3,10,1,16,2,122,17,77,111, - 100,117,108,101,83,112,101,99,46,112,97,114,101,110,116,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,114,13,0,0,0,41,1,114,116,0,0,0,114, - 46,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,122,0,0,0,141,1,0,0,115,2,0,0, - 0,0,2,122,23,77,111,100,117,108,101,83,112,101,99,46, - 104,97,115,95,108,111,99,97,116,105,111,110,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, - 0,67,0,0,0,115,14,0,0,0,116,0,124,1,131,1, - 124,0,95,1,100,0,83,0,114,13,0,0,0,41,2,218, - 4,98,111,111,108,114,116,0,0,0,41,2,114,30,0,0, - 0,218,5,118,97,108,117,101,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,122,0,0,0,145,1,0,0, - 115,2,0,0,0,0,2,41,12,114,1,0,0,0,114,0, - 0,0,0,114,2,0,0,0,114,3,0,0,0,114,31,0, - 0,0,114,47,0,0,0,114,124,0,0,0,218,8,112,114, - 111,112,101,114,116,121,114,121,0,0,0,218,6,115,101,116, - 116,101,114,114,129,0,0,0,114,122,0,0,0,114,10,0, + 0,0,0,129,1,0,0,115,2,0,0,0,0,2,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, + 0,0,0,67,0,0,0,115,36,0,0,0,124,0,106,0, + 100,1,117,0,114,26,124,0,106,1,160,2,100,2,161,1, + 100,3,25,0,83,0,124,0,106,1,83,0,100,1,83,0, + 41,4,122,32,84,104,101,32,110,97,109,101,32,111,102,32, + 116,104,101,32,109,111,100,117,108,101,39,115,32,112,97,114, + 101,110,116,46,78,218,1,46,114,22,0,0,0,41,3,114, + 115,0,0,0,114,17,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,114,46,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,6,112,97,114,101,110, + 116,133,1,0,0,115,6,0,0,0,0,3,10,1,16,2, + 122,17,77,111,100,117,108,101,83,112,101,99,46,112,97,114, + 101,110,116,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,1,0,0,0,67,0,0,0,115,6,0,0, + 0,124,0,106,0,83,0,114,13,0,0,0,41,1,114,116, + 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,122,0,0,0,141,1,0,0, + 115,2,0,0,0,0,2,122,23,77,111,100,117,108,101,83, + 112,101,99,46,104,97,115,95,108,111,99,97,116,105,111,110, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,115,14,0,0,0,116,0, + 124,1,131,1,124,0,95,1,100,0,83,0,114,13,0,0, + 0,41,2,218,4,98,111,111,108,114,116,0,0,0,41,2, + 114,30,0,0,0,218,5,118,97,108,117,101,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,122,0,0,0, + 145,1,0,0,115,2,0,0,0,0,2,41,12,114,1,0, + 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, + 0,114,31,0,0,0,114,47,0,0,0,114,124,0,0,0, + 218,8,112,114,111,112,101,114,116,121,114,121,0,0,0,218, + 6,115,101,116,116,101,114,114,129,0,0,0,114,122,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,111,0,0,0,49,1,0,0,115,32, + 0,0,0,8,1,4,36,4,1,2,255,12,12,8,10,8, + 12,2,1,10,8,4,1,10,3,2,1,10,7,2,1,10, + 3,4,1,114,111,0,0,0,169,2,114,112,0,0,0,114, + 114,0,0,0,99,2,0,0,0,0,0,0,0,2,0,0, + 0,6,0,0,0,8,0,0,0,67,0,0,0,115,152,0, + 0,0,116,0,124,1,100,1,131,2,114,74,116,1,100,2, + 117,0,114,22,116,2,130,1,116,1,106,3,125,4,124,3, + 100,2,117,0,114,48,124,4,124,0,124,1,100,3,141,2, + 83,0,124,3,114,56,103,0,110,2,100,2,125,5,124,4, + 124,0,124,1,124,5,100,4,141,3,83,0,124,3,100,2, + 117,0,114,136,116,0,124,1,100,5,131,2,114,132,122,14, + 124,1,160,4,124,0,161,1,125,3,87,0,113,136,4,0, + 116,5,121,128,1,0,1,0,1,0,100,2,125,3,89,0, + 113,136,48,0,110,4,100,6,125,3,116,6,124,0,124,1, + 124,2,124,3,100,7,141,4,83,0,41,8,122,53,82,101, + 116,117,114,110,32,97,32,109,111,100,117,108,101,32,115,112, + 101,99,32,98,97,115,101,100,32,111,110,32,118,97,114,105, + 111,117,115,32,108,111,97,100,101,114,32,109,101,116,104,111, + 100,115,46,90,12,103,101,116,95,102,105,108,101,110,97,109, + 101,78,41,1,114,108,0,0,0,41,2,114,108,0,0,0, + 114,115,0,0,0,114,114,0,0,0,70,114,134,0,0,0, + 41,7,114,4,0,0,0,114,125,0,0,0,114,126,0,0, + 0,218,23,115,112,101,99,95,102,114,111,109,95,102,105,108, + 101,95,108,111,99,97,116,105,111,110,114,114,0,0,0,114, + 78,0,0,0,114,111,0,0,0,41,6,114,17,0,0,0, + 114,108,0,0,0,114,112,0,0,0,114,114,0,0,0,114, + 135,0,0,0,90,6,115,101,97,114,99,104,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,90,0,0,0, + 150,1,0,0,115,36,0,0,0,0,2,10,1,8,1,4, + 1,6,2,8,1,12,1,12,1,6,1,2,255,6,3,8, + 1,10,1,2,1,14,1,12,1,12,3,4,2,114,90,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,8, + 0,0,0,8,0,0,0,67,0,0,0,115,42,1,0,0, + 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, + 121,28,1,0,1,0,1,0,89,0,110,14,48,0,124,3, + 100,0,117,1,114,42,124,3,83,0,124,0,106,2,125,4, + 124,1,100,0,117,0,114,86,122,10,124,0,106,3,125,1, + 87,0,110,18,4,0,116,1,121,84,1,0,1,0,1,0, + 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, + 110,22,4,0,116,1,121,118,1,0,1,0,1,0,100,0, + 125,5,89,0,110,2,48,0,124,2,100,0,117,0,114,176, + 124,5,100,0,117,0,114,172,122,10,124,1,106,5,125,2, + 87,0,113,176,4,0,116,1,121,168,1,0,1,0,1,0, + 100,0,125,2,89,0,113,176,48,0,110,4,124,5,125,2, + 122,10,124,0,106,6,125,6,87,0,110,22,4,0,116,1, + 121,208,1,0,1,0,1,0,100,0,125,6,89,0,110,2, + 48,0,122,14,116,7,124,0,106,8,131,1,125,7,87,0, + 110,22,4,0,116,1,121,246,1,0,1,0,1,0,100,0, + 125,7,89,0,110,2,48,0,116,9,124,4,124,1,124,2, + 100,1,141,3,125,3,124,5,100,0,117,0,144,1,114,20, + 100,2,110,2,100,3,124,3,95,10,124,6,124,3,95,11, + 124,7,124,3,95,12,124,3,83,0,41,4,78,169,1,114, + 112,0,0,0,70,84,41,13,114,104,0,0,0,114,105,0, + 0,0,114,1,0,0,0,114,97,0,0,0,114,107,0,0, + 0,218,7,95,79,82,73,71,73,78,218,10,95,95,99,97, + 99,104,101,100,95,95,218,4,108,105,115,116,218,8,95,95, + 112,97,116,104,95,95,114,111,0,0,0,114,116,0,0,0, + 114,121,0,0,0,114,115,0,0,0,41,8,114,95,0,0, + 0,114,108,0,0,0,114,112,0,0,0,114,94,0,0,0, + 114,17,0,0,0,90,8,108,111,99,97,116,105,111,110,114, + 121,0,0,0,114,115,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,17,95,115,112,101,99,95, + 102,114,111,109,95,109,111,100,117,108,101,176,1,0,0,115, + 72,0,0,0,0,2,2,1,10,1,12,1,6,2,8,1, + 4,2,6,1,8,1,2,1,10,1,12,2,6,1,2,1, + 10,1,12,1,10,1,8,1,8,1,2,1,10,1,12,1, + 12,2,4,1,2,1,10,1,12,1,10,1,2,1,14,1, + 12,1,10,2,14,1,20,1,6,1,6,1,114,141,0,0, + 0,70,169,1,218,8,111,118,101,114,114,105,100,101,99,2, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,8, + 0,0,0,67,0,0,0,115,210,1,0,0,124,2,115,20, + 116,0,124,1,100,1,100,0,131,3,100,0,117,0,114,52, + 122,12,124,0,106,1,124,1,95,2,87,0,110,18,4,0, + 116,3,121,50,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,115,72,116,0,124,1,100,2,100,0,131,3,100,0, + 117,0,114,174,124,0,106,4,125,3,124,3,100,0,117,0, + 114,144,124,0,106,5,100,0,117,1,114,144,116,6,100,0, + 117,0,114,108,116,7,130,1,116,6,106,8,125,4,124,4, + 160,9,124,4,161,1,125,3,124,0,106,5,124,3,95,10, + 124,3,124,0,95,4,100,0,124,1,95,11,122,10,124,3, + 124,1,95,12,87,0,110,18,4,0,116,3,121,172,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,115,194,116,0, + 124,1,100,3,100,0,131,3,100,0,117,0,114,226,122,12, + 124,0,106,13,124,1,95,14,87,0,110,18,4,0,116,3, + 121,224,1,0,1,0,1,0,89,0,110,2,48,0,122,10, + 124,0,124,1,95,15,87,0,110,18,4,0,116,3,121,254, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, + 115,24,116,0,124,1,100,4,100,0,131,3,100,0,117,0, + 144,1,114,70,124,0,106,5,100,0,117,1,144,1,114,70, + 122,12,124,0,106,5,124,1,95,16,87,0,110,20,4,0, + 116,3,144,1,121,68,1,0,1,0,1,0,89,0,110,2, + 48,0,124,0,106,17,144,1,114,206,124,2,144,1,115,102, + 116,0,124,1,100,5,100,0,131,3,100,0,117,0,144,1, + 114,136,122,12,124,0,106,18,124,1,95,11,87,0,110,20, + 4,0,116,3,144,1,121,134,1,0,1,0,1,0,89,0, + 110,2,48,0,124,2,144,1,115,160,116,0,124,1,100,6, + 100,0,131,3,100,0,117,0,144,1,114,206,124,0,106,19, + 100,0,117,1,144,1,114,206,122,12,124,0,106,19,124,1, + 95,20,87,0,110,20,4,0,116,3,144,1,121,204,1,0, + 1,0,1,0,89,0,110,2,48,0,124,1,83,0,41,7, + 78,114,1,0,0,0,114,97,0,0,0,218,11,95,95,112, + 97,99,107,97,103,101,95,95,114,140,0,0,0,114,107,0, + 0,0,114,138,0,0,0,41,21,114,6,0,0,0,114,17, + 0,0,0,114,1,0,0,0,114,105,0,0,0,114,108,0, + 0,0,114,115,0,0,0,114,125,0,0,0,114,126,0,0, + 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,218,7,95,95,110,101,119,95,95,90,5,95,112, + 97,116,104,114,107,0,0,0,114,97,0,0,0,114,129,0, + 0,0,114,144,0,0,0,114,104,0,0,0,114,140,0,0, + 0,114,122,0,0,0,114,112,0,0,0,114,121,0,0,0, + 114,138,0,0,0,41,5,114,94,0,0,0,114,95,0,0, + 0,114,143,0,0,0,114,108,0,0,0,114,145,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, + 116,114,115,221,1,0,0,115,96,0,0,0,0,4,20,1, + 2,1,12,1,12,1,6,2,20,1,6,1,8,2,10,1, + 8,1,4,1,6,2,10,1,8,1,6,11,6,1,2,1, + 10,1,12,1,6,2,20,1,2,1,12,1,12,1,6,2, + 2,1,10,1,12,1,6,2,24,1,12,1,2,1,12,1, + 14,1,6,2,8,1,24,1,2,1,12,1,14,1,6,2, + 24,1,12,1,2,1,12,1,14,1,6,1,114,147,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,82,0,0,0,100, + 1,125,1,116,0,124,0,106,1,100,2,131,2,114,30,124, + 0,106,1,160,2,124,0,161,1,125,1,110,20,116,0,124, + 0,106,1,100,3,131,2,114,50,116,3,100,4,131,1,130, + 1,124,1,100,1,117,0,114,68,116,4,124,0,106,5,131, + 1,125,1,116,6,124,0,124,1,131,2,1,0,124,1,83, + 0,41,5,122,43,67,114,101,97,116,101,32,97,32,109,111, + 100,117,108,101,32,98,97,115,101,100,32,111,110,32,116,104, + 101,32,112,114,111,118,105,100,101,100,32,115,112,101,99,46, + 78,218,13,99,114,101,97,116,101,95,109,111,100,117,108,101, + 218,11,101,120,101,99,95,109,111,100,117,108,101,122,66,108, + 111,97,100,101,114,115,32,116,104,97,116,32,100,101,102,105, + 110,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,109,117,115,116,32,97,108,115,111,32,100,101,102,105,110, + 101,32,99,114,101,97,116,101,95,109,111,100,117,108,101,40, + 41,41,7,114,4,0,0,0,114,108,0,0,0,114,148,0, + 0,0,114,78,0,0,0,114,18,0,0,0,114,17,0,0, + 0,114,147,0,0,0,169,2,114,94,0,0,0,114,95,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,111,0,0,0,49,1,0,0,115,32,0,0,0,8, - 1,4,36,4,1,2,255,12,12,8,10,8,12,2,1,10, - 8,4,1,10,3,2,1,10,7,2,1,10,3,4,1,114, - 111,0,0,0,169,2,114,112,0,0,0,114,114,0,0,0, - 99,2,0,0,0,0,0,0,0,2,0,0,0,6,0,0, - 0,8,0,0,0,67,0,0,0,115,152,0,0,0,116,0, - 124,1,100,1,131,2,114,74,116,1,100,2,117,0,114,22, - 116,2,130,1,116,1,106,3,125,4,124,3,100,2,117,0, - 114,48,124,4,124,0,124,1,100,3,141,2,83,0,124,3, - 114,56,103,0,110,2,100,2,125,5,124,4,124,0,124,1, - 124,5,100,4,141,3,83,0,124,3,100,2,117,0,114,136, - 116,0,124,1,100,5,131,2,114,132,122,14,124,1,160,4, - 124,0,161,1,125,3,87,0,113,136,4,0,116,5,121,128, - 1,0,1,0,1,0,100,2,125,3,89,0,113,136,48,0, - 110,4,100,6,125,3,116,6,124,0,124,1,124,2,124,3, - 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, - 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, - 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, - 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, - 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, - 114,108,0,0,0,41,2,114,108,0,0,0,114,115,0,0, - 0,114,114,0,0,0,70,114,134,0,0,0,41,7,114,4, - 0,0,0,114,125,0,0,0,114,126,0,0,0,218,23,115, - 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, - 99,97,116,105,111,110,114,114,0,0,0,114,78,0,0,0, - 114,111,0,0,0,41,6,114,17,0,0,0,114,108,0,0, - 0,114,112,0,0,0,114,114,0,0,0,114,135,0,0,0, - 90,6,115,101,97,114,99,104,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,90,0,0,0,150,1,0,0, - 115,36,0,0,0,0,2,10,1,8,1,4,1,6,2,8, - 1,12,1,12,1,6,1,2,255,6,3,8,1,10,1,2, - 1,14,1,12,1,12,3,4,2,114,90,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, - 0,0,0,67,0,0,0,115,42,1,0,0,122,10,124,0, - 106,0,125,3,87,0,110,18,4,0,116,1,121,28,1,0, - 1,0,1,0,89,0,110,14,48,0,124,3,100,0,117,1, - 114,42,124,3,83,0,124,0,106,2,125,4,124,1,100,0, - 117,0,114,86,122,10,124,0,106,3,125,1,87,0,110,18, - 4,0,116,1,121,84,1,0,1,0,1,0,89,0,110,2, - 48,0,122,10,124,0,106,4,125,5,87,0,110,22,4,0, - 116,1,121,118,1,0,1,0,1,0,100,0,125,5,89,0, - 110,2,48,0,124,2,100,0,117,0,114,176,124,5,100,0, - 117,0,114,172,122,10,124,1,106,5,125,2,87,0,113,176, - 4,0,116,1,121,168,1,0,1,0,1,0,100,0,125,2, - 89,0,113,176,48,0,110,4,124,5,125,2,122,10,124,0, - 106,6,125,6,87,0,110,22,4,0,116,1,121,208,1,0, - 1,0,1,0,100,0,125,6,89,0,110,2,48,0,122,14, - 116,7,124,0,106,8,131,1,125,7,87,0,110,22,4,0, - 116,1,121,246,1,0,1,0,1,0,100,0,125,7,89,0, - 110,2,48,0,116,9,124,4,124,1,124,2,100,1,141,3, - 125,3,124,5,100,0,117,0,144,1,114,20,100,2,110,2, - 100,3,124,3,95,10,124,6,124,3,95,11,124,7,124,3, - 95,12,124,3,83,0,41,4,78,169,1,114,112,0,0,0, - 70,84,41,13,114,104,0,0,0,114,105,0,0,0,114,1, - 0,0,0,114,97,0,0,0,114,107,0,0,0,218,7,95, - 79,82,73,71,73,78,218,10,95,95,99,97,99,104,101,100, - 95,95,218,4,108,105,115,116,218,8,95,95,112,97,116,104, - 95,95,114,111,0,0,0,114,116,0,0,0,114,121,0,0, - 0,114,115,0,0,0,41,8,114,95,0,0,0,114,108,0, - 0,0,114,112,0,0,0,114,94,0,0,0,114,17,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,121,0,0,0, - 114,115,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,17,95,115,112,101,99,95,102,114,111,109, - 95,109,111,100,117,108,101,176,1,0,0,115,72,0,0,0, - 0,2,2,1,10,1,12,1,6,2,8,1,4,2,6,1, - 8,1,2,1,10,1,12,2,6,1,2,1,10,1,12,1, - 10,1,8,1,8,1,2,1,10,1,12,1,12,2,4,1, - 2,1,10,1,12,1,10,1,2,1,14,1,12,1,10,2, - 14,1,20,1,6,1,6,1,114,141,0,0,0,70,169,1, - 218,8,111,118,101,114,114,105,100,101,99,2,0,0,0,0, - 0,0,0,1,0,0,0,5,0,0,0,8,0,0,0,67, - 0,0,0,115,210,1,0,0,124,2,115,20,116,0,124,1, - 100,1,100,0,131,3,100,0,117,0,114,52,122,12,124,0, - 106,1,124,1,95,2,87,0,110,18,4,0,116,3,121,50, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,72, - 116,0,124,1,100,2,100,0,131,3,100,0,117,0,114,174, - 124,0,106,4,125,3,124,3,100,0,117,0,114,144,124,0, - 106,5,100,0,117,1,114,144,116,6,100,0,117,0,114,108, - 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, - 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, - 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, - 87,0,110,18,4,0,116,3,121,172,1,0,1,0,1,0, - 89,0,110,2,48,0,124,2,115,194,116,0,124,1,100,3, - 100,0,131,3,100,0,117,0,114,226,122,12,124,0,106,13, - 124,1,95,14,87,0,110,18,4,0,116,3,121,224,1,0, - 1,0,1,0,89,0,110,2,48,0,122,10,124,0,124,1, - 95,15,87,0,110,18,4,0,116,3,121,254,1,0,1,0, - 1,0,89,0,110,2,48,0,124,2,144,1,115,24,116,0, - 124,1,100,4,100,0,131,3,100,0,117,0,144,1,114,70, - 124,0,106,5,100,0,117,1,144,1,114,70,122,12,124,0, - 106,5,124,1,95,16,87,0,110,20,4,0,116,3,144,1, - 121,68,1,0,1,0,1,0,89,0,110,2,48,0,124,0, - 106,17,144,1,114,206,124,2,144,1,115,102,116,0,124,1, - 100,5,100,0,131,3,100,0,117,0,144,1,114,136,122,12, - 124,0,106,18,124,1,95,11,87,0,110,20,4,0,116,3, - 144,1,121,134,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,144,1,115,160,116,0,124,1,100,6,100,0,131,3, - 100,0,117,0,144,1,114,206,124,0,106,19,100,0,117,1, - 144,1,114,206,122,12,124,0,106,19,124,1,95,20,87,0, - 110,20,4,0,116,3,144,1,121,204,1,0,1,0,1,0, - 89,0,110,2,48,0,124,1,83,0,41,7,78,114,1,0, - 0,0,114,97,0,0,0,218,11,95,95,112,97,99,107,97, - 103,101,95,95,114,140,0,0,0,114,107,0,0,0,114,138, - 0,0,0,41,21,114,6,0,0,0,114,17,0,0,0,114, - 1,0,0,0,114,105,0,0,0,114,108,0,0,0,114,115, - 0,0,0,114,125,0,0,0,114,126,0,0,0,218,16,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,218, - 7,95,95,110,101,119,95,95,90,5,95,112,97,116,104,114, - 107,0,0,0,114,97,0,0,0,114,129,0,0,0,114,144, - 0,0,0,114,104,0,0,0,114,140,0,0,0,114,122,0, - 0,0,114,112,0,0,0,114,121,0,0,0,114,138,0,0, - 0,41,5,114,94,0,0,0,114,95,0,0,0,114,143,0, - 0,0,114,108,0,0,0,114,145,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,18,95,105,110, - 105,116,95,109,111,100,117,108,101,95,97,116,116,114,115,221, - 1,0,0,115,96,0,0,0,0,4,20,1,2,1,12,1, - 12,1,6,2,20,1,6,1,8,2,10,1,8,1,4,1, - 6,2,10,1,8,1,6,11,6,1,2,1,10,1,12,1, - 6,2,20,1,2,1,12,1,12,1,6,2,2,1,10,1, - 12,1,6,2,24,1,12,1,2,1,12,1,14,1,6,2, - 8,1,24,1,2,1,12,1,14,1,6,2,24,1,12,1, - 2,1,12,1,14,1,6,1,114,147,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,82,0,0,0,100,1,125,1,116, - 0,124,0,106,1,100,2,131,2,114,30,124,0,106,1,160, - 2,124,0,161,1,125,1,110,20,116,0,124,0,106,1,100, - 3,131,2,114,50,116,3,100,4,131,1,130,1,124,1,100, - 1,117,0,114,68,116,4,124,0,106,5,131,1,125,1,116, - 6,124,0,124,1,131,2,1,0,124,1,83,0,41,5,122, - 43,67,114,101,97,116,101,32,97,32,109,111,100,117,108,101, - 32,98,97,115,101,100,32,111,110,32,116,104,101,32,112,114, - 111,118,105,100,101,100,32,115,112,101,99,46,78,218,13,99, - 114,101,97,116,101,95,109,111,100,117,108,101,218,11,101,120, - 101,99,95,109,111,100,117,108,101,122,66,108,111,97,100,101, - 114,115,32,116,104,97,116,32,100,101,102,105,110,101,32,101, - 120,101,99,95,109,111,100,117,108,101,40,41,32,109,117,115, - 116,32,97,108,115,111,32,100,101,102,105,110,101,32,99,114, - 101,97,116,101,95,109,111,100,117,108,101,40,41,41,7,114, - 4,0,0,0,114,108,0,0,0,114,148,0,0,0,114,78, - 0,0,0,114,18,0,0,0,114,17,0,0,0,114,147,0, - 0,0,169,2,114,94,0,0,0,114,95,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,16,109, - 111,100,117,108,101,95,102,114,111,109,95,115,112,101,99,37, - 2,0,0,115,18,0,0,0,0,3,4,1,12,3,14,1, - 12,1,8,2,8,1,10,1,10,1,114,151,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,106,0,0,0,124,0,106, - 0,100,1,117,0,114,14,100,2,110,4,124,0,106,0,125, - 1,124,0,106,1,100,1,117,0,114,66,124,0,106,2,100, - 1,117,0,114,50,100,3,160,3,124,1,161,1,83,0,100, - 4,160,3,124,1,124,0,106,2,161,2,83,0,110,36,124, - 0,106,4,114,86,100,5,160,3,124,1,124,0,106,1,161, - 2,83,0,100,6,160,3,124,0,106,0,124,0,106,1,161, - 2,83,0,100,1,83,0,41,7,122,38,82,101,116,117,114, - 110,32,116,104,101,32,114,101,112,114,32,116,111,32,117,115, - 101,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101, - 46,78,114,99,0,0,0,114,100,0,0,0,114,101,0,0, - 0,114,102,0,0,0,250,18,60,109,111,100,117,108,101,32, - 123,33,114,125,32,40,123,125,41,62,41,5,114,17,0,0, - 0,114,112,0,0,0,114,108,0,0,0,114,44,0,0,0, - 114,122,0,0,0,41,2,114,94,0,0,0,114,17,0,0, + 0,218,16,109,111,100,117,108,101,95,102,114,111,109,95,115, + 112,101,99,37,2,0,0,115,18,0,0,0,0,3,4,1, + 12,3,14,1,12,1,8,2,8,1,10,1,10,1,114,151, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,106,0,0, + 0,124,0,106,0,100,1,117,0,114,14,100,2,110,4,124, + 0,106,0,125,1,124,0,106,1,100,1,117,0,114,66,124, + 0,106,2,100,1,117,0,114,50,100,3,160,3,124,1,161, + 1,83,0,100,4,160,3,124,1,124,0,106,2,161,2,83, + 0,110,36,124,0,106,4,114,86,100,5,160,3,124,1,124, + 0,106,1,161,2,83,0,100,6,160,3,124,0,106,0,124, + 0,106,1,161,2,83,0,100,1,83,0,41,7,122,38,82, + 101,116,117,114,110,32,116,104,101,32,114,101,112,114,32,116, + 111,32,117,115,101,32,102,111,114,32,116,104,101,32,109,111, + 100,117,108,101,46,78,114,99,0,0,0,114,100,0,0,0, + 114,101,0,0,0,114,102,0,0,0,250,18,60,109,111,100, + 117,108,101,32,123,33,114,125,32,40,123,125,41,62,41,5, + 114,17,0,0,0,114,112,0,0,0,114,108,0,0,0,114, + 44,0,0,0,114,122,0,0,0,41,2,114,94,0,0,0, + 114,17,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,106,0,0,0,54,2,0,0,115,16,0, + 0,0,0,3,20,1,10,1,10,1,10,2,16,2,6,1, + 14,2,114,106,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, + 115,250,0,0,0,124,0,106,0,125,2,116,1,124,2,131, + 1,143,216,1,0,116,2,106,3,160,4,124,2,161,1,124, + 1,117,1,114,54,100,1,160,5,124,2,161,1,125,3,116, + 6,124,3,124,2,100,2,141,2,130,1,122,132,124,0,106, + 7,100,3,117,0,114,106,124,0,106,8,100,3,117,0,114, + 90,116,6,100,4,124,0,106,0,100,2,141,2,130,1,116, + 9,124,0,124,1,100,5,100,6,141,3,1,0,110,52,116, + 9,124,0,124,1,100,5,100,6,141,3,1,0,116,10,124, + 0,106,7,100,7,131,2,115,146,124,0,106,7,160,11,124, + 2,161,1,1,0,110,12,124,0,106,7,160,12,124,1,161, + 1,1,0,87,0,116,2,106,3,160,13,124,0,106,0,161, + 1,125,1,124,1,116,2,106,3,124,0,106,0,60,0,110, + 28,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,48,0,87,0,100, + 3,4,0,4,0,131,3,1,0,110,16,49,0,115,236,48, + 0,1,0,1,0,1,0,89,0,1,0,124,1,83,0,41, + 8,122,70,69,120,101,99,117,116,101,32,116,104,101,32,115, + 112,101,99,39,115,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,32,105,110,32,97,110,32,101,120,105, + 115,116,105,110,103,32,109,111,100,117,108,101,39,115,32,110, + 97,109,101,115,112,97,99,101,46,122,30,109,111,100,117,108, + 101,32,123,33,114,125,32,110,111,116,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,114,16,0,0,0,78,250, + 14,109,105,115,115,105,110,103,32,108,111,97,100,101,114,84, + 114,142,0,0,0,114,149,0,0,0,41,14,114,17,0,0, + 0,114,49,0,0,0,114,15,0,0,0,114,91,0,0,0, + 114,34,0,0,0,114,44,0,0,0,114,78,0,0,0,114, + 108,0,0,0,114,115,0,0,0,114,147,0,0,0,114,4, + 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, + 114,149,0,0,0,218,3,112,111,112,41,4,114,94,0,0, + 0,114,95,0,0,0,114,17,0,0,0,218,3,109,115,103, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 92,0,0,0,71,2,0,0,115,38,0,0,0,0,2,6, + 1,10,1,16,1,10,1,12,1,2,1,10,1,10,1,14, + 2,16,2,14,1,12,4,14,2,14,4,14,1,14,255,14, + 1,44,1,114,92,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, + 0,115,20,1,0,0,122,18,124,0,106,0,160,1,124,0, + 106,2,161,1,1,0,87,0,110,52,1,0,1,0,1,0, + 124,0,106,2,116,3,106,4,118,0,114,64,116,3,106,4, + 160,5,124,0,106,2,161,1,125,1,124,1,116,3,106,4, + 124,0,106,2,60,0,130,0,89,0,110,2,48,0,116,3, + 106,4,160,5,124,0,106,2,161,1,125,1,124,1,116,3, + 106,4,124,0,106,2,60,0,116,6,124,1,100,1,100,0, + 131,3,100,0,117,0,114,146,122,12,124,0,106,0,124,1, + 95,7,87,0,110,18,4,0,116,8,121,144,1,0,1,0, + 1,0,89,0,110,2,48,0,116,6,124,1,100,2,100,0, + 131,3,100,0,117,0,114,222,122,40,124,1,106,9,124,1, + 95,10,116,11,124,1,100,3,131,2,115,200,124,0,106,2, + 160,12,100,4,161,1,100,5,25,0,124,1,95,10,87,0, + 110,18,4,0,116,8,121,220,1,0,1,0,1,0,89,0, + 110,2,48,0,116,6,124,1,100,6,100,0,131,3,100,0, + 117,0,144,1,114,16,122,10,124,0,124,1,95,13,87,0, + 110,20,4,0,116,8,144,1,121,14,1,0,1,0,1,0, + 89,0,110,2,48,0,124,1,83,0,41,7,78,114,97,0, + 0,0,114,144,0,0,0,114,140,0,0,0,114,127,0,0, + 0,114,22,0,0,0,114,104,0,0,0,41,14,114,108,0, + 0,0,114,154,0,0,0,114,17,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,155,0,0,0,114,6,0,0,0, + 114,97,0,0,0,114,105,0,0,0,114,1,0,0,0,114, + 144,0,0,0,114,4,0,0,0,114,128,0,0,0,114,104, + 0,0,0,114,150,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,25,95,108,111,97,100,95,98, + 97,99,107,119,97,114,100,95,99,111,109,112,97,116,105,98, + 108,101,101,2,0,0,115,54,0,0,0,0,4,2,1,18, + 1,6,1,12,1,14,1,12,1,8,3,14,1,12,1,16, + 1,2,1,12,1,12,1,6,1,16,1,2,4,8,1,10, + 1,22,1,12,1,6,1,18,1,2,1,10,1,14,1,6, + 1,114,157,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, + 224,0,0,0,124,0,106,0,100,0,117,1,114,30,116,1, + 124,0,106,0,100,1,131,2,115,30,116,2,124,0,131,1, + 83,0,116,3,124,0,131,1,125,1,100,2,124,0,95,4, + 122,166,124,1,116,5,106,6,124,0,106,7,60,0,122,52, + 124,0,106,0,100,0,117,0,114,96,124,0,106,8,100,0, + 117,0,114,108,116,9,100,3,124,0,106,7,100,4,141,2, + 130,1,110,12,124,0,106,0,160,10,124,1,161,1,1,0, + 87,0,110,48,1,0,1,0,1,0,122,14,116,5,106,6, + 124,0,106,7,61,0,87,0,110,18,4,0,116,11,121,150, + 1,0,1,0,1,0,89,0,110,2,48,0,130,0,89,0, + 110,2,48,0,116,5,106,6,160,12,124,0,106,7,161,1, + 125,1,124,1,116,5,106,6,124,0,106,7,60,0,116,13, + 100,5,124,0,106,7,124,0,106,0,131,3,1,0,87,0, + 100,6,124,0,95,4,110,8,100,6,124,0,95,4,48,0, + 124,1,83,0,41,7,78,114,149,0,0,0,84,114,153,0, + 0,0,114,16,0,0,0,122,18,105,109,112,111,114,116,32, + 123,33,114,125,32,35,32,123,33,114,125,70,41,14,114,108, + 0,0,0,114,4,0,0,0,114,157,0,0,0,114,151,0, + 0,0,90,13,95,105,110,105,116,105,97,108,105,122,105,110, + 103,114,15,0,0,0,114,91,0,0,0,114,17,0,0,0, + 114,115,0,0,0,114,78,0,0,0,114,149,0,0,0,114, + 62,0,0,0,114,155,0,0,0,114,75,0,0,0,114,150, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,14,95,108,111,97,100,95,117,110,108,111,99,107, + 101,100,138,2,0,0,115,48,0,0,0,0,2,10,2,12, + 1,8,2,8,5,6,1,2,1,12,1,2,1,10,1,10, + 1,16,3,16,1,6,1,2,1,14,1,12,1,6,1,8, + 5,14,1,12,1,18,2,8,0,8,2,114,158,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,8,0,0,0,67,0,0,0,115,54,0,0,0,116,0, + 124,0,106,1,131,1,143,24,1,0,116,2,124,0,131,1, + 87,0,2,0,100,1,4,0,4,0,131,3,1,0,83,0, + 49,0,115,40,48,0,1,0,1,0,1,0,89,0,1,0, + 100,1,83,0,41,2,122,191,82,101,116,117,114,110,32,97, + 32,110,101,119,32,109,111,100,117,108,101,32,111,98,106,101, + 99,116,44,32,108,111,97,100,101,100,32,98,121,32,116,104, + 101,32,115,112,101,99,39,115,32,108,111,97,100,101,114,46, + 10,10,32,32,32,32,84,104,101,32,109,111,100,117,108,101, + 32,105,115,32,110,111,116,32,97,100,100,101,100,32,116,111, + 32,105,116,115,32,112,97,114,101,110,116,46,10,10,32,32, + 32,32,73,102,32,97,32,109,111,100,117,108,101,32,105,115, + 32,97,108,114,101,97,100,121,32,105,110,32,115,121,115,46, + 109,111,100,117,108,101,115,44,32,116,104,97,116,32,101,120, + 105,115,116,105,110,103,32,109,111,100,117,108,101,32,103,101, + 116,115,10,32,32,32,32,99,108,111,98,98,101,114,101,100, + 46,10,10,32,32,32,32,78,41,3,114,49,0,0,0,114, + 17,0,0,0,114,158,0,0,0,41,1,114,94,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 93,0,0,0,180,2,0,0,115,4,0,0,0,0,9,12, + 1,114,93,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, + 140,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, + 100,2,90,4,101,5,100,3,100,4,132,0,131,1,90,6, + 101,7,100,20,100,6,100,7,132,1,131,1,90,8,101,7, + 100,21,100,8,100,9,132,1,131,1,90,9,101,7,100,10, + 100,11,132,0,131,1,90,10,101,7,100,12,100,13,132,0, + 131,1,90,11,101,7,101,12,100,14,100,15,132,0,131,1, + 131,1,90,13,101,7,101,12,100,16,100,17,132,0,131,1, + 131,1,90,14,101,7,101,12,100,18,100,19,132,0,131,1, + 131,1,90,15,101,7,101,16,131,1,90,17,100,5,83,0, + 41,22,218,15,66,117,105,108,116,105,110,73,109,112,111,114, + 116,101,114,122,144,77,101,116,97,32,112,97,116,104,32,105, + 109,112,111,114,116,32,102,111,114,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, + 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, + 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, + 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, + 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, + 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, + 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, + 10,32,32,32,32,122,8,98,117,105,108,116,45,105,110,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 5,0,0,0,67,0,0,0,115,22,0,0,0,100,1,124, + 0,106,0,155,2,100,2,116,1,106,2,155,0,100,3,157, + 5,83,0,41,4,250,115,82,101,116,117,114,110,32,114,101, + 112,114,32,102,111,114,32,116,104,101,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,84,104,101,32,105,109,112,111,114, + 116,32,109,97,99,104,105,110,101,114,121,32,100,111,101,115, + 32,116,104,101,32,106,111,98,32,105,116,115,101,108,102,46, + 10,10,32,32,32,32,32,32,32,32,122,8,60,109,111,100, + 117,108,101,32,122,2,32,40,122,2,41,62,41,3,114,1, + 0,0,0,114,159,0,0,0,114,137,0,0,0,41,1,114, + 95,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,98,0,0,0,206,2,0,0,115,2,0,0, + 0,0,7,122,27,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,109,111,100,117,108,101,95,114,101,112,114, + 78,99,4,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,5,0,0,0,67,0,0,0,115,46,0,0,0,124, + 2,100,0,117,1,114,12,100,0,83,0,116,0,160,1,124, + 1,161,1,114,38,116,2,124,1,124,0,124,0,106,3,100, + 1,141,3,83,0,100,0,83,0,100,0,83,0,169,2,78, + 114,136,0,0,0,41,4,114,56,0,0,0,90,10,105,115, + 95,98,117,105,108,116,105,110,114,90,0,0,0,114,137,0, + 0,0,169,4,218,3,99,108,115,114,80,0,0,0,218,4, + 112,97,116,104,218,6,116,97,114,103,101,116,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,9,102,105,110, + 100,95,115,112,101,99,215,2,0,0,115,10,0,0,0,0, + 2,8,1,4,1,10,1,16,2,122,25,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,95, + 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, + 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, + 100,1,117,1,114,26,124,3,106,1,83,0,100,1,83,0, + 41,2,122,175,70,105,110,100,32,116,104,101,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,39,112,97,116,104,39, + 32,105,115,32,101,118,101,114,32,115,112,101,99,105,102,105, + 101,100,32,116,104,101,110,32,116,104,101,32,115,101,97,114, + 99,104,32,105,115,32,99,111,110,115,105,100,101,114,101,100, + 32,97,32,102,97,105,108,117,114,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,2,114,166,0,0,0,114,108,0,0,0, + 41,4,114,163,0,0,0,114,80,0,0,0,114,164,0,0, + 0,114,94,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,224,2,0,0,115,4,0,0,0,0,9,12,1,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,102,105,110,100,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,46,0,0,0,124,1,106,0,116,1, + 106,2,118,1,114,34,116,3,100,1,160,4,124,1,106,0, + 161,1,124,1,106,0,100,2,141,2,130,1,116,5,116,6, + 106,7,124,1,131,2,83,0,41,3,122,24,67,114,101,97, + 116,101,32,97,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,114,76,0,0,0,114,16,0,0,0,41,8, + 114,17,0,0,0,114,15,0,0,0,114,77,0,0,0,114, + 78,0,0,0,114,44,0,0,0,114,66,0,0,0,114,56, + 0,0,0,90,14,99,114,101,97,116,101,95,98,117,105,108, + 116,105,110,41,2,114,30,0,0,0,114,94,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,148, + 0,0,0,236,2,0,0,115,10,0,0,0,0,3,12,1, + 12,1,4,255,6,2,122,29,66,117,105,108,116,105,110,73, + 109,112,111,114,116,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16, + 0,0,0,116,0,116,1,106,2,124,1,131,2,1,0,100, + 1,83,0,41,2,122,22,69,120,101,99,32,97,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,78,41,3, + 114,66,0,0,0,114,56,0,0,0,90,12,101,120,101,99, + 95,98,117,105,108,116,105,110,41,2,114,30,0,0,0,114, + 95,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,149,0,0,0,244,2,0,0,115,2,0,0, + 0,0,3,122,27,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,101,120,101,99,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,57,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,98,117,105,108,116,45,105,110,32,109,111, + 100,117,108,101,115,32,100,111,32,110,111,116,32,104,97,118, + 101,32,99,111,100,101,32,111,98,106,101,99,116,115,46,78, + 114,10,0,0,0,169,2,114,163,0,0,0,114,80,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,106,0,0,0,54,2,0,0,115,16,0,0,0,0,3, - 20,1,10,1,10,1,10,2,16,2,6,1,14,2,114,106, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,10,0,0,0,67,0,0,0,115,250,0,0, - 0,124,0,106,0,125,2,116,1,124,2,131,1,143,216,1, - 0,116,2,106,3,160,4,124,2,161,1,124,1,117,1,114, - 54,100,1,160,5,124,2,161,1,125,3,116,6,124,3,124, - 2,100,2,141,2,130,1,122,132,124,0,106,7,100,3,117, - 0,114,106,124,0,106,8,100,3,117,0,114,90,116,6,100, - 4,124,0,106,0,100,2,141,2,130,1,116,9,124,0,124, - 1,100,5,100,6,141,3,1,0,110,52,116,9,124,0,124, - 1,100,5,100,6,141,3,1,0,116,10,124,0,106,7,100, - 7,131,2,115,146,124,0,106,7,160,11,124,2,161,1,1, - 0,110,12,124,0,106,7,160,12,124,1,161,1,1,0,87, - 0,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,110,28,116,2,106, - 3,160,13,124,0,106,0,161,1,125,1,124,1,116,2,106, - 3,124,0,106,0,60,0,48,0,87,0,100,3,4,0,4, - 0,131,3,1,0,110,16,49,0,115,236,48,0,1,0,1, - 0,1,0,89,0,1,0,124,1,83,0,41,8,122,70,69, - 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, - 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, - 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, - 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, - 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, - 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, - 115,105,110,103,32,108,111,97,100,101,114,84,114,142,0,0, - 0,114,149,0,0,0,41,14,114,17,0,0,0,114,49,0, - 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,114,44,0,0,0,114,78,0,0,0,114,108,0,0,0, - 114,115,0,0,0,114,147,0,0,0,114,4,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,114,149,0,0, - 0,218,3,112,111,112,41,4,114,94,0,0,0,114,95,0, - 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,92,0,0,0, - 71,2,0,0,115,38,0,0,0,0,2,6,1,10,1,16, - 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, - 1,12,4,14,2,14,4,14,1,14,255,14,1,44,1,114, - 92,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,8,0,0,0,67,0,0,0,115,20,1, - 0,0,122,18,124,0,106,0,160,1,124,0,106,2,161,1, - 1,0,87,0,110,52,1,0,1,0,1,0,124,0,106,2, - 116,3,106,4,118,0,114,64,116,3,106,4,160,5,124,0, - 106,2,161,1,125,1,124,1,116,3,106,4,124,0,106,2, - 60,0,130,0,89,0,110,2,48,0,116,3,106,4,160,5, - 124,0,106,2,161,1,125,1,124,1,116,3,106,4,124,0, - 106,2,60,0,116,6,124,1,100,1,100,0,131,3,100,0, - 117,0,114,146,122,12,124,0,106,0,124,1,95,7,87,0, - 110,18,4,0,116,8,121,144,1,0,1,0,1,0,89,0, - 110,2,48,0,116,6,124,1,100,2,100,0,131,3,100,0, - 117,0,114,222,122,40,124,1,106,9,124,1,95,10,116,11, - 124,1,100,3,131,2,115,200,124,0,106,2,160,12,100,4, - 161,1,100,5,25,0,124,1,95,10,87,0,110,18,4,0, - 116,8,121,220,1,0,1,0,1,0,89,0,110,2,48,0, - 116,6,124,1,100,6,100,0,131,3,100,0,117,0,144,1, - 114,16,122,10,124,0,124,1,95,13,87,0,110,20,4,0, - 116,8,144,1,121,14,1,0,1,0,1,0,89,0,110,2, - 48,0,124,1,83,0,41,7,78,114,97,0,0,0,114,144, - 0,0,0,114,140,0,0,0,114,127,0,0,0,114,22,0, - 0,0,114,104,0,0,0,41,14,114,108,0,0,0,114,154, - 0,0,0,114,17,0,0,0,114,15,0,0,0,114,91,0, - 0,0,114,155,0,0,0,114,6,0,0,0,114,97,0,0, - 0,114,105,0,0,0,114,1,0,0,0,114,144,0,0,0, - 114,4,0,0,0,114,128,0,0,0,114,104,0,0,0,114, - 150,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,25,95,108,111,97,100,95,98,97,99,107,119, - 97,114,100,95,99,111,109,112,97,116,105,98,108,101,101,2, - 0,0,115,54,0,0,0,0,4,2,1,18,1,6,1,12, - 1,14,1,12,1,8,3,14,1,12,1,16,1,2,1,12, - 1,12,1,6,1,16,1,2,4,8,1,10,1,22,1,12, - 1,6,1,18,1,2,1,10,1,14,1,6,1,114,157,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,11,0,0,0,67,0,0,0,115,224,0,0,0, - 124,0,106,0,100,0,117,1,114,30,116,1,124,0,106,0, - 100,1,131,2,115,30,116,2,124,0,131,1,83,0,116,3, - 124,0,131,1,125,1,100,2,124,0,95,4,122,166,124,1, - 116,5,106,6,124,0,106,7,60,0,122,52,124,0,106,0, - 100,0,117,0,114,96,124,0,106,8,100,0,117,0,114,108, - 116,9,100,3,124,0,106,7,100,4,141,2,130,1,110,12, - 124,0,106,0,160,10,124,1,161,1,1,0,87,0,110,48, - 1,0,1,0,1,0,122,14,116,5,106,6,124,0,106,7, - 61,0,87,0,110,18,4,0,116,11,121,150,1,0,1,0, - 1,0,89,0,110,2,48,0,130,0,89,0,110,2,48,0, - 116,5,106,6,160,12,124,0,106,7,161,1,125,1,124,1, - 116,5,106,6,124,0,106,7,60,0,116,13,100,5,124,0, - 106,7,124,0,106,0,131,3,1,0,87,0,100,6,124,0, - 95,4,110,8,100,6,124,0,95,4,48,0,124,1,83,0, - 41,7,78,114,149,0,0,0,84,114,153,0,0,0,114,16, - 0,0,0,122,18,105,109,112,111,114,116,32,123,33,114,125, - 32,35,32,123,33,114,125,70,41,14,114,108,0,0,0,114, - 4,0,0,0,114,157,0,0,0,114,151,0,0,0,90,13, - 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, - 0,0,114,91,0,0,0,114,17,0,0,0,114,115,0,0, - 0,114,78,0,0,0,114,149,0,0,0,114,62,0,0,0, - 114,155,0,0,0,114,75,0,0,0,114,150,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, - 95,108,111,97,100,95,117,110,108,111,99,107,101,100,138,2, - 0,0,115,48,0,0,0,0,2,10,2,12,1,8,2,8, - 5,6,1,2,1,12,1,2,1,10,1,10,1,16,3,16, - 1,6,1,2,1,14,1,12,1,6,1,8,5,14,1,12, - 1,18,2,8,0,8,2,114,158,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, - 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, - 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, - 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, - 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, - 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, - 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, - 101,99,39,115,32,108,111,97,100,101,114,46,10,10,32,32, - 32,32,84,104,101,32,109,111,100,117,108,101,32,105,115,32, - 110,111,116,32,97,100,100,101,100,32,116,111,32,105,116,115, - 32,112,97,114,101,110,116,46,10,10,32,32,32,32,73,102, - 32,97,32,109,111,100,117,108,101,32,105,115,32,97,108,114, - 101,97,100,121,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, - 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, - 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, - 32,32,32,78,41,3,114,49,0,0,0,114,17,0,0,0, - 114,158,0,0,0,41,1,114,94,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, - 180,2,0,0,115,4,0,0,0,0,9,12,1,114,93,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, - 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, - 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, - 100,9,132,1,131,1,90,9,101,7,100,10,100,11,132,0, - 131,1,90,10,101,7,100,12,100,13,132,0,131,1,90,11, - 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, - 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, - 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, - 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, - 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, - 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, - 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, + 218,8,103,101,116,95,99,111,100,101,249,2,0,0,115,2, + 0,0,0,0,4,122,24,66,117,105,108,116,105,110,73,109, + 112,111,114,116,101,114,46,103,101,116,95,99,111,100,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,41,2,122,56,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, + 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,10, + 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,10,103,101,116,95,115,111,117, + 114,99,101,255,2,0,0,115,2,0,0,0,0,4,122,26, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, + 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,52, + 82,101,116,117,114,110,32,70,97,108,115,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,97,114,101,32,110,101,118,101,114,32,112,97,99,107,97, + 103,101,115,46,70,114,10,0,0,0,114,168,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,114, + 0,0,0,5,3,0,0,115,2,0,0,0,0,4,122,26, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,46, + 105,115,95,112,97,99,107,97,103,101,41,2,78,78,41,1, + 78,41,18,114,1,0,0,0,114,0,0,0,0,114,2,0, + 0,0,114,3,0,0,0,114,137,0,0,0,218,12,115,116, + 97,116,105,99,109,101,116,104,111,100,114,98,0,0,0,218, + 11,99,108,97,115,115,109,101,116,104,111,100,114,166,0,0, + 0,114,167,0,0,0,114,148,0,0,0,114,149,0,0,0, + 114,85,0,0,0,114,169,0,0,0,114,170,0,0,0,114, + 114,0,0,0,114,96,0,0,0,114,154,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,159,0,0,0,195,2,0,0,115,44,0,0,0, + 8,2,4,7,4,2,2,1,10,8,2,1,12,8,2,1, + 12,11,2,1,10,7,2,1,10,4,2,1,2,1,12,4, + 2,1,2,1,12,4,2,1,2,1,12,4,114,159,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,144,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101, + 5,100,3,100,4,132,0,131,1,90,6,101,7,100,22,100, + 6,100,7,132,1,131,1,90,8,101,7,100,23,100,8,100, + 9,132,1,131,1,90,9,101,7,100,10,100,11,132,0,131, + 1,90,10,101,5,100,12,100,13,132,0,131,1,90,11,101, + 7,100,14,100,15,132,0,131,1,90,12,101,7,101,13,100, + 16,100,17,132,0,131,1,131,1,90,14,101,7,101,13,100, + 18,100,19,132,0,131,1,131,1,90,15,101,7,101,13,100, + 20,100,21,132,0,131,1,131,1,90,16,100,5,83,0,41, + 24,218,14,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,122,142,77,101,116,97,32,112,97,116,104,32,105,109,112, + 111,114,116,32,102,111,114,32,102,114,111,122,101,110,32,109, 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, @@ -1049,761 +1193,617 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, - 32,122,8,98,117,105,108,116,45,105,110,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, - 67,0,0,0,115,22,0,0,0,100,1,124,0,106,0,155, - 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, - 4,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,8,60,109,111,100,117,108,101,32, - 122,2,32,40,122,2,41,62,41,3,114,1,0,0,0,114, - 159,0,0,0,114,137,0,0,0,41,1,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 98,0,0,0,206,2,0,0,115,2,0,0,0,0,7,122, - 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, - 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, - 0,0,67,0,0,0,115,46,0,0,0,124,2,100,0,117, - 1,114,12,100,0,83,0,116,0,160,1,124,1,161,1,114, - 38,116,2,124,1,124,0,124,0,106,3,100,1,141,3,83, - 0,100,0,83,0,100,0,83,0,169,2,78,114,136,0,0, - 0,41,4,114,56,0,0,0,90,10,105,115,95,98,117,105, - 108,116,105,110,114,90,0,0,0,114,137,0,0,0,169,4, - 218,3,99,108,115,114,80,0,0,0,218,4,112,97,116,104, - 218,6,116,97,114,103,101,116,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,215,2,0,0,115,10,0,0,0,0,2,8,1,4, - 1,10,1,16,2,122,25,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,102,105,110,100,95,115,112,101,99, - 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,1, - 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, - 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, - 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, - 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, - 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, - 97,105,108,117,114,101,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,2,114,166,0,0,0,114,108,0,0,0,41,4,114,163, - 0,0,0,114,80,0,0,0,114,164,0,0,0,114,94,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,11,102,105,110,100,95,109,111,100,117,108,101,224,2, - 0,0,115,4,0,0,0,0,9,12,1,122,27,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, - 100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, - 0,115,46,0,0,0,124,1,106,0,116,1,106,2,118,1, - 114,34,116,3,100,1,160,4,124,1,106,0,161,1,124,1, - 106,0,100,2,141,2,130,1,116,5,116,6,106,7,124,1, - 131,2,83,0,41,3,122,24,67,114,101,97,116,101,32,97, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 114,76,0,0,0,114,16,0,0,0,41,8,114,17,0,0, - 0,114,15,0,0,0,114,77,0,0,0,114,78,0,0,0, - 114,44,0,0,0,114,66,0,0,0,114,56,0,0,0,90, - 14,99,114,101,97,116,101,95,98,117,105,108,116,105,110,41, - 2,114,30,0,0,0,114,94,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,148,0,0,0,236, - 2,0,0,115,10,0,0,0,0,3,12,1,12,1,4,255, - 6,2,122,29,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, + 32,90,6,102,114,111,122,101,110,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, + 0,0,115,16,0,0,0,100,1,160,0,124,0,106,1,116, + 2,106,3,161,2,83,0,41,2,114,160,0,0,0,114,152, + 0,0,0,41,4,114,44,0,0,0,114,1,0,0,0,114, + 173,0,0,0,114,137,0,0,0,41,1,218,1,109,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,98,0, + 0,0,25,3,0,0,115,2,0,0,0,0,7,122,26,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,46,109,111, + 100,117,108,101,95,114,101,112,114,78,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, + 0,0,0,115,34,0,0,0,116,0,160,1,124,1,161,1, + 114,26,116,2,124,1,124,0,124,0,106,3,100,1,141,3, + 83,0,100,0,83,0,100,0,83,0,114,161,0,0,0,41, + 4,114,56,0,0,0,114,87,0,0,0,114,90,0,0,0, + 114,137,0,0,0,114,162,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,166,0,0,0,34,3, + 0,0,115,6,0,0,0,0,2,10,1,16,2,122,24,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,18,0,0,0,116,0,160,1,124,1,161,1,114,14,124, + 0,83,0,100,1,83,0,41,2,122,93,70,105,110,100,32, + 97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,78,41,2,114,56,0,0,0, + 114,87,0,0,0,41,3,114,163,0,0,0,114,80,0,0, + 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,167,0,0,0,41,3,0,0,115,2, + 0,0,0,0,7,122,26,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,46,102,105,110,100,95,109,111,100,117,108, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,67,0,0,0,115,16,0,0,0,116, - 0,116,1,106,2,124,1,131,2,1,0,100,1,83,0,41, - 2,122,22,69,120,101,99,32,97,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,78,41,3,114,66,0,0, - 0,114,56,0,0,0,90,12,101,120,101,99,95,98,117,105, - 108,116,105,110,41,2,114,30,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 149,0,0,0,244,2,0,0,115,2,0,0,0,0,3,122, - 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, - 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, - 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, - 100,101,32,111,98,106,101,99,116,115,46,78,114,10,0,0, - 0,169,2,114,163,0,0,0,114,80,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,8,103,101, - 116,95,99,111,100,101,249,2,0,0,115,2,0,0,0,0, - 4,122,24,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, - 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, - 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, - 168,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,255, - 2,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,103,101,116,95, - 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,52,82,101,116,117, - 114,110,32,70,97,108,115,101,32,97,115,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,32,97,114,101, - 32,110,101,118,101,114,32,112,97,99,107,97,103,101,115,46, - 70,114,10,0,0,0,114,168,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,114,0,0,0,5, - 3,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,105,115,95,112, - 97,99,107,97,103,101,41,2,78,78,41,1,78,41,18,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,137,0,0,0,218,12,115,116,97,116,105,99, - 109,101,116,104,111,100,114,98,0,0,0,218,11,99,108,97, - 115,115,109,101,116,104,111,100,114,166,0,0,0,114,167,0, - 0,0,114,148,0,0,0,114,149,0,0,0,114,85,0,0, - 0,114,169,0,0,0,114,170,0,0,0,114,114,0,0,0, - 114,96,0,0,0,114,154,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,159, - 0,0,0,195,2,0,0,115,44,0,0,0,8,2,4,7, - 4,2,2,1,10,8,2,1,12,8,2,1,12,11,2,1, - 10,7,2,1,10,4,2,1,2,1,12,4,2,1,2,1, - 12,4,2,1,2,1,12,4,114,159,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,144,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,90,4,101,5,100,3,100, - 4,132,0,131,1,90,6,101,7,100,22,100,6,100,7,132, - 1,131,1,90,8,101,7,100,23,100,8,100,9,132,1,131, - 1,90,9,101,7,100,10,100,11,132,0,131,1,90,10,101, - 5,100,12,100,13,132,0,131,1,90,11,101,7,100,14,100, - 15,132,0,131,1,90,12,101,7,101,13,100,16,100,17,132, - 0,131,1,131,1,90,14,101,7,101,13,100,18,100,19,132, - 0,131,1,131,1,90,15,101,7,101,13,100,20,100,21,132, - 0,131,1,131,1,90,16,100,5,83,0,41,24,218,14,70, - 114,111,122,101,110,73,109,112,111,114,116,101,114,122,142,77, - 101,116,97,32,112,97,116,104,32,105,109,112,111,114,116,32, - 102,111,114,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, - 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, - 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, - 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, - 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, - 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, - 32,99,108,97,115,115,46,10,10,32,32,32,32,90,6,102, - 114,111,122,101,110,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,16, - 0,0,0,100,1,160,0,124,0,106,1,116,2,106,3,161, - 2,83,0,41,2,114,160,0,0,0,114,152,0,0,0,41, - 4,114,44,0,0,0,114,1,0,0,0,114,173,0,0,0, - 114,137,0,0,0,41,1,218,1,109,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,98,0,0,0,25,3, - 0,0,115,2,0,0,0,0,7,122,26,70,114,111,122,101, - 110,73,109,112,111,114,116,101,114,46,109,111,100,117,108,101, - 95,114,101,112,114,78,99,4,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, - 34,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, - 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, - 83,0,100,0,83,0,114,161,0,0,0,41,4,114,56,0, - 0,0,114,87,0,0,0,114,90,0,0,0,114,137,0,0, - 0,114,162,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,166,0,0,0,34,3,0,0,115,6, - 0,0,0,0,2,10,1,16,2,122,24,70,114,111,122,101, - 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,115, - 112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,3,0,0,0,67,0,0,0,115,18,0,0, - 0,116,0,160,1,124,1,161,1,114,14,124,0,83,0,100, - 1,83,0,41,2,122,93,70,105,110,100,32,97,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40, - 41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32, - 32,32,32,32,78,41,2,114,56,0,0,0,114,87,0,0, - 0,41,3,114,163,0,0,0,114,80,0,0,0,114,164,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,167,0,0,0,41,3,0,0,115,2,0,0,0,0, - 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,102,105,110,100,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, - 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, - 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,10, - 0,0,0,41,2,114,163,0,0,0,114,94,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,148, - 0,0,0,50,3,0,0,115,2,0,0,0,0,2,122,28, - 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0, - 0,67,0,0,0,115,64,0,0,0,124,0,106,0,106,1, - 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, - 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, - 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, - 106,9,131,2,1,0,100,0,83,0,114,86,0,0,0,41, - 10,114,104,0,0,0,114,17,0,0,0,114,56,0,0,0, - 114,87,0,0,0,114,78,0,0,0,114,44,0,0,0,114, - 66,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, - 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, - 0,0,41,3,114,95,0,0,0,114,17,0,0,0,218,4, - 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,149,0,0,0,54,3,0,0,115,14,0,0, - 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,122, - 26,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, - 101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,10,0,0,0,116,0,124,0,124,1,131, - 2,83,0,41,1,122,95,76,111,97,100,32,97,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,41,1,114,96,0,0,0,114,168,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,154,0,0,0,63,3,0,0,115,2,0,0,0,0, - 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,160,1,124, - 1,161,1,83,0,41,1,122,45,82,101,116,117,114,110,32, - 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, - 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, - 111,100,117,108,101,46,41,2,114,56,0,0,0,114,175,0, - 0,0,114,168,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,169,0,0,0,72,3,0,0,115, - 2,0,0,0,0,4,122,23,70,114,111,122,101,110,73,109, - 112,111,114,116,101,114,46,103,101,116,95,99,111,100,101,99, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,42,85,115,101,32,100,101,102,97,117, + 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, + 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, + 46,78,114,10,0,0,0,41,2,114,163,0,0,0,114,94, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,148,0,0,0,50,3,0,0,115,2,0,0,0, + 0,2,122,28,70,114,111,122,101,110,73,109,112,111,114,116, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,64,0,0,0,124,0, + 106,0,106,1,125,1,116,2,160,3,124,1,161,1,115,36, + 116,4,100,1,160,5,124,1,161,1,124,1,100,2,141,2, + 130,1,116,6,116,2,106,7,124,1,131,2,125,2,116,8, + 124,2,124,0,106,9,131,2,1,0,100,0,83,0,114,86, + 0,0,0,41,10,114,104,0,0,0,114,17,0,0,0,114, + 56,0,0,0,114,87,0,0,0,114,78,0,0,0,114,44, + 0,0,0,114,66,0,0,0,218,17,103,101,116,95,102,114, + 111,122,101,110,95,111,98,106,101,99,116,218,4,101,120,101, + 99,114,7,0,0,0,41,3,114,95,0,0,0,114,17,0, + 0,0,218,4,99,111,100,101,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,149,0,0,0,54,3,0,0, + 115,14,0,0,0,0,2,8,1,10,1,10,1,2,255,6, + 2,12,1,122,26,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,46,101,120,101,99,95,109,111,100,117,108,101,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,54,82,101,116,117,114,110,32,78,111,110,101, - 32,97,115,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, - 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, + 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,124, + 0,124,1,131,2,83,0,41,1,122,95,76,111,97,100,32, + 97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, + 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,41,1,114,96,0,0, 0,114,168,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,170,0,0,0,78,3,0,0,115,2, - 0,0,0,0,4,122,25,70,114,111,122,101,110,73,109,112, - 111,114,116,101,114,46,103,101,116,95,115,111,117,114,99,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, - 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, - 97,32,112,97,99,107,97,103,101,46,41,2,114,56,0,0, - 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, - 107,97,103,101,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,114,0,0,0,84,3,0, - 0,115,2,0,0,0,0,4,122,25,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107, - 97,103,101,41,2,78,78,41,1,78,41,17,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,137,0,0,0,114,171,0,0,0,114,98,0,0,0,114, - 172,0,0,0,114,166,0,0,0,114,167,0,0,0,114,148, - 0,0,0,114,149,0,0,0,114,154,0,0,0,114,89,0, - 0,0,114,169,0,0,0,114,170,0,0,0,114,114,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,173,0,0,0,14,3,0,0,115,46, - 0,0,0,8,2,4,7,4,2,2,1,10,8,2,1,12, - 6,2,1,12,8,2,1,10,3,2,1,10,8,2,1,10, - 8,2,1,2,1,12,4,2,1,2,1,12,4,2,1,2, - 1,114,173,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,64,0,0,0,115, - 32,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,83,0,41,7,218,18,95,73,109,112,111,114,116,76, - 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, - 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,12,0,0,0,116,0, - 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, - 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, - 32,108,111,99,107,46,78,41,2,114,56,0,0,0,114,57, - 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,53,0,0,0,97,3,0,0, - 115,2,0,0,0,0,2,122,28,95,73,109,112,111,114,116, - 76,111,99,107,67,111,110,116,101,120,116,46,95,95,101,110, - 116,101,114,95,95,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, - 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, - 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, - 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, - 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, - 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, - 41,2,114,56,0,0,0,114,59,0,0,0,41,4,114,30, - 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, - 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, - 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,55,0,0,0,101,3,0,0,115, - 2,0,0,0,0,2,122,27,95,73,109,112,111,114,116,76, - 111,99,107,67,111,110,116,101,120,116,46,95,95,101,120,105, - 116,95,95,78,41,6,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,53,0,0,0,114, - 55,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,178,0,0,0,93,3,0, - 0,115,6,0,0,0,8,2,4,2,8,4,114,178,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, - 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, - 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, - 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, - 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, - 6,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, - 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, - 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, - 32,111,110,101,46,114,127,0,0,0,114,37,0,0,0,122, - 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, - 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, - 97,103,101,114,22,0,0,0,250,5,123,125,46,123,125,41, - 4,218,6,114,115,112,108,105,116,218,3,108,101,110,114,78, - 0,0,0,114,44,0,0,0,41,5,114,17,0,0,0,218, - 7,112,97,99,107,97,103,101,218,5,108,101,118,101,108,90, - 4,98,105,116,115,90,4,98,97,115,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,13,95,114,101,115, - 111,108,118,101,95,110,97,109,101,106,3,0,0,115,10,0, - 0,0,0,2,16,1,12,1,8,1,8,1,114,187,0,0, - 0,99,3,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,4,0,0,0,67,0,0,0,115,34,0,0,0,124, - 0,160,0,124,1,124,2,161,2,125,3,124,3,100,0,117, - 0,114,24,100,0,83,0,116,1,124,1,124,3,131,2,83, - 0,114,13,0,0,0,41,2,114,167,0,0,0,114,90,0, - 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, - 0,114,164,0,0,0,114,108,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,17,95,102,105,110, - 100,95,115,112,101,99,95,108,101,103,97,99,121,115,3,0, - 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,189, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,10,0,0,0,67,0,0,0,115,32,1,0, - 0,116,0,106,1,125,3,124,3,100,1,117,0,114,22,116, - 2,100,2,131,1,130,1,124,3,115,38,116,3,160,4,100, - 3,116,5,161,2,1,0,124,0,116,0,106,6,118,0,125, - 4,124,3,68,0,93,230,125,5,116,7,131,0,143,94,1, - 0,122,10,124,5,106,8,125,6,87,0,110,54,4,0,116, - 9,121,128,1,0,1,0,1,0,116,10,124,5,124,0,124, - 1,131,3,125,7,124,7,100,1,117,0,114,124,89,0,87, - 0,100,1,4,0,4,0,131,3,1,0,113,52,89,0,110, - 14,48,0,124,6,124,0,124,1,124,2,131,3,125,7,87, - 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, - 162,48,0,1,0,1,0,1,0,89,0,1,0,124,7,100, - 1,117,1,114,52,124,4,144,1,115,18,124,0,116,0,106, - 6,118,0,144,1,114,18,116,0,106,6,124,0,25,0,125, - 8,122,10,124,8,106,11,125,9,87,0,110,26,4,0,116, - 9,121,244,1,0,1,0,1,0,124,7,6,0,89,0,2, - 0,1,0,83,0,48,0,124,9,100,1,117,0,144,1,114, - 8,124,7,2,0,1,0,83,0,124,9,2,0,1,0,83, - 0,113,52,124,7,2,0,1,0,83,0,113,52,100,1,83, - 0,41,4,122,21,70,105,110,100,32,97,32,109,111,100,117, - 108,101,39,115,32,115,112,101,99,46,78,122,53,115,121,115, - 46,109,101,116,97,95,112,97,116,104,32,105,115,32,78,111, - 110,101,44,32,80,121,116,104,111,110,32,105,115,32,108,105, - 107,101,108,121,32,115,104,117,116,116,105,110,103,32,100,111, - 119,110,122,22,115,121,115,46,109,101,116,97,95,112,97,116, - 104,32,105,115,32,101,109,112,116,121,41,12,114,15,0,0, - 0,218,9,109,101,116,97,95,112,97,116,104,114,78,0,0, - 0,218,9,95,119,97,114,110,105,110,103,115,218,4,119,97, - 114,110,218,13,73,109,112,111,114,116,87,97,114,110,105,110, - 103,114,91,0,0,0,114,178,0,0,0,114,166,0,0,0, - 114,105,0,0,0,114,189,0,0,0,114,104,0,0,0,41, - 10,114,17,0,0,0,114,164,0,0,0,114,165,0,0,0, - 114,190,0,0,0,90,9,105,115,95,114,101,108,111,97,100, - 114,188,0,0,0,114,166,0,0,0,114,94,0,0,0,114, - 95,0,0,0,114,104,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,10,95,102,105,110,100,95, - 115,112,101,99,124,3,0,0,115,54,0,0,0,0,2,6, - 1,8,2,8,3,4,1,12,5,10,1,8,1,8,1,2, - 1,10,1,12,1,12,1,8,1,22,2,42,1,8,2,18, - 1,10,1,2,1,10,1,12,4,14,2,10,1,8,2,10, - 2,10,2,114,194,0,0,0,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, - 0,115,108,0,0,0,116,0,124,0,116,1,131,2,115,28, - 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, - 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, - 130,1,124,2,100,2,107,4,114,84,116,0,124,1,116,1, - 131,2,115,72,116,2,100,4,131,1,130,1,110,12,124,1, - 115,84,116,6,100,5,131,1,130,1,124,0,115,104,124,2, - 100,2,107,2,114,104,116,5,100,6,131,1,130,1,100,7, - 83,0,41,8,122,28,86,101,114,105,102,121,32,97,114,103, - 117,109,101,110,116,115,32,97,114,101,32,34,115,97,110,101, - 34,46,122,31,109,111,100,117,108,101,32,110,97,109,101,32, - 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, - 32,123,125,114,22,0,0,0,122,18,108,101,118,101,108,32, - 109,117,115,116,32,98,101,32,62,61,32,48,122,31,95,95, - 112,97,99,107,97,103,101,95,95,32,110,111,116,32,115,101, - 116,32,116,111,32,97,32,115,116,114,105,110,103,122,54,97, - 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, - 101,32,105,109,112,111,114,116,32,119,105,116,104,32,110,111, - 32,107,110,111,119,110,32,112,97,114,101,110,116,32,112,97, - 99,107,97,103,101,122,17,69,109,112,116,121,32,109,111,100, - 117,108,101,32,110,97,109,101,78,41,7,218,10,105,115,105, - 110,115,116,97,110,99,101,218,3,115,116,114,218,9,84,121, - 112,101,69,114,114,111,114,114,44,0,0,0,114,14,0,0, - 0,218,10,86,97,108,117,101,69,114,114,111,114,114,78,0, - 0,0,169,3,114,17,0,0,0,114,185,0,0,0,114,186, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, - 107,171,3,0,0,115,22,0,0,0,0,2,10,1,18,1, - 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, - 114,200,0,0,0,122,16,78,111,32,109,111,100,117,108,101, - 32,110,97,109,101,100,32,122,4,123,33,114,125,99,2,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0, - 0,0,67,0,0,0,115,22,1,0,0,100,0,125,2,124, - 0,160,0,100,1,161,1,100,2,25,0,125,3,124,3,114, - 132,124,3,116,1,106,2,118,1,114,42,116,3,124,1,124, - 3,131,2,1,0,124,0,116,1,106,2,118,0,114,62,116, - 1,106,2,124,0,25,0,83,0,116,1,106,2,124,3,25, - 0,125,4,122,10,124,4,106,4,125,2,87,0,110,48,4, - 0,116,5,121,130,1,0,1,0,1,0,116,6,100,3,23, - 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, - 0,100,4,141,2,100,0,130,2,89,0,110,2,48,0,116, - 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, - 170,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, - 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,144, - 1,114,18,116,1,106,2,124,3,25,0,125,4,124,0,160, - 0,100,1,161,1,100,5,25,0,125,8,122,16,116,11,124, - 4,124,8,124,7,131,3,1,0,87,0,110,48,4,0,116, - 5,144,1,121,16,1,0,1,0,1,0,100,6,124,3,155, - 2,100,7,124,8,155,2,157,4,125,5,116,12,160,13,124, - 5,116,14,161,2,1,0,89,0,110,2,48,0,124,7,83, - 0,41,8,78,114,127,0,0,0,114,22,0,0,0,122,23, - 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, - 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, - 0,122,27,67,97,110,110,111,116,32,115,101,116,32,97,110, - 32,97,116,116,114,105,98,117,116,101,32,111,110,32,122,18, - 32,102,111,114,32,99,104,105,108,100,32,109,111,100,117,108, - 101,32,41,15,114,128,0,0,0,114,15,0,0,0,114,91, - 0,0,0,114,66,0,0,0,114,140,0,0,0,114,105,0, - 0,0,218,8,95,69,82,82,95,77,83,71,114,44,0,0, - 0,218,19,77,111,100,117,108,101,78,111,116,70,111,117,110, - 100,69,114,114,111,114,114,194,0,0,0,114,158,0,0,0, - 114,5,0,0,0,114,191,0,0,0,114,192,0,0,0,114, - 193,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, - 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, - 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, - 0,0,114,94,0,0,0,114,95,0,0,0,90,5,99,104, - 105,108,100,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,23,95,102,105,110,100,95,97,110,100,95,108,111, - 97,100,95,117,110,108,111,99,107,101,100,190,3,0,0,115, - 52,0,0,0,0,1,4,1,14,1,4,1,10,1,10,2, - 10,1,10,1,10,1,2,1,10,1,12,1,16,1,20,1, - 10,1,8,1,20,2,8,1,6,2,10,1,14,1,2,1, - 16,1,14,1,16,1,18,1,114,205,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, - 0,0,67,0,0,0,115,128,0,0,0,116,0,124,0,131, - 1,143,62,1,0,116,1,106,2,160,3,124,0,116,4,161, - 2,125,2,124,2,116,4,117,0,114,56,116,5,124,0,124, - 1,131,2,87,0,2,0,100,1,4,0,4,0,131,3,1, - 0,83,0,87,0,100,1,4,0,4,0,131,3,1,0,110, - 16,49,0,115,76,48,0,1,0,1,0,1,0,89,0,1, - 0,124,2,100,1,117,0,114,116,100,2,160,6,124,0,161, - 1,125,3,116,7,124,3,124,0,100,3,141,2,130,1,116, - 8,124,0,131,1,1,0,124,2,83,0,41,4,122,25,70, - 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101, - 32,109,111,100,117,108,101,46,78,122,40,105,109,112,111,114, - 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, - 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,114,16,0,0,0,41,9,114,49,0,0,0,114, - 15,0,0,0,114,91,0,0,0,114,34,0,0,0,218,14, - 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,205, - 0,0,0,114,44,0,0,0,114,203,0,0,0,114,64,0, - 0,0,41,4,114,17,0,0,0,114,204,0,0,0,114,95, - 0,0,0,114,74,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,14,95,102,105,110,100,95,97, - 110,100,95,108,111,97,100,225,3,0,0,115,22,0,0,0, - 0,2,10,1,14,1,8,1,54,2,8,1,4,1,2,255, - 4,2,12,2,8,1,114,207,0,0,0,114,22,0,0,0, - 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, - 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, - 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, - 124,0,116,3,131,2,83,0,41,2,97,50,1,0,0,73, - 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, - 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, - 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, - 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, - 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, - 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, - 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, - 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, - 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, - 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, - 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, - 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, - 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, - 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, - 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, - 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, - 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, - 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, - 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, - 32,114,22,0,0,0,41,4,114,200,0,0,0,114,187,0, - 0,0,114,207,0,0,0,218,11,95,103,99,100,95,105,109, - 112,111,114,116,114,199,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,208,0,0,0,241,3,0, - 0,115,8,0,0,0,0,9,12,1,8,1,12,1,114,208, - 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, - 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,11,0,0,0,67,0,0,0,115,232,0,0,0,124,1, - 68,0,93,222,125,4,116,0,124,4,116,1,131,2,115,66, - 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, - 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, - 124,4,131,1,106,2,155,0,157,4,131,1,130,1,113,4, - 124,4,100,5,107,2,114,108,124,3,115,226,116,5,124,0, - 100,6,131,2,114,226,116,6,124,0,124,0,106,7,124,2, - 100,7,100,8,141,4,1,0,113,4,116,5,124,0,124,4, - 131,2,115,4,100,9,160,8,124,0,106,2,124,4,161,2, - 125,6,122,14,116,9,124,2,124,6,131,2,1,0,87,0, - 113,4,4,0,116,10,121,224,1,0,125,7,1,0,122,54, - 124,7,106,11,124,6,107,2,114,202,116,12,106,13,160,14, - 124,6,116,15,161,2,100,10,117,1,114,202,87,0,89,0, - 100,10,125,7,126,7,113,4,130,0,87,0,89,0,100,10, - 125,7,126,7,113,4,100,10,125,7,126,7,48,0,48,0, - 113,4,124,0,83,0,41,11,122,238,70,105,103,117,114,101, - 32,111,117,116,32,119,104,97,116,32,95,95,105,109,112,111, - 114,116,95,95,32,115,104,111,117,108,100,32,114,101,116,117, - 114,110,46,10,10,32,32,32,32,84,104,101,32,105,109,112, - 111,114,116,95,32,112,97,114,97,109,101,116,101,114,32,105, - 115,32,97,32,99,97,108,108,97,98,108,101,32,119,104,105, - 99,104,32,116,97,107,101,115,32,116,104,101,32,110,97,109, - 101,32,111,102,32,109,111,100,117,108,101,32,116,111,10,32, - 32,32,32,105,109,112,111,114,116,46,32,73,116,32,105,115, - 32,114,101,113,117,105,114,101,100,32,116,111,32,100,101,99, - 111,117,112,108,101,32,116,104,101,32,102,117,110,99,116,105, - 111,110,32,102,114,111,109,32,97,115,115,117,109,105,110,103, - 32,105,109,112,111,114,116,108,105,98,39,115,10,32,32,32, - 32,105,109,112,111,114,116,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,105,115,32,100,101,115,105,114,101, - 100,46,10,10,32,32,32,32,122,8,46,95,95,97,108,108, - 95,95,122,13,96,96,102,114,111,109,32,108,105,115,116,39, - 39,122,8,73,116,101,109,32,105,110,32,122,18,32,109,117, - 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,250, - 1,42,218,7,95,95,97,108,108,95,95,84,114,209,0,0, - 0,114,182,0,0,0,78,41,16,114,195,0,0,0,114,196, - 0,0,0,114,1,0,0,0,114,197,0,0,0,114,14,0, - 0,0,114,4,0,0,0,218,16,95,104,97,110,100,108,101, - 95,102,114,111,109,108,105,115,116,114,212,0,0,0,114,44, - 0,0,0,114,66,0,0,0,114,203,0,0,0,114,17,0, - 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,114,206,0,0,0,41,8,114,95,0,0,0,218,8,102, - 114,111,109,108,105,115,116,114,204,0,0,0,114,210,0,0, - 0,218,1,120,90,5,119,104,101,114,101,90,9,102,114,111, - 109,95,110,97,109,101,90,3,101,120,99,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,213,0,0,0,0, - 4,0,0,115,44,0,0,0,0,10,8,1,10,1,4,1, - 12,2,4,1,28,2,8,1,14,1,10,1,2,255,8,2, - 10,1,14,1,2,1,14,1,14,4,10,1,16,255,2,2, - 12,1,26,1,114,213,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,6,0,0,0,67,0, - 0,0,115,146,0,0,0,124,0,160,0,100,1,161,1,125, - 1,124,0,160,0,100,2,161,1,125,2,124,1,100,3,117, - 1,114,82,124,2,100,3,117,1,114,78,124,1,124,2,106, - 1,107,3,114,78,116,2,106,3,100,4,124,1,155,2,100, - 5,124,2,106,1,155,2,100,6,157,5,116,4,100,7,100, - 8,141,3,1,0,124,1,83,0,124,2,100,3,117,1,114, - 96,124,2,106,1,83,0,116,2,106,3,100,9,116,4,100, - 7,100,8,141,3,1,0,124,0,100,10,25,0,125,1,100, - 11,124,0,118,1,114,142,124,1,160,5,100,12,161,1,100, - 13,25,0,125,1,124,1,83,0,41,14,122,167,67,97,108, - 99,117,108,97,116,101,32,119,104,97,116,32,95,95,112,97, - 99,107,97,103,101,95,95,32,115,104,111,117,108,100,32,98, - 101,46,10,10,32,32,32,32,95,95,112,97,99,107,97,103, - 101,95,95,32,105,115,32,110,111,116,32,103,117,97,114,97, - 110,116,101,101,100,32,116,111,32,98,101,32,100,101,102,105, - 110,101,100,32,111,114,32,99,111,117,108,100,32,98,101,32, - 115,101,116,32,116,111,32,78,111,110,101,10,32,32,32,32, - 116,111,32,114,101,112,114,101,115,101,110,116,32,116,104,97, - 116,32,105,116,115,32,112,114,111,112,101,114,32,118,97,108, - 117,101,32,105,115,32,117,110,107,110,111,119,110,46,10,10, - 32,32,32,32,114,144,0,0,0,114,104,0,0,0,78,122, - 32,95,95,112,97,99,107,97,103,101,95,95,32,33,61,32, - 95,95,115,112,101,99,95,95,46,112,97,114,101,110,116,32, - 40,122,4,32,33,61,32,250,1,41,233,3,0,0,0,41, - 1,90,10,115,116,97,99,107,108,101,118,101,108,122,89,99, - 97,110,39,116,32,114,101,115,111,108,118,101,32,112,97,99, - 107,97,103,101,32,102,114,111,109,32,95,95,115,112,101,99, - 95,95,32,111,114,32,95,95,112,97,99,107,97,103,101,95, - 95,44,32,102,97,108,108,105,110,103,32,98,97,99,107,32, - 111,110,32,95,95,110,97,109,101,95,95,32,97,110,100,32, - 95,95,112,97,116,104,95,95,114,1,0,0,0,114,140,0, - 0,0,114,127,0,0,0,114,22,0,0,0,41,6,114,34, - 0,0,0,114,129,0,0,0,114,191,0,0,0,114,192,0, - 0,0,114,193,0,0,0,114,128,0,0,0,41,3,218,7, - 103,108,111,98,97,108,115,114,185,0,0,0,114,94,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,17,95,99,97,108,99,95,95,95,112,97,99,107,97,103, - 101,95,95,37,4,0,0,115,38,0,0,0,0,7,10,1, - 10,1,8,1,18,1,22,2,2,0,2,254,6,3,4,1, - 8,1,6,2,6,2,2,0,2,254,6,3,8,1,8,1, - 14,1,114,219,0,0,0,114,10,0,0,0,99,5,0,0, - 0,0,0,0,0,0,0,0,0,9,0,0,0,5,0,0, - 0,67,0,0,0,115,180,0,0,0,124,4,100,1,107,2, - 114,18,116,0,124,0,131,1,125,5,110,36,124,1,100,2, - 117,1,114,30,124,1,110,2,105,0,125,6,116,1,124,6, - 131,1,125,7,116,0,124,0,124,7,124,4,131,3,125,5, - 124,3,115,150,124,4,100,1,107,2,114,84,116,0,124,0, - 160,2,100,3,161,1,100,1,25,0,131,1,83,0,124,0, - 115,92,124,5,83,0,116,3,124,0,131,1,116,3,124,0, - 160,2,100,3,161,1,100,1,25,0,131,1,24,0,125,8, - 116,4,106,5,124,5,106,6,100,2,116,3,124,5,106,6, - 131,1,124,8,24,0,133,2,25,0,25,0,83,0,110,26, - 116,7,124,5,100,4,131,2,114,172,116,8,124,5,124,3, - 116,0,131,3,83,0,124,5,83,0,100,2,83,0,41,5, - 97,215,1,0,0,73,109,112,111,114,116,32,97,32,109,111, - 100,117,108,101,46,10,10,32,32,32,32,84,104,101,32,39, - 103,108,111,98,97,108,115,39,32,97,114,103,117,109,101,110, - 116,32,105,115,32,117,115,101,100,32,116,111,32,105,110,102, - 101,114,32,119,104,101,114,101,32,116,104,101,32,105,109,112, - 111,114,116,32,105,115,32,111,99,99,117,114,114,105,110,103, - 32,102,114,111,109,10,32,32,32,32,116,111,32,104,97,110, - 100,108,101,32,114,101,108,97,116,105,118,101,32,105,109,112, - 111,114,116,115,46,32,84,104,101,32,39,108,111,99,97,108, - 115,39,32,97,114,103,117,109,101,110,116,32,105,115,32,105, - 103,110,111,114,101,100,46,32,84,104,101,10,32,32,32,32, - 39,102,114,111,109,108,105,115,116,39,32,97,114,103,117,109, - 101,110,116,32,115,112,101,99,105,102,105,101,115,32,119,104, - 97,116,32,115,104,111,117,108,100,32,101,120,105,115,116,32, - 97,115,32,97,116,116,114,105,98,117,116,101,115,32,111,110, - 32,116,104,101,32,109,111,100,117,108,101,10,32,32,32,32, - 98,101,105,110,103,32,105,109,112,111,114,116,101,100,32,40, - 101,46,103,46,32,96,96,102,114,111,109,32,109,111,100,117, - 108,101,32,105,109,112,111,114,116,32,60,102,114,111,109,108, - 105,115,116,62,96,96,41,46,32,32,84,104,101,32,39,108, - 101,118,101,108,39,10,32,32,32,32,97,114,103,117,109,101, - 110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104, - 101,32,112,97,99,107,97,103,101,32,108,111,99,97,116,105, - 111,110,32,116,111,32,105,109,112,111,114,116,32,102,114,111, - 109,32,105,110,32,97,32,114,101,108,97,116,105,118,101,10, - 32,32,32,32,105,109,112,111,114,116,32,40,101,46,103,46, - 32,96,96,102,114,111,109,32,46,46,112,107,103,32,105,109, - 112,111,114,116,32,109,111,100,96,96,32,119,111,117,108,100, - 32,104,97,118,101,32,97,32,39,108,101,118,101,108,39,32, - 111,102,32,50,41,46,10,10,32,32,32,32,114,22,0,0, - 0,78,114,127,0,0,0,114,140,0,0,0,41,9,114,208, - 0,0,0,114,219,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,184,0,0,0,114,15,0,0,0,114,91,0, - 0,0,114,1,0,0,0,114,4,0,0,0,114,213,0,0, - 0,41,9,114,17,0,0,0,114,218,0,0,0,218,6,108, - 111,99,97,108,115,114,214,0,0,0,114,186,0,0,0,114, - 95,0,0,0,90,8,103,108,111,98,97,108,115,95,114,185, - 0,0,0,90,7,99,117,116,95,111,102,102,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,10,95,95,105, - 109,112,111,114,116,95,95,64,4,0,0,115,30,0,0,0, - 0,11,8,1,10,2,16,1,8,1,12,1,4,3,8,1, - 18,1,4,1,4,4,26,3,32,1,10,1,12,2,114,222, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,116,0,160,1,124,0,161,1,125,1,124,1,100,0,117, - 0,114,30,116,2,100,1,124,0,23,0,131,1,130,1,116, - 3,124,1,131,1,83,0,41,2,78,122,25,110,111,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,32,110, - 97,109,101,100,32,41,4,114,159,0,0,0,114,166,0,0, - 0,114,78,0,0,0,114,158,0,0,0,41,2,114,17,0, - 0,0,114,94,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,18,95,98,117,105,108,116,105,110, - 95,102,114,111,109,95,110,97,109,101,101,4,0,0,115,8, - 0,0,0,0,1,10,1,8,1,12,1,114,223,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,10,0,0, - 0,5,0,0,0,67,0,0,0,115,166,0,0,0,124,1, - 97,0,124,0,97,1,116,2,116,1,131,1,125,2,116,1, - 106,3,160,4,161,0,68,0,93,72,92,2,125,3,125,4, - 116,5,124,4,124,2,131,2,114,26,124,3,116,1,106,6, - 118,0,114,60,116,7,125,5,110,18,116,0,160,8,124,3, - 161,1,114,26,116,9,125,5,110,2,113,26,116,10,124,4, - 124,5,131,2,125,6,116,11,124,6,124,4,131,2,1,0, - 113,26,116,1,106,3,116,12,25,0,125,7,100,1,68,0, - 93,46,125,8,124,8,116,1,106,3,118,1,114,138,116,13, - 124,8,131,1,125,9,110,10,116,1,106,3,124,8,25,0, - 125,9,116,14,124,7,124,8,124,9,131,3,1,0,113,114, - 100,2,83,0,41,3,122,250,83,101,116,117,112,32,105,109, - 112,111,114,116,108,105,98,32,98,121,32,105,109,112,111,114, - 116,105,110,103,32,110,101,101,100,101,100,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,115,32,97,110,100, - 32,105,110,106,101,99,116,105,110,103,32,116,104,101,109,10, - 32,32,32,32,105,110,116,111,32,116,104,101,32,103,108,111, - 98,97,108,32,110,97,109,101,115,112,97,99,101,46,10,10, - 32,32,32,32,65,115,32,115,121,115,32,105,115,32,110,101, - 101,100,101,100,32,102,111,114,32,115,121,115,46,109,111,100, - 117,108,101,115,32,97,99,99,101,115,115,32,97,110,100,32, - 95,105,109,112,32,105,115,32,110,101,101,100,101,100,32,116, - 111,32,108,111,97,100,32,98,117,105,108,116,45,105,110,10, - 32,32,32,32,109,111,100,117,108,101,115,44,32,116,104,111, - 115,101,32,116,119,111,32,109,111,100,117,108,101,115,32,109, - 117,115,116,32,98,101,32,101,120,112,108,105,99,105,116,108, - 121,32,112,97,115,115,101,100,32,105,110,46,10,10,32,32, - 32,32,41,3,114,23,0,0,0,114,191,0,0,0,114,63, - 0,0,0,78,41,15,114,56,0,0,0,114,15,0,0,0, - 114,14,0,0,0,114,91,0,0,0,218,5,105,116,101,109, - 115,114,195,0,0,0,114,77,0,0,0,114,159,0,0,0, - 114,87,0,0,0,114,173,0,0,0,114,141,0,0,0,114, - 147,0,0,0,114,1,0,0,0,114,223,0,0,0,114,5, - 0,0,0,41,10,218,10,115,121,115,95,109,111,100,117,108, - 101,218,11,95,105,109,112,95,109,111,100,117,108,101,90,11, - 109,111,100,117,108,101,95,116,121,112,101,114,17,0,0,0, - 114,95,0,0,0,114,108,0,0,0,114,94,0,0,0,90, - 11,115,101,108,102,95,109,111,100,117,108,101,90,12,98,117, - 105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108, - 116,105,110,95,109,111,100,117,108,101,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,6,95,115,101,116,117, - 112,108,4,0,0,115,36,0,0,0,0,9,4,1,4,3, - 8,1,18,1,10,1,10,1,6,1,10,1,6,2,2,1, - 10,1,12,3,10,1,8,1,10,1,10,2,10,1,114,227, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, - 0,116,0,124,0,124,1,131,2,1,0,116,1,106,2,160, - 3,116,4,161,1,1,0,116,1,106,2,160,3,116,5,161, - 1,1,0,100,1,83,0,41,2,122,48,73,110,115,116,97, - 108,108,32,105,109,112,111,114,116,101,114,115,32,102,111,114, - 32,98,117,105,108,116,105,110,32,97,110,100,32,102,114,111, - 122,101,110,32,109,111,100,117,108,101,115,78,41,6,114,227, - 0,0,0,114,15,0,0,0,114,190,0,0,0,114,118,0, - 0,0,114,159,0,0,0,114,173,0,0,0,41,2,114,225, - 0,0,0,114,226,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,8,95,105,110,115,116,97,108, - 108,143,4,0,0,115,6,0,0,0,0,2,10,2,12,1, - 114,228,0,0,0,99,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,32, - 0,0,0,100,1,100,2,108,0,125,0,124,0,97,1,124, - 0,160,2,116,3,106,4,116,5,25,0,161,1,1,0,100, - 2,83,0,41,3,122,57,73,110,115,116,97,108,108,32,105, - 109,112,111,114,116,101,114,115,32,116,104,97,116,32,114,101, - 113,117,105,114,101,32,101,120,116,101,114,110,97,108,32,102, - 105,108,101,115,121,115,116,101,109,32,97,99,99,101,115,115, - 114,22,0,0,0,78,41,6,218,26,95,102,114,111,122,101, - 110,95,105,109,112,111,114,116,108,105,98,95,101,120,116,101, - 114,110,97,108,114,125,0,0,0,114,228,0,0,0,114,15, - 0,0,0,114,91,0,0,0,114,1,0,0,0,41,1,114, - 229,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,27,95,105,110,115,116,97,108,108,95,101,120, - 116,101,114,110,97,108,95,105,109,112,111,114,116,101,114,115, - 151,4,0,0,115,6,0,0,0,0,3,8,1,4,1,114, - 230,0,0,0,41,2,78,78,41,1,78,41,2,78,114,22, - 0,0,0,41,4,78,78,114,10,0,0,0,114,22,0,0, - 0,41,50,114,3,0,0,0,114,125,0,0,0,114,12,0, - 0,0,114,18,0,0,0,114,58,0,0,0,114,33,0,0, - 0,114,42,0,0,0,114,19,0,0,0,114,20,0,0,0, - 114,48,0,0,0,114,49,0,0,0,114,52,0,0,0,114, - 64,0,0,0,114,66,0,0,0,114,75,0,0,0,114,85, - 0,0,0,114,89,0,0,0,114,96,0,0,0,114,110,0, - 0,0,114,111,0,0,0,114,90,0,0,0,114,141,0,0, - 0,114,147,0,0,0,114,151,0,0,0,114,106,0,0,0, - 114,92,0,0,0,114,157,0,0,0,114,158,0,0,0,114, - 93,0,0,0,114,159,0,0,0,114,173,0,0,0,114,178, - 0,0,0,114,187,0,0,0,114,189,0,0,0,114,194,0, - 0,0,114,200,0,0,0,90,15,95,69,82,82,95,77,83, - 71,95,80,82,69,70,73,88,114,202,0,0,0,114,205,0, - 0,0,218,6,111,98,106,101,99,116,114,206,0,0,0,114, - 207,0,0,0,114,208,0,0,0,114,213,0,0,0,114,219, - 0,0,0,114,222,0,0,0,114,223,0,0,0,114,227,0, - 0,0,114,228,0,0,0,114,230,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,94, - 0,0,0,4,24,4,2,8,8,8,8,4,2,4,3,16, - 4,14,68,14,21,14,16,8,37,8,17,8,11,14,8,8, - 11,8,12,8,16,8,36,14,101,16,26,10,45,14,72,8, - 17,8,17,8,30,8,37,8,42,8,15,14,75,14,79,14, - 13,8,9,8,9,10,47,8,16,4,1,8,2,8,32,6, - 3,8,16,10,15,14,37,8,27,10,37,8,7,8,35,8, - 8, + 114,11,0,0,0,114,154,0,0,0,63,3,0,0,115,2, + 0,0,0,0,7,122,26,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,46,108,111,97,100,95,109,111,100,117,108, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,67,0,0,0,115,10,0,0,0,116, + 0,160,1,124,1,161,1,83,0,41,1,122,45,82,101,116, + 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, + 101,99,116,32,102,111,114,32,116,104,101,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,46,41,2,114,56,0,0, + 0,114,175,0,0,0,114,168,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,169,0,0,0,72, + 3,0,0,115,2,0,0,0,0,4,122,23,70,114,111,122, + 101,110,73,109,112,111,114,116,101,114,46,103,101,116,95,99, + 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,54,82,101,116,117,114,110,32, + 78,111,110,101,32,97,115,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,115,32,100,111,32,110,111,116,32,104,97, + 118,101,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,10,0,0,0,114,168,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,170,0,0,0,78,3, + 0,0,115,2,0,0,0,0,4,122,25,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,103,101,116,95,115,111, + 117,114,99,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,10,0, + 0,0,116,0,160,1,124,1,161,1,83,0,41,1,122,46, + 82,101,116,117,114,110,32,84,114,117,101,32,105,102,32,116, + 104,101,32,102,114,111,122,101,110,32,109,111,100,117,108,101, + 32,105,115,32,97,32,112,97,99,107,97,103,101,46,41,2, + 114,56,0,0,0,90,17,105,115,95,102,114,111,122,101,110, + 95,112,97,99,107,97,103,101,114,168,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,114,0,0, + 0,84,3,0,0,115,2,0,0,0,0,4,122,25,70,114, + 111,122,101,110,73,109,112,111,114,116,101,114,46,105,115,95, + 112,97,99,107,97,103,101,41,2,78,78,41,1,78,41,17, + 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, + 3,0,0,0,114,137,0,0,0,114,171,0,0,0,114,98, + 0,0,0,114,172,0,0,0,114,166,0,0,0,114,167,0, + 0,0,114,148,0,0,0,114,149,0,0,0,114,154,0,0, + 0,114,89,0,0,0,114,169,0,0,0,114,170,0,0,0, + 114,114,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,173,0,0,0,14,3, + 0,0,115,46,0,0,0,8,2,4,7,4,2,2,1,10, + 8,2,1,12,6,2,1,12,8,2,1,10,3,2,1,10, + 8,2,1,10,8,2,1,2,1,12,4,2,1,2,1,12, + 4,2,1,2,1,114,173,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, + 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,100,6,83,0,41,7,218,18,95,73,109,112, + 111,114,116,76,111,99,107,67,111,110,116,101,120,116,122,36, + 67,111,110,116,101,120,116,32,109,97,110,97,103,101,114,32, + 102,111,114,32,116,104,101,32,105,109,112,111,114,116,32,108, + 111,99,107,46,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,2,0,0,0,67,0,0,0,115,12,0, + 0,0,116,0,160,1,161,0,1,0,100,1,83,0,41,2, + 122,24,65,99,113,117,105,114,101,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,78,41,2,114,56,0, + 0,0,114,57,0,0,0,114,46,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,53,0,0,0, + 97,3,0,0,115,2,0,0,0,0,2,122,28,95,73,109, + 112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,46, + 95,95,101,110,116,101,114,95,95,99,4,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,2,0,0,0,67,0, + 0,0,115,12,0,0,0,116,0,160,1,161,0,1,0,100, + 1,83,0,41,2,122,60,82,101,108,101,97,115,101,32,116, + 104,101,32,105,109,112,111,114,116,32,108,111,99,107,32,114, + 101,103,97,114,100,108,101,115,115,32,111,102,32,97,110,121, + 32,114,97,105,115,101,100,32,101,120,99,101,112,116,105,111, + 110,115,46,78,41,2,114,56,0,0,0,114,59,0,0,0, + 41,4,114,30,0,0,0,218,8,101,120,99,95,116,121,112, + 101,218,9,101,120,99,95,118,97,108,117,101,218,13,101,120, + 99,95,116,114,97,99,101,98,97,99,107,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,55,0,0,0,101, + 3,0,0,115,2,0,0,0,0,2,122,27,95,73,109,112, + 111,114,116,76,111,99,107,67,111,110,116,101,120,116,46,95, + 95,101,120,105,116,95,95,78,41,6,114,1,0,0,0,114, + 0,0,0,0,114,2,0,0,0,114,3,0,0,0,114,53, + 0,0,0,114,55,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,178,0,0, + 0,93,3,0,0,115,6,0,0,0,8,2,4,2,8,4, + 114,178,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,64, + 0,0,0,124,1,160,0,100,1,124,2,100,2,24,0,161, + 2,125,3,116,1,124,3,131,1,124,2,107,0,114,36,116, + 2,100,3,131,1,130,1,124,3,100,4,25,0,125,4,124, + 0,114,60,100,5,160,3,124,4,124,0,161,2,83,0,124, + 4,83,0,41,6,122,50,82,101,115,111,108,118,101,32,97, + 32,114,101,108,97,116,105,118,101,32,109,111,100,117,108,101, + 32,110,97,109,101,32,116,111,32,97,110,32,97,98,115,111, + 108,117,116,101,32,111,110,101,46,114,127,0,0,0,114,37, + 0,0,0,122,50,97,116,116,101,109,112,116,101,100,32,114, + 101,108,97,116,105,118,101,32,105,109,112,111,114,116,32,98, + 101,121,111,110,100,32,116,111,112,45,108,101,118,101,108,32, + 112,97,99,107,97,103,101,114,22,0,0,0,250,5,123,125, + 46,123,125,41,4,218,6,114,115,112,108,105,116,218,3,108, + 101,110,114,78,0,0,0,114,44,0,0,0,41,5,114,17, + 0,0,0,218,7,112,97,99,107,97,103,101,218,5,108,101, + 118,101,108,90,4,98,105,116,115,90,4,98,97,115,101,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,13, + 95,114,101,115,111,108,118,101,95,110,97,109,101,106,3,0, + 0,115,10,0,0,0,0,2,16,1,12,1,8,1,8,1, + 114,187,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,34, + 0,0,0,124,0,160,0,124,1,124,2,161,2,125,3,124, + 3,100,0,117,0,114,24,100,0,83,0,116,1,124,1,124, + 3,131,2,83,0,114,13,0,0,0,41,2,114,167,0,0, + 0,114,90,0,0,0,41,4,218,6,102,105,110,100,101,114, + 114,17,0,0,0,114,164,0,0,0,114,108,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,17, + 95,102,105,110,100,95,115,112,101,99,95,108,101,103,97,99, + 121,115,3,0,0,115,8,0,0,0,0,3,12,1,8,1, + 4,1,114,189,0,0,0,99,3,0,0,0,0,0,0,0, + 0,0,0,0,10,0,0,0,10,0,0,0,67,0,0,0, + 115,32,1,0,0,116,0,106,1,125,3,124,3,100,1,117, + 0,114,22,116,2,100,2,131,1,130,1,124,3,115,38,116, + 3,160,4,100,3,116,5,161,2,1,0,124,0,116,0,106, + 6,118,0,125,4,124,3,68,0,93,230,125,5,116,7,131, + 0,143,94,1,0,122,10,124,5,106,8,125,6,87,0,110, + 54,4,0,116,9,121,128,1,0,1,0,1,0,116,10,124, + 5,124,0,124,1,131,3,125,7,124,7,100,1,117,0,114, + 124,89,0,87,0,100,1,4,0,4,0,131,3,1,0,113, + 52,89,0,110,14,48,0,124,6,124,0,124,1,124,2,131, + 3,125,7,87,0,100,1,4,0,4,0,131,3,1,0,110, + 16,49,0,115,162,48,0,1,0,1,0,1,0,89,0,1, + 0,124,7,100,1,117,1,114,52,124,4,144,1,115,18,124, + 0,116,0,106,6,118,0,144,1,114,18,116,0,106,6,124, + 0,25,0,125,8,122,10,124,8,106,11,125,9,87,0,110, + 26,4,0,116,9,121,244,1,0,1,0,1,0,124,7,6, + 0,89,0,2,0,1,0,83,0,48,0,124,9,100,1,117, + 0,144,1,114,8,124,7,2,0,1,0,83,0,124,9,2, + 0,1,0,83,0,113,52,124,7,2,0,1,0,83,0,113, + 52,100,1,83,0,41,4,122,21,70,105,110,100,32,97,32, + 109,111,100,117,108,101,39,115,32,115,112,101,99,46,78,122, + 53,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,78,111,110,101,44,32,80,121,116,104,111,110,32,105, + 115,32,108,105,107,101,108,121,32,115,104,117,116,116,105,110, + 103,32,100,111,119,110,122,22,115,121,115,46,109,101,116,97, + 95,112,97,116,104,32,105,115,32,101,109,112,116,121,41,12, + 114,15,0,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,78,0,0,0,218,9,95,119,97,114,110,105,110,103,115, + 218,4,119,97,114,110,218,13,73,109,112,111,114,116,87,97, + 114,110,105,110,103,114,91,0,0,0,114,178,0,0,0,114, + 166,0,0,0,114,105,0,0,0,114,189,0,0,0,114,104, + 0,0,0,41,10,114,17,0,0,0,114,164,0,0,0,114, + 165,0,0,0,114,190,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,188,0,0,0,114,166,0,0,0,114,94, + 0,0,0,114,95,0,0,0,114,104,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,10,95,102, + 105,110,100,95,115,112,101,99,124,3,0,0,115,54,0,0, + 0,0,2,6,1,8,2,8,3,4,1,12,5,10,1,8, + 1,8,1,2,1,10,1,12,1,12,1,8,1,22,2,42, + 1,8,2,18,1,10,1,2,1,10,1,12,4,14,2,10, + 1,8,2,10,2,10,2,114,194,0,0,0,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,108,0,0,0,116,0,124,0,116,1, + 131,2,115,28,116,2,100,1,160,3,116,4,124,0,131,1, + 161,1,131,1,130,1,124,2,100,2,107,0,114,44,116,5, + 100,3,131,1,130,1,124,2,100,2,107,4,114,84,116,0, + 124,1,116,1,131,2,115,72,116,2,100,4,131,1,130,1, + 110,12,124,1,115,84,116,6,100,5,131,1,130,1,124,0, + 115,104,124,2,100,2,107,2,114,104,116,5,100,6,131,1, + 130,1,100,7,83,0,41,8,122,28,86,101,114,105,102,121, + 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34, + 115,97,110,101,34,46,122,31,109,111,100,117,108,101,32,110, + 97,109,101,32,109,117,115,116,32,98,101,32,115,116,114,44, + 32,110,111,116,32,123,125,114,22,0,0,0,122,18,108,101, + 118,101,108,32,109,117,115,116,32,98,101,32,62,61,32,48, + 122,31,95,95,112,97,99,107,97,103,101,95,95,32,110,111, + 116,32,115,101,116,32,116,111,32,97,32,115,116,114,105,110, + 103,122,54,97,116,116,101,109,112,116,101,100,32,114,101,108, + 97,116,105,118,101,32,105,109,112,111,114,116,32,119,105,116, + 104,32,110,111,32,107,110,111,119,110,32,112,97,114,101,110, + 116,32,112,97,99,107,97,103,101,122,17,69,109,112,116,121, + 32,109,111,100,117,108,101,32,110,97,109,101,78,41,7,218, + 10,105,115,105,110,115,116,97,110,99,101,218,3,115,116,114, + 218,9,84,121,112,101,69,114,114,111,114,114,44,0,0,0, + 114,14,0,0,0,218,10,86,97,108,117,101,69,114,114,111, + 114,114,78,0,0,0,169,3,114,17,0,0,0,114,185,0, + 0,0,114,186,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,13,95,115,97,110,105,116,121,95, + 99,104,101,99,107,171,3,0,0,115,22,0,0,0,0,2, + 10,1,18,1,8,1,8,1,8,1,10,1,10,1,4,1, + 8,2,12,1,114,200,0,0,0,122,16,78,111,32,109,111, + 100,117,108,101,32,110,97,109,101,100,32,122,4,123,33,114, + 125,99,2,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,8,0,0,0,67,0,0,0,115,22,1,0,0,100, + 0,125,2,124,0,160,0,100,1,161,1,100,2,25,0,125, + 3,124,3,114,132,124,3,116,1,106,2,118,1,114,42,116, + 3,124,1,124,3,131,2,1,0,124,0,116,1,106,2,118, + 0,114,62,116,1,106,2,124,0,25,0,83,0,116,1,106, + 2,124,3,25,0,125,4,122,10,124,4,106,4,125,2,87, + 0,110,48,4,0,116,5,121,130,1,0,1,0,1,0,116, + 6,100,3,23,0,160,7,124,0,124,3,161,2,125,5,116, + 8,124,5,124,0,100,4,141,2,100,0,130,2,89,0,110, + 2,48,0,116,9,124,0,124,2,131,2,125,6,124,6,100, + 0,117,0,114,170,116,8,116,6,160,7,124,0,161,1,124, + 0,100,4,141,2,130,1,110,8,116,10,124,6,131,1,125, + 7,124,3,144,1,114,18,116,1,106,2,124,3,25,0,125, + 4,124,0,160,0,100,1,161,1,100,5,25,0,125,8,122, + 16,116,11,124,4,124,8,124,7,131,3,1,0,87,0,110, + 48,4,0,116,5,144,1,121,16,1,0,1,0,1,0,100, + 6,124,3,155,2,100,7,124,8,155,2,157,4,125,5,116, + 12,160,13,124,5,116,14,161,2,1,0,89,0,110,2,48, + 0,124,7,83,0,41,8,78,114,127,0,0,0,114,22,0, + 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, + 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, + 233,2,0,0,0,122,27,67,97,110,110,111,116,32,115,101, + 116,32,97,110,32,97,116,116,114,105,98,117,116,101,32,111, + 110,32,122,18,32,102,111,114,32,99,104,105,108,100,32,109, + 111,100,117,108,101,32,41,15,114,128,0,0,0,114,15,0, + 0,0,114,91,0,0,0,114,66,0,0,0,114,140,0,0, + 0,114,105,0,0,0,218,8,95,69,82,82,95,77,83,71, + 114,44,0,0,0,218,19,77,111,100,117,108,101,78,111,116, + 70,111,117,110,100,69,114,114,111,114,114,194,0,0,0,114, + 158,0,0,0,114,5,0,0,0,114,191,0,0,0,114,192, + 0,0,0,114,193,0,0,0,41,9,114,17,0,0,0,218, + 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, + 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, + 101,114,156,0,0,0,114,94,0,0,0,114,95,0,0,0, + 90,5,99,104,105,108,100,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,23,95,102,105,110,100,95,97,110, + 100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,190, + 3,0,0,115,52,0,0,0,0,1,4,1,14,1,4,1, + 10,1,10,2,10,1,10,1,10,1,2,1,10,1,12,1, + 16,1,20,1,10,1,8,1,20,2,8,1,6,2,10,1, + 14,1,2,1,16,1,14,1,16,1,18,1,114,205,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,8,0,0,0,67,0,0,0,115,128,0,0,0,116, + 0,124,0,131,1,143,62,1,0,116,1,106,2,160,3,124, + 0,116,4,161,2,125,2,124,2,116,4,117,0,114,56,116, + 5,124,0,124,1,131,2,87,0,2,0,100,1,4,0,4, + 0,131,3,1,0,83,0,87,0,100,1,4,0,4,0,131, + 3,1,0,110,16,49,0,115,76,48,0,1,0,1,0,1, + 0,89,0,1,0,124,2,100,1,117,0,114,116,100,2,160, + 6,124,0,161,1,125,3,116,7,124,3,124,0,100,3,141, + 2,130,1,116,8,124,0,131,1,1,0,124,2,83,0,41, + 4,122,25,70,105,110,100,32,97,110,100,32,108,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,46,78,122,40,105, + 109,112,111,114,116,32,111,102,32,123,125,32,104,97,108,116, + 101,100,59,32,78,111,110,101,32,105,110,32,115,121,115,46, + 109,111,100,117,108,101,115,114,16,0,0,0,41,9,114,49, + 0,0,0,114,15,0,0,0,114,91,0,0,0,114,34,0, + 0,0,218,14,95,78,69,69,68,83,95,76,79,65,68,73, + 78,71,114,205,0,0,0,114,44,0,0,0,114,203,0,0, + 0,114,64,0,0,0,41,4,114,17,0,0,0,114,204,0, + 0,0,114,95,0,0,0,114,74,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,14,95,102,105, + 110,100,95,97,110,100,95,108,111,97,100,225,3,0,0,115, + 22,0,0,0,0,2,10,1,14,1,8,1,54,2,8,1, + 4,1,2,255,4,2,12,2,8,1,114,207,0,0,0,114, + 22,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,42,0, + 0,0,116,0,124,0,124,1,124,2,131,3,1,0,124,2, + 100,1,107,4,114,32,116,1,124,0,124,1,124,2,131,3, + 125,0,116,2,124,0,116,3,131,2,83,0,41,2,97,50, + 1,0,0,73,109,112,111,114,116,32,97,110,100,32,114,101, + 116,117,114,110,32,116,104,101,32,109,111,100,117,108,101,32, + 98,97,115,101,100,32,111,110,32,105,116,115,32,110,97,109, + 101,44,32,116,104,101,32,112,97,99,107,97,103,101,32,116, + 104,101,32,99,97,108,108,32,105,115,10,32,32,32,32,98, + 101,105,110,103,32,109,97,100,101,32,102,114,111,109,44,32, + 97,110,100,32,116,104,101,32,108,101,118,101,108,32,97,100, + 106,117,115,116,109,101,110,116,46,10,10,32,32,32,32,84, + 104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,112, + 114,101,115,101,110,116,115,32,116,104,101,32,103,114,101,97, + 116,101,115,116,32,99,111,109,109,111,110,32,100,101,110,111, + 109,105,110,97,116,111,114,32,111,102,32,102,117,110,99,116, + 105,111,110,97,108,105,116,121,10,32,32,32,32,98,101,116, + 119,101,101,110,32,105,109,112,111,114,116,95,109,111,100,117, + 108,101,32,97,110,100,32,95,95,105,109,112,111,114,116,95, + 95,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115, + 32,115,101,116,116,105,110,103,32,95,95,112,97,99,107,97, + 103,101,95,95,32,105,102,10,32,32,32,32,116,104,101,32, + 108,111,97,100,101,114,32,100,105,100,32,110,111,116,46,10, + 10,32,32,32,32,114,22,0,0,0,41,4,114,200,0,0, + 0,114,187,0,0,0,114,207,0,0,0,218,11,95,103,99, + 100,95,105,109,112,111,114,116,114,199,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,208,0,0, + 0,241,3,0,0,115,8,0,0,0,0,9,12,1,8,1, + 12,1,114,208,0,0,0,169,1,218,9,114,101,99,117,114, + 115,105,118,101,99,3,0,0,0,0,0,0,0,1,0,0, + 0,8,0,0,0,11,0,0,0,67,0,0,0,115,232,0, + 0,0,124,1,68,0,93,222,125,4,116,0,124,4,116,1, + 131,2,115,66,124,3,114,34,124,0,106,2,100,1,23,0, + 125,5,110,4,100,2,125,5,116,3,100,3,124,5,155,0, + 100,4,116,4,124,4,131,1,106,2,155,0,157,4,131,1, + 130,1,113,4,124,4,100,5,107,2,114,108,124,3,115,226, + 116,5,124,0,100,6,131,2,114,226,116,6,124,0,124,0, + 106,7,124,2,100,7,100,8,141,4,1,0,113,4,116,5, + 124,0,124,4,131,2,115,4,100,9,160,8,124,0,106,2, + 124,4,161,2,125,6,122,14,116,9,124,2,124,6,131,2, + 1,0,87,0,113,4,4,0,116,10,121,224,1,0,125,7, + 1,0,122,54,124,7,106,11,124,6,107,2,114,202,116,12, + 106,13,160,14,124,6,116,15,161,2,100,10,117,1,114,202, + 87,0,89,0,100,10,125,7,126,7,113,4,130,0,87,0, + 89,0,100,10,125,7,126,7,113,4,100,10,125,7,126,7, + 48,0,48,0,113,4,124,0,83,0,41,11,122,238,70,105, + 103,117,114,101,32,111,117,116,32,119,104,97,116,32,95,95, + 105,109,112,111,114,116,95,95,32,115,104,111,117,108,100,32, + 114,101,116,117,114,110,46,10,10,32,32,32,32,84,104,101, + 32,105,109,112,111,114,116,95,32,112,97,114,97,109,101,116, + 101,114,32,105,115,32,97,32,99,97,108,108,97,98,108,101, + 32,119,104,105,99,104,32,116,97,107,101,115,32,116,104,101, + 32,110,97,109,101,32,111,102,32,109,111,100,117,108,101,32, + 116,111,10,32,32,32,32,105,109,112,111,114,116,46,32,73, + 116,32,105,115,32,114,101,113,117,105,114,101,100,32,116,111, + 32,100,101,99,111,117,112,108,101,32,116,104,101,32,102,117, + 110,99,116,105,111,110,32,102,114,111,109,32,97,115,115,117, + 109,105,110,103,32,105,109,112,111,114,116,108,105,98,39,115, + 10,32,32,32,32,105,109,112,111,114,116,32,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,32,105,115,32,100,101, + 115,105,114,101,100,46,10,10,32,32,32,32,122,8,46,95, + 95,97,108,108,95,95,122,13,96,96,102,114,111,109,32,108, + 105,115,116,39,39,122,8,73,116,101,109,32,105,110,32,122, + 18,32,109,117,115,116,32,98,101,32,115,116,114,44,32,110, + 111,116,32,250,1,42,218,7,95,95,97,108,108,95,95,84, + 114,209,0,0,0,114,182,0,0,0,78,41,16,114,195,0, + 0,0,114,196,0,0,0,114,1,0,0,0,114,197,0,0, + 0,114,14,0,0,0,114,4,0,0,0,218,16,95,104,97, + 110,100,108,101,95,102,114,111,109,108,105,115,116,114,212,0, + 0,0,114,44,0,0,0,114,66,0,0,0,114,203,0,0, + 0,114,17,0,0,0,114,15,0,0,0,114,91,0,0,0, + 114,34,0,0,0,114,206,0,0,0,41,8,114,95,0,0, + 0,218,8,102,114,111,109,108,105,115,116,114,204,0,0,0, + 114,210,0,0,0,218,1,120,90,5,119,104,101,114,101,90, + 9,102,114,111,109,95,110,97,109,101,90,3,101,120,99,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,213, + 0,0,0,0,4,0,0,115,44,0,0,0,0,10,8,1, + 10,1,4,1,12,2,4,1,28,2,8,1,14,1,10,1, + 2,255,8,2,10,1,14,1,2,1,14,1,14,4,10,1, + 16,255,2,2,12,1,26,1,114,213,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,6,0, + 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, + 1,161,1,125,1,124,0,160,0,100,2,161,1,125,2,124, + 1,100,3,117,1,114,82,124,2,100,3,117,1,114,78,124, + 1,124,2,106,1,107,3,114,78,116,2,106,3,100,4,124, + 1,155,2,100,5,124,2,106,1,155,2,100,6,157,5,116, + 4,100,7,100,8,141,3,1,0,124,1,83,0,124,2,100, + 3,117,1,114,96,124,2,106,1,83,0,116,2,106,3,100, + 9,116,4,100,7,100,8,141,3,1,0,124,0,100,10,25, + 0,125,1,100,11,124,0,118,1,114,142,124,1,160,5,100, + 12,161,1,100,13,25,0,125,1,124,1,83,0,41,14,122, + 167,67,97,108,99,117,108,97,116,101,32,119,104,97,116,32, + 95,95,112,97,99,107,97,103,101,95,95,32,115,104,111,117, + 108,100,32,98,101,46,10,10,32,32,32,32,95,95,112,97, + 99,107,97,103,101,95,95,32,105,115,32,110,111,116,32,103, + 117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32, + 100,101,102,105,110,101,100,32,111,114,32,99,111,117,108,100, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,10, + 32,32,32,32,116,111,32,114,101,112,114,101,115,101,110,116, + 32,116,104,97,116,32,105,116,115,32,112,114,111,112,101,114, + 32,118,97,108,117,101,32,105,115,32,117,110,107,110,111,119, + 110,46,10,10,32,32,32,32,114,144,0,0,0,114,104,0, + 0,0,78,122,32,95,95,112,97,99,107,97,103,101,95,95, + 32,33,61,32,95,95,115,112,101,99,95,95,46,112,97,114, + 101,110,116,32,40,122,4,32,33,61,32,250,1,41,233,3, + 0,0,0,41,1,90,10,115,116,97,99,107,108,101,118,101, + 108,122,89,99,97,110,39,116,32,114,101,115,111,108,118,101, + 32,112,97,99,107,97,103,101,32,102,114,111,109,32,95,95, + 115,112,101,99,95,95,32,111,114,32,95,95,112,97,99,107, + 97,103,101,95,95,44,32,102,97,108,108,105,110,103,32,98, + 97,99,107,32,111,110,32,95,95,110,97,109,101,95,95,32, + 97,110,100,32,95,95,112,97,116,104,95,95,114,1,0,0, + 0,114,140,0,0,0,114,127,0,0,0,114,22,0,0,0, + 41,6,114,34,0,0,0,114,129,0,0,0,114,191,0,0, + 0,114,192,0,0,0,114,193,0,0,0,114,128,0,0,0, + 41,3,218,7,103,108,111,98,97,108,115,114,185,0,0,0, + 114,94,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,17,95,99,97,108,99,95,95,95,112,97, + 99,107,97,103,101,95,95,37,4,0,0,115,38,0,0,0, + 0,7,10,1,10,1,8,1,18,1,22,2,2,0,2,254, + 6,3,4,1,8,1,6,2,6,2,2,0,2,254,6,3, + 8,1,8,1,14,1,114,219,0,0,0,114,10,0,0,0, + 99,5,0,0,0,0,0,0,0,0,0,0,0,9,0,0, + 0,5,0,0,0,67,0,0,0,115,180,0,0,0,124,4, + 100,1,107,2,114,18,116,0,124,0,131,1,125,5,110,36, + 124,1,100,2,117,1,114,30,124,1,110,2,105,0,125,6, + 116,1,124,6,131,1,125,7,116,0,124,0,124,7,124,4, + 131,3,125,5,124,3,115,150,124,4,100,1,107,2,114,84, + 116,0,124,0,160,2,100,3,161,1,100,1,25,0,131,1, + 83,0,124,0,115,92,124,5,83,0,116,3,124,0,131,1, + 116,3,124,0,160,2,100,3,161,1,100,1,25,0,131,1, + 24,0,125,8,116,4,106,5,124,5,106,6,100,2,116,3, + 124,5,106,6,131,1,124,8,24,0,133,2,25,0,25,0, + 83,0,110,26,116,7,124,5,100,4,131,2,114,172,116,8, + 124,5,124,3,116,0,131,3,83,0,124,5,83,0,100,2, + 83,0,41,5,97,215,1,0,0,73,109,112,111,114,116,32, + 97,32,109,111,100,117,108,101,46,10,10,32,32,32,32,84, + 104,101,32,39,103,108,111,98,97,108,115,39,32,97,114,103, + 117,109,101,110,116,32,105,115,32,117,115,101,100,32,116,111, + 32,105,110,102,101,114,32,119,104,101,114,101,32,116,104,101, + 32,105,109,112,111,114,116,32,105,115,32,111,99,99,117,114, + 114,105,110,103,32,102,114,111,109,10,32,32,32,32,116,111, + 32,104,97,110,100,108,101,32,114,101,108,97,116,105,118,101, + 32,105,109,112,111,114,116,115,46,32,84,104,101,32,39,108, + 111,99,97,108,115,39,32,97,114,103,117,109,101,110,116,32, + 105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,10, + 32,32,32,32,39,102,114,111,109,108,105,115,116,39,32,97, + 114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101, + 115,32,119,104,97,116,32,115,104,111,117,108,100,32,101,120, + 105,115,116,32,97,115,32,97,116,116,114,105,98,117,116,101, + 115,32,111,110,32,116,104,101,32,109,111,100,117,108,101,10, + 32,32,32,32,98,101,105,110,103,32,105,109,112,111,114,116, + 101,100,32,40,101,46,103,46,32,96,96,102,114,111,109,32, + 109,111,100,117,108,101,32,105,109,112,111,114,116,32,60,102, + 114,111,109,108,105,115,116,62,96,96,41,46,32,32,84,104, + 101,32,39,108,101,118,101,108,39,10,32,32,32,32,97,114, + 103,117,109,101,110,116,32,114,101,112,114,101,115,101,110,116, + 115,32,116,104,101,32,112,97,99,107,97,103,101,32,108,111, + 99,97,116,105,111,110,32,116,111,32,105,109,112,111,114,116, + 32,102,114,111,109,32,105,110,32,97,32,114,101,108,97,116, + 105,118,101,10,32,32,32,32,105,109,112,111,114,116,32,40, + 101,46,103,46,32,96,96,102,114,111,109,32,46,46,112,107, + 103,32,105,109,112,111,114,116,32,109,111,100,96,96,32,119, + 111,117,108,100,32,104,97,118,101,32,97,32,39,108,101,118, + 101,108,39,32,111,102,32,50,41,46,10,10,32,32,32,32, + 114,22,0,0,0,78,114,127,0,0,0,114,140,0,0,0, + 41,9,114,208,0,0,0,114,219,0,0,0,218,9,112,97, + 114,116,105,116,105,111,110,114,184,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,1,0,0,0,114,4,0,0,0, + 114,213,0,0,0,41,9,114,17,0,0,0,114,218,0,0, + 0,218,6,108,111,99,97,108,115,114,214,0,0,0,114,186, + 0,0,0,114,95,0,0,0,90,8,103,108,111,98,97,108, + 115,95,114,185,0,0,0,90,7,99,117,116,95,111,102,102, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 10,95,95,105,109,112,111,114,116,95,95,64,4,0,0,115, + 30,0,0,0,0,11,8,1,10,2,16,1,8,1,12,1, + 4,3,8,1,18,1,4,1,4,4,26,3,32,1,10,1, + 12,2,114,222,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,38,0,0,0,116,0,160,1,124,0,161,1,125,1,124, + 1,100,0,117,0,114,30,116,2,100,1,124,0,23,0,131, + 1,130,1,116,3,124,1,131,1,83,0,41,2,78,122,25, + 110,111,32,98,117,105,108,116,45,105,110,32,109,111,100,117, + 108,101,32,110,97,109,101,100,32,41,4,114,159,0,0,0, + 114,166,0,0,0,114,78,0,0,0,114,158,0,0,0,41, + 2,114,17,0,0,0,114,94,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,18,95,98,117,105, + 108,116,105,110,95,102,114,111,109,95,110,97,109,101,101,4, + 0,0,115,8,0,0,0,0,1,10,1,8,1,12,1,114, + 223,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,5,0,0,0,67,0,0,0,115,166,0, + 0,0,124,1,97,0,124,0,97,1,116,2,116,1,131,1, + 125,2,116,1,106,3,160,4,161,0,68,0,93,72,92,2, + 125,3,125,4,116,5,124,4,124,2,131,2,114,26,124,3, + 116,1,106,6,118,0,114,60,116,7,125,5,110,18,116,0, + 160,8,124,3,161,1,114,26,116,9,125,5,110,2,113,26, + 116,10,124,4,124,5,131,2,125,6,116,11,124,6,124,4, + 131,2,1,0,113,26,116,1,106,3,116,12,25,0,125,7, + 100,1,68,0,93,46,125,8,124,8,116,1,106,3,118,1, + 114,138,116,13,124,8,131,1,125,9,110,10,116,1,106,3, + 124,8,25,0,125,9,116,14,124,7,124,8,124,9,131,3, + 1,0,113,114,100,2,83,0,41,3,122,250,83,101,116,117, + 112,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105, + 109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,97,110,100,32,105,110,106,101,99,116,105,110,103,32,116, + 104,101,109,10,32,32,32,32,105,110,116,111,32,116,104,101, + 32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99, + 101,46,10,10,32,32,32,32,65,115,32,115,121,115,32,105, + 115,32,110,101,101,100,101,100,32,102,111,114,32,115,121,115, + 46,109,111,100,117,108,101,115,32,97,99,99,101,115,115,32, + 97,110,100,32,95,105,109,112,32,105,115,32,110,101,101,100, + 101,100,32,116,111,32,108,111,97,100,32,98,117,105,108,116, + 45,105,110,10,32,32,32,32,109,111,100,117,108,101,115,44, + 32,116,104,111,115,101,32,116,119,111,32,109,111,100,117,108, + 101,115,32,109,117,115,116,32,98,101,32,101,120,112,108,105, + 99,105,116,108,121,32,112,97,115,115,101,100,32,105,110,46, + 10,10,32,32,32,32,41,3,114,23,0,0,0,114,191,0, + 0,0,114,63,0,0,0,78,41,15,114,56,0,0,0,114, + 15,0,0,0,114,14,0,0,0,114,91,0,0,0,218,5, + 105,116,101,109,115,114,195,0,0,0,114,77,0,0,0,114, + 159,0,0,0,114,87,0,0,0,114,173,0,0,0,114,141, + 0,0,0,114,147,0,0,0,114,1,0,0,0,114,223,0, + 0,0,114,5,0,0,0,41,10,218,10,115,121,115,95,109, + 111,100,117,108,101,218,11,95,105,109,112,95,109,111,100,117, + 108,101,90,11,109,111,100,117,108,101,95,116,121,112,101,114, + 17,0,0,0,114,95,0,0,0,114,108,0,0,0,114,94, + 0,0,0,90,11,115,101,108,102,95,109,111,100,117,108,101, + 90,12,98,117,105,108,116,105,110,95,110,97,109,101,90,14, + 98,117,105,108,116,105,110,95,109,111,100,117,108,101,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,95, + 115,101,116,117,112,108,4,0,0,115,36,0,0,0,0,9, + 4,1,4,3,8,1,18,1,10,1,10,1,6,1,10,1, + 6,2,2,1,10,1,12,3,10,1,8,1,10,1,10,2, + 10,1,114,227,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,38,0,0,0,116,0,124,0,124,1,131,2,1,0,116, + 1,106,2,160,3,116,4,161,1,1,0,116,1,106,2,160, + 3,116,5,161,1,1,0,100,1,83,0,41,2,122,48,73, + 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, + 32,102,111,114,32,98,117,105,108,116,105,110,32,97,110,100, + 32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,78, + 41,6,114,227,0,0,0,114,15,0,0,0,114,190,0,0, + 0,114,118,0,0,0,114,159,0,0,0,114,173,0,0,0, + 41,2,114,225,0,0,0,114,226,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,8,95,105,110, + 115,116,97,108,108,143,4,0,0,115,6,0,0,0,0,2, + 10,2,12,1,114,228,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, + 0,0,115,32,0,0,0,100,1,100,2,108,0,125,0,124, + 0,97,1,124,0,160,2,116,3,106,4,116,5,25,0,161, + 1,1,0,100,2,83,0,41,3,122,57,73,110,115,116,97, + 108,108,32,105,109,112,111,114,116,101,114,115,32,116,104,97, + 116,32,114,101,113,117,105,114,101,32,101,120,116,101,114,110, + 97,108,32,102,105,108,101,115,121,115,116,101,109,32,97,99, + 99,101,115,115,114,22,0,0,0,78,41,6,218,26,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, + 101,120,116,101,114,110,97,108,114,125,0,0,0,114,228,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,1,0,0, + 0,41,1,114,229,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,27,95,105,110,115,116,97,108, + 108,95,101,120,116,101,114,110,97,108,95,105,109,112,111,114, + 116,101,114,115,151,4,0,0,115,6,0,0,0,0,3,8, + 1,4,1,114,230,0,0,0,41,2,78,78,41,1,78,41, + 2,78,114,22,0,0,0,41,4,78,78,114,10,0,0,0, + 114,22,0,0,0,41,50,114,3,0,0,0,114,125,0,0, + 0,114,12,0,0,0,114,18,0,0,0,114,58,0,0,0, + 114,33,0,0,0,114,42,0,0,0,114,19,0,0,0,114, + 20,0,0,0,114,48,0,0,0,114,49,0,0,0,114,52, + 0,0,0,114,64,0,0,0,114,66,0,0,0,114,75,0, + 0,0,114,85,0,0,0,114,89,0,0,0,114,96,0,0, + 0,114,110,0,0,0,114,111,0,0,0,114,90,0,0,0, + 114,141,0,0,0,114,147,0,0,0,114,151,0,0,0,114, + 106,0,0,0,114,92,0,0,0,114,157,0,0,0,114,158, + 0,0,0,114,93,0,0,0,114,159,0,0,0,114,173,0, + 0,0,114,178,0,0,0,114,187,0,0,0,114,189,0,0, + 0,114,194,0,0,0,114,200,0,0,0,90,15,95,69,82, + 82,95,77,83,71,95,80,82,69,70,73,88,114,202,0,0, + 0,114,205,0,0,0,218,6,111,98,106,101,99,116,114,206, + 0,0,0,114,207,0,0,0,114,208,0,0,0,114,213,0, + 0,0,114,219,0,0,0,114,222,0,0,0,114,223,0,0, + 0,114,227,0,0,0,114,228,0,0,0,114,230,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, + 0,0,115,94,0,0,0,4,24,4,2,8,8,8,8,4, + 2,4,3,16,4,14,68,14,21,14,16,8,37,8,17,8, + 11,14,8,8,11,8,12,8,16,8,36,14,101,16,26,10, + 45,14,72,8,17,8,17,8,30,8,37,8,42,8,15,14, + 75,14,79,14,13,8,9,8,9,10,47,8,16,4,1,8, + 2,8,32,6,3,8,16,10,15,14,37,8,27,10,37,8, + 7,8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index e8e99da093d13..d67c2a8fee4ea 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -278,7 +278,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,111,109,105,99,120,0,0,0,115,30,0,0,0,0,5, 16,1,6,1,16,0,6,255,4,2,2,3,14,1,40,1, 16,1,12,1,2,1,14,1,12,1,6,1,114,68,0,0, - 0,105,96,13,0,0,114,27,0,0,0,114,16,0,0,0, + 0,105,97,13,0,0,114,27,0,0,0,114,16,0,0,0, 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, 4,46,112,121,99,78,41,1,218,12,111,112,116,105,109,105, @@ -392,7 +392,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,102,105,108,101,110,97,109,101,218,8,102,105,108,101, 110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6, 0,0,0,218,17,99,97,99,104,101,95,102,114,111,109,95, - 115,111,117,114,99,101,44,1,0,0,115,72,0,0,0,0, + 115,111,117,114,99,101,45,1,0,0,115,72,0,0,0,0, 18,8,1,6,1,2,255,4,2,8,1,4,1,8,1,12, 1,10,1,12,1,16,1,8,1,8,1,8,1,24,1,8, 1,12,1,6,2,8,1,8,1,8,1,8,1,14,1,14, @@ -473,7 +473,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,108,101,118,101,108,90,13,98,97,115,101,95,102,105,108, 101,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, 6,0,0,0,218,17,115,111,117,114,99,101,95,102,114,111, - 109,95,99,97,99,104,101,115,1,0,0,115,52,0,0,0, + 109,95,99,97,99,104,101,116,1,0,0,115,52,0,0,0, 0,9,12,1,8,1,10,1,12,1,4,1,10,1,12,1, 14,1,16,1,4,1,4,1,12,1,8,1,18,2,10,1, 8,1,16,1,10,1,16,1,10,1,14,2,16,1,10,1, @@ -508,7 +508,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,120,116,101,110,115,105,111,110,218,11,115,111,117,114,99, 101,95,112,97,116,104,114,3,0,0,0,114,3,0,0,0, 114,6,0,0,0,218,15,95,103,101,116,95,115,111,117,114, - 99,101,102,105,108,101,155,1,0,0,115,20,0,0,0,0, + 99,101,102,105,108,101,156,1,0,0,115,20,0,0,0,0, 7,12,1,4,1,16,1,24,1,4,1,2,1,12,1,16, 1,18,1,114,108,0,0,0,99,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,8,0,0,0,67,0,0, @@ -521,7 +521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,112,108,101,114,101,0,0,0,114,97,0,0,0,114,81, 0,0,0,114,88,0,0,0,41,1,114,96,0,0,0,114, 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, - 95,103,101,116,95,99,97,99,104,101,100,174,1,0,0,115, + 95,103,101,116,95,99,97,99,104,101,100,175,1,0,0,115, 16,0,0,0,0,1,14,1,2,1,10,1,12,1,8,1, 14,1,4,2,114,112,0,0,0,99,1,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, @@ -536,7 +536,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,50,0,0,0,114,49,0,0,0,41,2,114,43,0, 0,0,114,51,0,0,0,114,3,0,0,0,114,3,0,0, 0,114,6,0,0,0,218,10,95,99,97,108,99,95,109,111, - 100,101,186,1,0,0,115,12,0,0,0,0,2,2,1,14, + 100,101,187,1,0,0,115,12,0,0,0,0,2,2,1,14, 1,12,1,10,3,8,1,114,114,0,0,0,99,1,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0, 0,3,0,0,0,115,66,0,0,0,100,6,135,0,102,1, @@ -561,2173 +561,2175 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, 97,105,115,101,100,46,10,10,32,32,32,32,78,99,2,0, 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, - 0,0,31,0,0,0,115,68,0,0,0,124,1,100,0,117, + 0,0,31,0,0,0,115,72,0,0,0,124,1,100,0,117, 0,114,16,124,0,106,0,125,1,110,32,124,0,106,0,124, 1,107,3,114,48,116,1,100,1,124,0,106,0,124,1,102, 2,22,0,124,1,100,2,141,2,130,1,136,0,124,0,124, - 1,103,2,124,2,162,1,82,0,124,3,142,1,83,0,41, - 3,78,122,30,108,111,97,100,101,114,32,102,111,114,32,37, - 115,32,99,97,110,110,111,116,32,104,97,110,100,108,101,32, - 37,115,169,1,218,4,110,97,109,101,41,2,114,116,0,0, - 0,218,11,73,109,112,111,114,116,69,114,114,111,114,41,4, - 218,4,115,101,108,102,114,116,0,0,0,218,4,97,114,103, - 115,218,6,107,119,97,114,103,115,169,1,218,6,109,101,116, - 104,111,100,114,3,0,0,0,114,6,0,0,0,218,19,95, - 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, - 101,114,206,1,0,0,115,18,0,0,0,0,1,8,1,8, - 1,10,1,4,1,8,255,2,1,2,255,6,2,122,40,95, - 99,104,101,99,107,95,110,97,109,101,46,60,108,111,99,97, - 108,115,62,46,95,99,104,101,99,107,95,110,97,109,101,95, - 119,114,97,112,112,101,114,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,7,0,0,0,83,0,0,0, - 115,56,0,0,0,100,1,68,0,93,32,125,2,116,0,124, - 1,124,2,131,2,114,4,116,1,124,0,124,2,116,2,124, - 1,124,2,131,2,131,3,1,0,113,4,124,0,106,3,160, - 4,124,1,106,3,161,1,1,0,100,0,83,0,41,2,78, - 41,4,218,10,95,95,109,111,100,117,108,101,95,95,218,8, - 95,95,110,97,109,101,95,95,218,12,95,95,113,117,97,108, - 110,97,109,101,95,95,218,7,95,95,100,111,99,95,95,41, - 5,218,7,104,97,115,97,116,116,114,218,7,115,101,116,97, - 116,116,114,218,7,103,101,116,97,116,116,114,218,8,95,95, - 100,105,99,116,95,95,218,6,117,112,100,97,116,101,41,3, - 90,3,110,101,119,90,3,111,108,100,114,66,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,5, - 95,119,114,97,112,217,1,0,0,115,8,0,0,0,0,1, - 8,1,10,1,20,1,122,26,95,99,104,101,99,107,95,110, - 97,109,101,46,60,108,111,99,97,108,115,62,46,95,119,114, - 97,112,41,1,78,41,3,218,10,95,98,111,111,116,115,116, - 114,97,112,114,133,0,0,0,218,9,78,97,109,101,69,114, - 114,111,114,41,3,114,122,0,0,0,114,123,0,0,0,114, - 133,0,0,0,114,3,0,0,0,114,121,0,0,0,114,6, - 0,0,0,218,11,95,99,104,101,99,107,95,110,97,109,101, - 198,1,0,0,115,14,0,0,0,0,8,14,7,2,1,10, - 1,12,2,14,5,10,1,114,136,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0, - 0,67,0,0,0,115,60,0,0,0,124,0,160,0,124,1, - 161,1,92,2,125,2,125,3,124,2,100,1,117,0,114,56, - 116,1,124,3,131,1,114,56,100,2,125,4,116,2,160,3, - 124,4,160,4,124,3,100,3,25,0,161,1,116,5,161,2, - 1,0,124,2,83,0,41,4,122,155,84,114,121,32,116,111, - 32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,32,98,121,32,100,101,108,101,103, - 97,116,105,110,103,32,116,111,10,32,32,32,32,115,101,108, - 102,46,102,105,110,100,95,108,111,97,100,101,114,40,41,46, - 10,10,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32, - 105,110,32,102,97,118,111,114,32,111,102,32,102,105,110,100, - 101,114,46,102,105,110,100,95,115,112,101,99,40,41,46,10, - 10,32,32,32,32,78,122,44,78,111,116,32,105,109,112,111, - 114,116,105,110,103,32,100,105,114,101,99,116,111,114,121,32, - 123,125,58,32,109,105,115,115,105,110,103,32,95,95,105,110, - 105,116,95,95,114,72,0,0,0,41,6,218,11,102,105,110, - 100,95,108,111,97,100,101,114,114,22,0,0,0,114,74,0, - 0,0,114,75,0,0,0,114,61,0,0,0,218,13,73,109, - 112,111,114,116,87,97,114,110,105,110,103,41,5,114,118,0, - 0,0,218,8,102,117,108,108,110,97,109,101,218,6,108,111, - 97,100,101,114,218,8,112,111,114,116,105,111,110,115,218,3, - 109,115,103,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,17,95,102,105,110,100,95,109,111,100,117,108,101, - 95,115,104,105,109,226,1,0,0,115,10,0,0,0,0,10, - 14,1,16,1,4,1,22,1,114,143,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0, - 0,0,67,0,0,0,115,158,0,0,0,124,0,100,1,100, - 2,133,2,25,0,125,3,124,3,116,0,107,3,114,60,100, - 3,124,1,155,2,100,4,124,3,155,2,157,4,125,4,116, - 1,160,2,100,5,124,4,161,2,1,0,116,3,124,4,102, - 1,124,2,142,1,130,1,116,4,124,0,131,1,100,6,107, - 0,114,102,100,7,124,1,155,2,157,2,125,4,116,1,160, - 2,100,5,124,4,161,2,1,0,116,5,124,4,131,1,130, - 1,116,6,124,0,100,2,100,8,133,2,25,0,131,1,125, - 5,124,5,100,9,64,0,114,154,100,10,124,5,155,2,100, - 11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,124, - 2,142,1,130,1,124,5,83,0,41,12,97,84,2,0,0, - 80,101,114,102,111,114,109,32,98,97,115,105,99,32,118,97, - 108,105,100,105,116,121,32,99,104,101,99,107,105,110,103,32, - 111,102,32,97,32,112,121,99,32,104,101,97,100,101,114,32, - 97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,102, - 108,97,103,115,32,102,105,101,108,100,44,10,32,32,32,32, - 119,104,105,99,104,32,100,101,116,101,114,109,105,110,101,115, - 32,104,111,119,32,116,104,101,32,112,121,99,32,115,104,111, - 117,108,100,32,98,101,32,102,117,114,116,104,101,114,32,118, - 97,108,105,100,97,116,101,100,32,97,103,97,105,110,115,116, - 32,116,104,101,32,115,111,117,114,99,101,46,10,10,32,32, - 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, - 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, - 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, - 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, - 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, - 114,101,100,44,32,116,104,111,117,103,104,46,41,10,10,32, - 32,32,32,42,110,97,109,101,42,32,105,115,32,116,104,101, - 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, - 117,108,101,32,98,101,105,110,103,32,105,109,112,111,114,116, - 101,100,46,32,73,116,32,105,115,32,117,115,101,100,32,102, - 111,114,32,108,111,103,103,105,110,103,46,10,10,32,32,32, - 32,42,101,120,99,95,100,101,116,97,105,108,115,42,32,105, - 115,32,97,32,100,105,99,116,105,111,110,97,114,121,32,112, - 97,115,115,101,100,32,116,111,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,105,116,32,114,97,105,115,101, - 100,32,102,111,114,10,32,32,32,32,105,109,112,114,111,118, - 101,100,32,100,101,98,117,103,103,105,110,103,46,10,10,32, - 32,32,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,104, - 101,32,109,97,103,105,99,32,110,117,109,98,101,114,32,105, - 115,32,105,110,99,111,114,114,101,99,116,32,111,114,32,119, - 104,101,110,32,116,104,101,32,102,108,97,103,115,10,32,32, - 32,32,102,105,101,108,100,32,105,115,32,105,110,118,97,108, - 105,100,46,32,69,79,70,69,114,114,111,114,32,105,115,32, - 114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32, - 100,97,116,97,32,105,115,32,102,111,117,110,100,32,116,111, - 32,98,101,32,116,114,117,110,99,97,116,101,100,46,10,10, - 32,32,32,32,78,114,15,0,0,0,122,20,98,97,100,32, - 109,97,103,105,99,32,110,117,109,98,101,114,32,105,110,32, - 122,2,58,32,250,2,123,125,233,16,0,0,0,122,40,114, - 101,97,99,104,101,100,32,69,79,70,32,119,104,105,108,101, - 32,114,101,97,100,105,110,103,32,112,121,99,32,104,101,97, - 100,101,114,32,111,102,32,233,8,0,0,0,233,252,255,255, - 255,122,14,105,110,118,97,108,105,100,32,102,108,97,103,115, - 32,122,4,32,105,110,32,41,7,218,12,77,65,71,73,67, - 95,78,85,77,66,69,82,114,134,0,0,0,218,16,95,118, - 101,114,98,111,115,101,95,109,101,115,115,97,103,101,114,117, - 0,0,0,114,22,0,0,0,218,8,69,79,70,69,114,114, - 111,114,114,26,0,0,0,41,6,114,25,0,0,0,114,116, - 0,0,0,218,11,101,120,99,95,100,101,116,97,105,108,115, - 90,5,109,97,103,105,99,114,92,0,0,0,114,82,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,13,95,99,108,97,115,115,105,102,121,95,112,121,99,243, - 1,0,0,115,28,0,0,0,0,16,12,1,8,1,16,1, - 12,1,12,1,12,1,10,1,12,1,8,1,16,2,8,1, - 16,1,12,1,114,152,0,0,0,99,5,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, - 0,0,115,112,0,0,0,116,0,124,0,100,1,100,2,133, - 2,25,0,131,1,124,1,100,3,64,0,107,3,114,58,100, - 4,124,3,155,2,157,2,125,5,116,1,160,2,100,5,124, - 5,161,2,1,0,116,3,124,5,102,1,124,4,142,1,130, - 1,124,2,100,6,117,1,114,108,116,0,124,0,100,2,100, + 1,103,2,124,2,162,1,82,0,105,0,124,3,164,1,142, + 1,83,0,41,3,78,122,30,108,111,97,100,101,114,32,102, + 111,114,32,37,115,32,99,97,110,110,111,116,32,104,97,110, + 100,108,101,32,37,115,169,1,218,4,110,97,109,101,41,2, + 114,116,0,0,0,218,11,73,109,112,111,114,116,69,114,114, + 111,114,41,4,218,4,115,101,108,102,114,116,0,0,0,218, + 4,97,114,103,115,218,6,107,119,97,114,103,115,169,1,218, + 6,109,101,116,104,111,100,114,3,0,0,0,114,6,0,0, + 0,218,19,95,99,104,101,99,107,95,110,97,109,101,95,119, + 114,97,112,112,101,114,207,1,0,0,115,18,0,0,0,0, + 1,8,1,8,1,10,1,4,1,8,255,2,1,2,255,6, + 2,122,40,95,99,104,101,99,107,95,110,97,109,101,46,60, + 108,111,99,97,108,115,62,46,95,99,104,101,99,107,95,110, + 97,109,101,95,119,114,97,112,112,101,114,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0, + 83,0,0,0,115,56,0,0,0,100,1,68,0,93,32,125, + 2,116,0,124,1,124,2,131,2,114,4,116,1,124,0,124, + 2,116,2,124,1,124,2,131,2,131,3,1,0,113,4,124, + 0,106,3,160,4,124,1,106,3,161,1,1,0,100,0,83, + 0,41,2,78,41,4,218,10,95,95,109,111,100,117,108,101, + 95,95,218,8,95,95,110,97,109,101,95,95,218,12,95,95, + 113,117,97,108,110,97,109,101,95,95,218,7,95,95,100,111, + 99,95,95,41,5,218,7,104,97,115,97,116,116,114,218,7, + 115,101,116,97,116,116,114,218,7,103,101,116,97,116,116,114, + 218,8,95,95,100,105,99,116,95,95,218,6,117,112,100,97, + 116,101,41,3,90,3,110,101,119,90,3,111,108,100,114,66, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,5,95,119,114,97,112,218,1,0,0,115,8,0, + 0,0,0,1,8,1,10,1,20,1,122,26,95,99,104,101, + 99,107,95,110,97,109,101,46,60,108,111,99,97,108,115,62, + 46,95,119,114,97,112,41,1,78,41,3,218,10,95,98,111, + 111,116,115,116,114,97,112,114,133,0,0,0,218,9,78,97, + 109,101,69,114,114,111,114,41,3,114,122,0,0,0,114,123, + 0,0,0,114,133,0,0,0,114,3,0,0,0,114,121,0, + 0,0,114,6,0,0,0,218,11,95,99,104,101,99,107,95, + 110,97,109,101,199,1,0,0,115,14,0,0,0,0,8,14, + 7,2,1,10,1,12,2,14,5,10,1,114,136,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,6,0,0,0,67,0,0,0,115,60,0,0,0,124,0, + 160,0,124,1,161,1,92,2,125,2,125,3,124,2,100,1, + 117,0,114,56,116,1,124,3,131,1,114,56,100,2,125,4, + 116,2,160,3,124,4,160,4,124,3,100,3,25,0,161,1, + 116,5,161,2,1,0,124,2,83,0,41,4,122,155,84,114, + 121,32,116,111,32,102,105,110,100,32,97,32,108,111,97,100, + 101,114,32,102,111,114,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,32,109,111,100,117,108,101,32,98,121,32,100, + 101,108,101,103,97,116,105,110,103,32,116,111,10,32,32,32, + 32,115,101,108,102,46,102,105,110,100,95,108,111,97,100,101, + 114,40,41,46,10,10,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,32,105,110,32,102,97,118,111,114,32,111,102,32, + 102,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, + 40,41,46,10,10,32,32,32,32,78,122,44,78,111,116,32, + 105,109,112,111,114,116,105,110,103,32,100,105,114,101,99,116, + 111,114,121,32,123,125,58,32,109,105,115,115,105,110,103,32, + 95,95,105,110,105,116,95,95,114,72,0,0,0,41,6,218, + 11,102,105,110,100,95,108,111,97,100,101,114,114,22,0,0, + 0,114,74,0,0,0,114,75,0,0,0,114,61,0,0,0, + 218,13,73,109,112,111,114,116,87,97,114,110,105,110,103,41, + 5,114,118,0,0,0,218,8,102,117,108,108,110,97,109,101, + 218,6,108,111,97,100,101,114,218,8,112,111,114,116,105,111, + 110,115,218,3,109,115,103,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,17,95,102,105,110,100,95,109,111, + 100,117,108,101,95,115,104,105,109,227,1,0,0,115,10,0, + 0,0,0,10,14,1,16,1,4,1,22,1,114,143,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,4,0,0,0,67,0,0,0,115,166,0,0,0,124, + 0,100,1,100,2,133,2,25,0,125,3,124,3,116,0,107, + 3,114,64,100,3,124,1,155,2,100,4,124,3,155,2,157, + 4,125,4,116,1,160,2,100,5,124,4,161,2,1,0,116, + 3,124,4,102,1,105,0,124,2,164,1,142,1,130,1,116, + 4,124,0,131,1,100,6,107,0,114,106,100,7,124,1,155, + 2,157,2,125,4,116,1,160,2,100,5,124,4,161,2,1, + 0,116,5,124,4,131,1,130,1,116,6,124,0,100,2,100, + 8,133,2,25,0,131,1,125,5,124,5,100,9,64,0,114, + 162,100,10,124,5,155,2,100,11,124,1,155,2,157,4,125, + 4,116,3,124,4,102,1,105,0,124,2,164,1,142,1,130, + 1,124,5,83,0,41,12,97,84,2,0,0,80,101,114,102, + 111,114,109,32,98,97,115,105,99,32,118,97,108,105,100,105, + 116,121,32,99,104,101,99,107,105,110,103,32,111,102,32,97, + 32,112,121,99,32,104,101,97,100,101,114,32,97,110,100,32, + 114,101,116,117,114,110,32,116,104,101,32,102,108,97,103,115, + 32,102,105,101,108,100,44,10,32,32,32,32,119,104,105,99, + 104,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119, + 32,116,104,101,32,112,121,99,32,115,104,111,117,108,100,32, + 98,101,32,102,117,114,116,104,101,114,32,118,97,108,105,100, + 97,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101, + 32,115,111,117,114,99,101,46,10,10,32,32,32,32,42,100, + 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, + 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, + 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, + 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, + 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,44, + 32,116,104,111,117,103,104,46,41,10,10,32,32,32,32,42, + 110,97,109,101,42,32,105,115,32,116,104,101,32,110,97,109, + 101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32, + 98,101,105,110,103,32,105,109,112,111,114,116,101,100,46,32, + 73,116,32,105,115,32,117,115,101,100,32,102,111,114,32,108, + 111,103,103,105,110,103,46,10,10,32,32,32,32,42,101,120, + 99,95,100,101,116,97,105,108,115,42,32,105,115,32,97,32, + 100,105,99,116,105,111,110,97,114,121,32,112,97,115,115,101, + 100,32,116,111,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,102,32,105,116,32,114,97,105,115,101,100,32,102,111, + 114,10,32,32,32,32,105,109,112,114,111,118,101,100,32,100, + 101,98,117,103,103,105,110,103,46,10,10,32,32,32,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,32,119,104,101,110,32,116,104,101,32,109,97, + 103,105,99,32,110,117,109,98,101,114,32,105,115,32,105,110, + 99,111,114,114,101,99,116,32,111,114,32,119,104,101,110,32, + 116,104,101,32,102,108,97,103,115,10,32,32,32,32,102,105, + 101,108,100,32,105,115,32,105,110,118,97,108,105,100,46,32, + 69,79,70,69,114,114,111,114,32,105,115,32,114,97,105,115, + 101,100,32,119,104,101,110,32,116,104,101,32,100,97,116,97, + 32,105,115,32,102,111,117,110,100,32,116,111,32,98,101,32, + 116,114,117,110,99,97,116,101,100,46,10,10,32,32,32,32, + 78,114,15,0,0,0,122,20,98,97,100,32,109,97,103,105, + 99,32,110,117,109,98,101,114,32,105,110,32,122,2,58,32, + 250,2,123,125,233,16,0,0,0,122,40,114,101,97,99,104, + 101,100,32,69,79,70,32,119,104,105,108,101,32,114,101,97, + 100,105,110,103,32,112,121,99,32,104,101,97,100,101,114,32, + 111,102,32,233,8,0,0,0,233,252,255,255,255,122,14,105, + 110,118,97,108,105,100,32,102,108,97,103,115,32,122,4,32, + 105,110,32,41,7,218,12,77,65,71,73,67,95,78,85,77, + 66,69,82,114,134,0,0,0,218,16,95,118,101,114,98,111, + 115,101,95,109,101,115,115,97,103,101,114,117,0,0,0,114, + 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,26, + 0,0,0,41,6,114,25,0,0,0,114,116,0,0,0,218, + 11,101,120,99,95,100,101,116,97,105,108,115,90,5,109,97, + 103,105,99,114,92,0,0,0,114,82,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,99, + 108,97,115,115,105,102,121,95,112,121,99,244,1,0,0,115, + 28,0,0,0,0,16,12,1,8,1,16,1,12,1,16,1, + 12,1,10,1,12,1,8,1,16,2,8,1,16,1,16,1, + 114,152,0,0,0,99,5,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,120, + 0,0,0,116,0,124,0,100,1,100,2,133,2,25,0,131, + 1,124,1,100,3,64,0,107,3,114,62,100,4,124,3,155, + 2,157,2,125,5,116,1,160,2,100,5,124,5,161,2,1, + 0,116,3,124,5,102,1,105,0,124,4,164,1,142,1,130, + 1,124,2,100,6,117,1,114,116,116,0,124,0,100,2,100, 7,133,2,25,0,131,1,124,2,100,3,64,0,107,3,114, - 108,116,3,100,4,124,3,155,2,157,2,102,1,124,4,142, - 1,130,1,100,6,83,0,41,8,97,7,2,0,0,86,97, - 108,105,100,97,116,101,32,97,32,112,121,99,32,97,103,97, - 105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,32, - 108,97,115,116,45,109,111,100,105,102,105,101,100,32,116,105, - 109,101,46,10,10,32,32,32,32,42,100,97,116,97,42,32, - 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, - 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, - 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, - 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, - 32,32,42,115,111,117,114,99,101,95,109,116,105,109,101,42, - 32,105,115,32,116,104,101,32,108,97,115,116,32,109,111,100, - 105,102,105,101,100,32,116,105,109,101,115,116,97,109,112,32, - 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, - 108,101,46,10,10,32,32,32,32,42,115,111,117,114,99,101, - 95,115,105,122,101,42,32,105,115,32,78,111,110,101,32,111, - 114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104, - 101,32,115,111,117,114,99,101,32,102,105,108,101,32,105,110, - 32,98,121,116,101,115,46,10,10,32,32,32,32,42,110,97, - 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, - 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, - 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, - 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, - 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, - 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, - 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, - 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, - 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, - 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, - 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, - 10,32,32,32,32,114,146,0,0,0,233,12,0,0,0,114, - 14,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,32,102,111,114,32,114,144,0,0, - 0,78,114,145,0,0,0,41,4,114,26,0,0,0,114,134, - 0,0,0,114,149,0,0,0,114,117,0,0,0,41,6,114, - 25,0,0,0,218,12,115,111,117,114,99,101,95,109,116,105, - 109,101,218,11,115,111,117,114,99,101,95,115,105,122,101,114, - 116,0,0,0,114,151,0,0,0,114,92,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,23,95, - 118,97,108,105,100,97,116,101,95,116,105,109,101,115,116,97, - 109,112,95,112,121,99,20,2,0,0,115,16,0,0,0,0, - 19,24,1,10,1,12,1,12,1,8,1,22,255,2,2,114, - 156,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,124,0,100,1,100,2,133,2,25,0,124,1,107,3, - 114,34,116,0,100,3,124,2,155,2,157,2,102,1,124,3, - 142,1,130,1,100,4,83,0,41,5,97,243,1,0,0,86, - 97,108,105,100,97,116,101,32,97,32,104,97,115,104,45,98, - 97,115,101,100,32,112,121,99,32,98,121,32,99,104,101,99, - 107,105,110,103,32,116,104,101,32,114,101,97,108,32,115,111, - 117,114,99,101,32,104,97,115,104,32,97,103,97,105,110,115, - 116,32,116,104,101,32,111,110,101,32,105,110,10,32,32,32, - 32,116,104,101,32,112,121,99,32,104,101,97,100,101,114,46, - 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32, - 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32, - 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79, - 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54, - 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114, - 101,113,117,105,114,101,100,46,41,10,10,32,32,32,32,42, - 115,111,117,114,99,101,95,104,97,115,104,42,32,105,115,32, - 116,104,101,32,105,109,112,111,114,116,108,105,98,46,117,116, - 105,108,46,115,111,117,114,99,101,95,104,97,115,104,40,41, - 32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,102, - 105,108,101,46,10,10,32,32,32,32,42,110,97,109,101,42, - 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, - 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, - 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, - 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, - 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, - 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, - 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, - 105,110,103,46,10,10,32,32,32,32,65,110,32,73,109,112, - 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115, - 101,100,32,105,102,32,116,104,101,32,98,121,116,101,99,111, - 100,101,32,105,115,32,115,116,97,108,101,46,10,10,32,32, - 32,32,114,146,0,0,0,114,145,0,0,0,122,46,104,97, - 115,104,32,105,110,32,98,121,116,101,99,111,100,101,32,100, - 111,101,115,110,39,116,32,109,97,116,99,104,32,104,97,115, - 104,32,111,102,32,115,111,117,114,99,101,32,78,41,1,114, - 117,0,0,0,41,4,114,25,0,0,0,218,11,115,111,117, - 114,99,101,95,104,97,115,104,114,116,0,0,0,114,151,0, + 116,116,3,100,4,124,3,155,2,157,2,102,1,105,0,124, + 4,164,1,142,1,130,1,100,6,83,0,41,8,97,7,2, + 0,0,86,97,108,105,100,97,116,101,32,97,32,112,121,99, + 32,97,103,97,105,110,115,116,32,116,104,101,32,115,111,117, + 114,99,101,32,108,97,115,116,45,109,111,100,105,102,105,101, + 100,32,116,105,109,101,46,10,10,32,32,32,32,42,100,97, + 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, + 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, + 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, + 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, + 101,10,32,32,32,32,114,101,113,117,105,114,101,100,46,41, + 10,10,32,32,32,32,42,115,111,117,114,99,101,95,109,116, + 105,109,101,42,32,105,115,32,116,104,101,32,108,97,115,116, + 32,109,111,100,105,102,105,101,100,32,116,105,109,101,115,116, + 97,109,112,32,111,102,32,116,104,101,32,115,111,117,114,99, + 101,32,102,105,108,101,46,10,10,32,32,32,32,42,115,111, + 117,114,99,101,95,115,105,122,101,42,32,105,115,32,78,111, + 110,101,32,111,114,32,116,104,101,32,115,105,122,101,32,111, + 102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,108, + 101,32,105,110,32,98,121,116,101,115,46,10,10,32,32,32, + 32,42,110,97,109,101,42,32,105,115,32,116,104,101,32,110, + 97,109,101,32,111,102,32,116,104,101,32,109,111,100,117,108, + 101,32,98,101,105,110,103,32,105,109,112,111,114,116,101,100, + 46,32,73,116,32,105,115,32,117,115,101,100,32,102,111,114, + 32,108,111,103,103,105,110,103,46,10,10,32,32,32,32,42, + 101,120,99,95,100,101,116,97,105,108,115,42,32,105,115,32, + 97,32,100,105,99,116,105,111,110,97,114,121,32,112,97,115, + 115,101,100,32,116,111,32,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,114,97,105,115,101,100,32, + 102,111,114,10,32,32,32,32,105,109,112,114,111,118,101,100, + 32,100,101,98,117,103,103,105,110,103,46,10,10,32,32,32, + 32,65,110,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,115,32,114,97,105,115,101,100,32,105,102,32,116,104,101, + 32,98,121,116,101,99,111,100,101,32,105,115,32,115,116,97, + 108,101,46,10,10,32,32,32,32,114,146,0,0,0,233,12, + 0,0,0,114,14,0,0,0,122,22,98,121,116,101,99,111, + 100,101,32,105,115,32,115,116,97,108,101,32,102,111,114,32, + 114,144,0,0,0,78,114,145,0,0,0,41,4,114,26,0, + 0,0,114,134,0,0,0,114,149,0,0,0,114,117,0,0, + 0,41,6,114,25,0,0,0,218,12,115,111,117,114,99,101, + 95,109,116,105,109,101,218,11,115,111,117,114,99,101,95,115, + 105,122,101,114,116,0,0,0,114,151,0,0,0,114,92,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,18,95,118,97,108,105,100,97,116,101,95,104,97,115, - 104,95,112,121,99,48,2,0,0,115,12,0,0,0,0,17, - 16,1,2,1,8,255,2,2,2,254,114,158,0,0,0,99, - 4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,80,0,0,0,116,0,160, - 1,124,0,161,1,125,4,116,2,124,4,116,3,131,2,114, - 56,116,4,160,5,100,1,124,2,161,2,1,0,124,3,100, - 2,117,1,114,52,116,6,160,7,124,4,124,3,161,2,1, - 0,124,4,83,0,116,8,100,3,160,9,124,2,161,1,124, - 1,124,2,100,4,141,3,130,1,100,2,83,0,41,5,122, - 35,67,111,109,112,105,108,101,32,98,121,116,101,99,111,100, - 101,32,97,115,32,102,111,117,110,100,32,105,110,32,97,32, - 112,121,99,46,122,21,99,111,100,101,32,111,98,106,101,99, - 116,32,102,114,111,109,32,123,33,114,125,78,122,23,78,111, - 110,45,99,111,100,101,32,111,98,106,101,99,116,32,105,110, - 32,123,33,114,125,169,2,114,116,0,0,0,114,43,0,0, - 0,41,10,218,7,109,97,114,115,104,97,108,90,5,108,111, - 97,100,115,218,10,105,115,105,110,115,116,97,110,99,101,218, - 10,95,99,111,100,101,95,116,121,112,101,114,134,0,0,0, - 114,149,0,0,0,218,4,95,105,109,112,90,16,95,102,105, - 120,95,99,111,95,102,105,108,101,110,97,109,101,114,117,0, - 0,0,114,61,0,0,0,41,5,114,25,0,0,0,114,116, - 0,0,0,114,106,0,0,0,114,107,0,0,0,218,4,99, - 111,100,101,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,17,95,99,111,109,112,105,108,101,95,98,121,116, - 101,99,111,100,101,72,2,0,0,115,20,0,0,0,0,2, - 10,1,10,1,12,1,8,1,12,1,4,2,10,1,2,0, - 2,255,114,165,0,0,0,114,72,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0, - 0,67,0,0,0,115,70,0,0,0,116,0,116,1,131,1, - 125,3,124,3,160,2,116,3,100,1,131,1,161,1,1,0, - 124,3,160,2,116,3,124,1,131,1,161,1,1,0,124,3, - 160,2,116,3,124,2,131,1,161,1,1,0,124,3,160,2, - 116,4,160,5,124,0,161,1,161,1,1,0,124,3,83,0, - 41,2,122,43,80,114,111,100,117,99,101,32,116,104,101,32, - 100,97,116,97,32,102,111,114,32,97,32,116,105,109,101,115, - 116,97,109,112,45,98,97,115,101,100,32,112,121,99,46,114, - 72,0,0,0,41,6,218,9,98,121,116,101,97,114,114,97, - 121,114,148,0,0,0,218,6,101,120,116,101,110,100,114,20, - 0,0,0,114,160,0,0,0,218,5,100,117,109,112,115,41, - 4,114,164,0,0,0,218,5,109,116,105,109,101,114,155,0, - 0,0,114,25,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,22,95,99,111,100,101,95,116,111, - 95,116,105,109,101,115,116,97,109,112,95,112,121,99,85,2, - 0,0,115,12,0,0,0,0,2,8,1,14,1,14,1,14, - 1,16,1,114,170,0,0,0,84,99,3,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, - 0,0,115,80,0,0,0,116,0,116,1,131,1,125,3,100, - 1,124,2,100,1,62,0,66,0,125,4,124,3,160,2,116, - 3,124,4,131,1,161,1,1,0,116,4,124,1,131,1,100, - 2,107,2,115,50,74,0,130,1,124,3,160,2,124,1,161, - 1,1,0,124,3,160,2,116,5,160,6,124,0,161,1,161, - 1,1,0,124,3,83,0,41,3,122,38,80,114,111,100,117, - 99,101,32,116,104,101,32,100,97,116,97,32,102,111,114,32, + 0,218,23,95,118,97,108,105,100,97,116,101,95,116,105,109, + 101,115,116,97,109,112,95,112,121,99,21,2,0,0,115,16, + 0,0,0,0,19,24,1,10,1,12,1,16,1,8,1,22, + 255,2,2,114,156,0,0,0,99,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,42,0,0,0,124,0,100,1,100,2,133,2,25,0, + 124,1,107,3,114,38,116,0,100,3,124,2,155,2,157,2, + 102,1,105,0,124,3,164,1,142,1,130,1,100,4,83,0, + 41,5,97,243,1,0,0,86,97,108,105,100,97,116,101,32, 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, - 46,114,38,0,0,0,114,146,0,0,0,41,7,114,166,0, - 0,0,114,148,0,0,0,114,167,0,0,0,114,20,0,0, - 0,114,22,0,0,0,114,160,0,0,0,114,168,0,0,0, - 41,5,114,164,0,0,0,114,157,0,0,0,90,7,99,104, - 101,99,107,101,100,114,25,0,0,0,114,82,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, - 99,95,2,0,0,115,14,0,0,0,0,2,8,1,12,1, - 14,1,16,1,10,1,16,1,114,171,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, - 0,0,67,0,0,0,115,62,0,0,0,100,1,100,2,108, - 0,125,1,116,1,160,2,124,0,161,1,106,3,125,2,124, - 1,160,4,124,2,161,1,125,3,116,1,160,5,100,2,100, - 3,161,2,125,4,124,4,160,6,124,0,160,6,124,3,100, - 1,25,0,161,1,161,1,83,0,41,4,122,121,68,101,99, - 111,100,101,32,98,121,116,101,115,32,114,101,112,114,101,115, - 101,110,116,105,110,103,32,115,111,117,114,99,101,32,99,111, - 100,101,32,97,110,100,32,114,101,116,117,114,110,32,116,104, - 101,32,115,116,114,105,110,103,46,10,10,32,32,32,32,85, - 110,105,118,101,114,115,97,108,32,110,101,119,108,105,110,101, - 32,115,117,112,112,111,114,116,32,105,115,32,117,115,101,100, - 32,105,110,32,116,104,101,32,100,101,99,111,100,105,110,103, - 46,10,32,32,32,32,114,72,0,0,0,78,84,41,7,218, - 8,116,111,107,101,110,105,122,101,114,63,0,0,0,90,7, - 66,121,116,101,115,73,79,90,8,114,101,97,100,108,105,110, - 101,90,15,100,101,116,101,99,116,95,101,110,99,111,100,105, - 110,103,90,25,73,110,99,114,101,109,101,110,116,97,108,78, - 101,119,108,105,110,101,68,101,99,111,100,101,114,218,6,100, - 101,99,111,100,101,41,5,218,12,115,111,117,114,99,101,95, - 98,121,116,101,115,114,172,0,0,0,90,21,115,111,117,114, - 99,101,95,98,121,116,101,115,95,114,101,97,100,108,105,110, - 101,218,8,101,110,99,111,100,105,110,103,90,15,110,101,119, - 108,105,110,101,95,100,101,99,111,100,101,114,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,13,100,101,99, - 111,100,101,95,115,111,117,114,99,101,106,2,0,0,115,10, - 0,0,0,0,5,8,1,12,1,10,1,12,1,114,176,0, - 0,0,169,2,114,140,0,0,0,218,26,115,117,98,109,111, - 100,117,108,101,95,115,101,97,114,99,104,95,108,111,99,97, - 116,105,111,110,115,99,2,0,0,0,0,0,0,0,2,0, - 0,0,9,0,0,0,8,0,0,0,67,0,0,0,115,12, - 1,0,0,124,1,100,1,117,0,114,58,100,2,125,1,116, - 0,124,2,100,3,131,2,114,68,122,14,124,2,160,1,124, - 0,161,1,125,1,87,0,113,68,4,0,116,2,121,54,1, - 0,1,0,1,0,89,0,113,68,48,0,110,10,116,3,160, - 4,124,1,161,1,125,1,116,5,106,6,124,0,124,2,124, - 1,100,4,141,3,125,4,100,5,124,4,95,7,124,2,100, - 1,117,0,114,152,116,8,131,0,68,0,93,42,92,2,125, - 5,125,6,124,1,160,9,116,10,124,6,131,1,161,1,114, - 104,124,5,124,0,124,1,131,2,125,2,124,2,124,4,95, - 11,1,0,113,152,113,104,100,1,83,0,124,3,116,12,117, - 0,114,216,116,0,124,2,100,6,131,2,114,222,122,14,124, - 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, - 2,121,202,1,0,1,0,1,0,89,0,113,222,48,0,124, - 7,114,222,103,0,124,4,95,14,110,6,124,3,124,4,95, - 14,124,4,106,14,103,0,107,2,144,1,114,8,124,1,144, - 1,114,8,116,15,124,1,131,1,100,7,25,0,125,8,124, - 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,41, - 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, - 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, - 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, - 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, - 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, - 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, - 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, - 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, - 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, - 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, - 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, - 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, - 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, - 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, - 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, - 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, - 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, - 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, - 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, - 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, - 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, - 107,97,103,101,114,72,0,0,0,41,17,114,128,0,0,0, - 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, - 78,0,0,0,114,134,0,0,0,218,10,77,111,100,117,108, - 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, - 97,116,116,114,218,27,95,103,101,116,95,115,117,112,112,111, - 114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114, - 115,114,110,0,0,0,114,111,0,0,0,114,140,0,0,0, - 218,9,95,80,79,80,85,76,65,84,69,114,182,0,0,0, - 114,178,0,0,0,114,46,0,0,0,218,6,97,112,112,101, - 110,100,41,9,114,116,0,0,0,90,8,108,111,99,97,116, - 105,111,110,114,140,0,0,0,114,178,0,0,0,218,4,115, - 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, - 115,218,8,115,117,102,102,105,120,101,115,114,182,0,0,0, - 90,7,100,105,114,110,97,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,23,115,112,101,99,95,102, - 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, - 110,123,2,0,0,115,62,0,0,0,0,12,8,4,4,1, - 10,2,2,1,14,1,12,1,8,2,10,8,16,1,6,3, - 8,1,14,1,14,1,10,1,6,1,6,2,4,3,8,2, - 10,1,2,1,14,1,12,1,6,2,4,1,8,2,6,1, - 12,1,6,1,12,1,12,2,114,190,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,64,0,0,0,115,80,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,90,4,100,3,90,5,100, - 4,90,6,101,7,100,5,100,6,132,0,131,1,90,8,101, - 7,100,7,100,8,132,0,131,1,90,9,101,7,100,14,100, - 10,100,11,132,1,131,1,90,10,101,7,100,15,100,12,100, - 13,132,1,131,1,90,11,100,9,83,0,41,16,218,21,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, - 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, - 101,115,32,100,101,99,108,97,114,101,100,32,105,110,32,116, - 104,101,32,87,105,110,100,111,119,115,32,114,101,103,105,115, - 116,114,121,46,122,59,83,111,102,116,119,97,114,101,92,80, - 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, - 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, - 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, - 125,122,65,83,111,102,116,119,97,114,101,92,80,121,116,104, - 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, - 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, - 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, - 101,98,117,103,70,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,54, - 0,0,0,122,16,116,0,160,1,116,0,106,2,124,1,161, - 2,87,0,83,0,4,0,116,3,121,48,1,0,1,0,1, - 0,116,0,160,1,116,0,106,4,124,1,161,2,6,0,89, - 0,83,0,48,0,100,0,83,0,114,109,0,0,0,41,5, - 218,7,95,119,105,110,114,101,103,90,7,79,112,101,110,75, - 101,121,90,17,72,75,69,89,95,67,85,82,82,69,78,84, - 95,85,83,69,82,114,49,0,0,0,90,18,72,75,69,89, - 95,76,79,67,65,76,95,77,65,67,72,73,78,69,41,2, - 218,3,99,108,115,114,5,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,14,95,111,112,101,110, - 95,114,101,103,105,115,116,114,121,203,2,0,0,115,8,0, - 0,0,0,2,2,1,16,1,12,1,122,36,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,46,95,111,112,101,110,95,114,101,103,105,115,116,114,121, - 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,8,0,0,0,67,0,0,0,115,132,0,0,0,124,0, - 106,0,114,14,124,0,106,1,125,2,110,6,124,0,106,2, - 125,2,124,2,106,3,124,1,100,1,116,4,106,5,100,0, - 100,2,133,2,25,0,22,0,100,3,141,2,125,3,122,58, - 124,0,160,6,124,3,161,1,143,28,125,4,116,7,160,8, - 124,4,100,4,161,2,125,5,87,0,100,0,4,0,4,0, - 131,3,1,0,110,16,49,0,115,94,48,0,1,0,1,0, - 1,0,89,0,1,0,87,0,110,20,4,0,116,9,121,126, - 1,0,1,0,1,0,89,0,100,0,83,0,48,0,124,5, - 83,0,41,5,78,122,5,37,100,46,37,100,114,27,0,0, - 0,41,2,114,139,0,0,0,90,11,115,121,115,95,118,101, - 114,115,105,111,110,114,39,0,0,0,41,10,218,11,68,69, - 66,85,71,95,66,85,73,76,68,218,18,82,69,71,73,83, - 84,82,89,95,75,69,89,95,68,69,66,85,71,218,12,82, - 69,71,73,83,84,82,89,95,75,69,89,114,61,0,0,0, - 114,8,0,0,0,218,12,118,101,114,115,105,111,110,95,105, - 110,102,111,114,194,0,0,0,114,192,0,0,0,90,10,81, - 117,101,114,121,86,97,108,117,101,114,49,0,0,0,41,6, - 114,193,0,0,0,114,139,0,0,0,90,12,114,101,103,105, - 115,116,114,121,95,107,101,121,114,5,0,0,0,90,4,104, - 107,101,121,218,8,102,105,108,101,112,97,116,104,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,16,95,115, - 101,97,114,99,104,95,114,101,103,105,115,116,114,121,210,2, - 0,0,115,24,0,0,0,0,2,6,1,8,2,6,1,6, - 1,16,255,6,2,2,1,12,1,46,1,12,1,8,1,122, - 38,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, - 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,114, - 101,103,105,115,116,114,121,78,99,4,0,0,0,0,0,0, - 0,0,0,0,0,8,0,0,0,8,0,0,0,67,0,0, - 0,115,120,0,0,0,124,0,160,0,124,1,161,1,125,4, - 124,4,100,0,117,0,114,22,100,0,83,0,122,12,116,1, - 124,4,131,1,1,0,87,0,110,20,4,0,116,2,121,54, - 1,0,1,0,1,0,89,0,100,0,83,0,48,0,116,3, - 131,0,68,0,93,52,92,2,125,5,125,6,124,4,160,4, - 116,5,124,6,131,1,161,1,114,62,116,6,106,7,124,1, - 124,5,124,1,124,4,131,2,124,4,100,1,141,3,125,7, - 124,7,2,0,1,0,83,0,113,62,100,0,83,0,41,2, - 78,114,180,0,0,0,41,8,114,200,0,0,0,114,48,0, - 0,0,114,49,0,0,0,114,184,0,0,0,114,110,0,0, - 0,114,111,0,0,0,114,134,0,0,0,218,16,115,112,101, - 99,95,102,114,111,109,95,108,111,97,100,101,114,41,8,114, - 193,0,0,0,114,139,0,0,0,114,43,0,0,0,218,6, - 116,97,114,103,101,116,114,199,0,0,0,114,140,0,0,0, - 114,189,0,0,0,114,187,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,9,102,105,110,100,95, - 115,112,101,99,225,2,0,0,115,28,0,0,0,0,2,10, - 1,8,1,4,1,2,1,12,1,12,1,8,1,14,1,14, - 1,6,1,8,1,2,254,6,3,122,31,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,34,0,0,0,124,0,160,0,124,1,124,2, - 161,2,125,3,124,3,100,1,117,1,114,26,124,3,106,1, - 83,0,100,1,83,0,100,1,83,0,41,2,122,108,70,105, - 110,100,32,109,111,100,117,108,101,32,110,97,109,101,100,32, - 105,110,32,116,104,101,32,114,101,103,105,115,116,114,121,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,78,169,2,114,203,0, - 0,0,114,140,0,0,0,169,4,114,193,0,0,0,114,139, - 0,0,0,114,43,0,0,0,114,187,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,11,102,105, - 110,100,95,109,111,100,117,108,101,241,2,0,0,115,8,0, - 0,0,0,7,12,1,8,1,6,2,122,33,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,46,102,105,110,100,95,109,111,100,117,108,101,41,2,78, - 78,41,1,78,41,12,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,197,0,0,0,114, - 196,0,0,0,114,195,0,0,0,218,11,99,108,97,115,115, - 109,101,116,104,111,100,114,194,0,0,0,114,200,0,0,0, - 114,203,0,0,0,114,206,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,191, - 0,0,0,191,2,0,0,115,28,0,0,0,8,2,4,3, - 2,255,2,4,2,255,2,3,4,2,2,1,10,6,2,1, - 10,14,2,1,12,15,2,1,114,191,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, - 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95, - 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97, - 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109, - 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98, - 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97, - 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, - 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125, - 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125, - 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124, - 3,100,5,107,2,111,62,124,4,100,5,107,3,83,0,41, - 6,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, - 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105, - 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104, - 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32, - 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32, - 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111, - 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46, - 114,38,0,0,0,114,70,0,0,0,114,72,0,0,0,114, - 27,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4, - 114,46,0,0,0,114,179,0,0,0,114,42,0,0,0,114, - 40,0,0,0,41,5,114,118,0,0,0,114,139,0,0,0, - 114,96,0,0,0,90,13,102,105,108,101,110,97,109,101,95, - 98,97,115,101,90,9,116,97,105,108,95,110,97,109,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,182, - 0,0,0,4,3,0,0,115,8,0,0,0,0,3,18,1, - 16,1,14,1,122,24,95,76,111,97,100,101,114,66,97,115, - 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32, - 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111, - 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114, - 3,0,0,0,169,2,114,118,0,0,0,114,187,0,0,0, + 32,98,121,32,99,104,101,99,107,105,110,103,32,116,104,101, + 32,114,101,97,108,32,115,111,117,114,99,101,32,104,97,115, + 104,32,97,103,97,105,110,115,116,32,116,104,101,32,111,110, + 101,32,105,110,10,32,32,32,32,116,104,101,32,112,121,99, + 32,104,101,97,100,101,114,46,10,10,32,32,32,32,42,100, + 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, + 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, + 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, + 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, + 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, + 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,104, + 97,115,104,42,32,105,115,32,116,104,101,32,105,109,112,111, + 114,116,108,105,98,46,117,116,105,108,46,115,111,117,114,99, + 101,95,104,97,115,104,40,41,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, + 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, + 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, + 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, + 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, + 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, + 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, + 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, + 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, + 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, + 97,108,101,46,10,10,32,32,32,32,114,146,0,0,0,114, + 145,0,0,0,122,46,104,97,115,104,32,105,110,32,98,121, + 116,101,99,111,100,101,32,100,111,101,115,110,39,116,32,109, + 97,116,99,104,32,104,97,115,104,32,111,102,32,115,111,117, + 114,99,101,32,78,41,1,114,117,0,0,0,41,4,114,25, + 0,0,0,218,11,115,111,117,114,99,101,95,104,97,115,104, + 114,116,0,0,0,114,151,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,18,95,118,97,108,105, + 100,97,116,101,95,104,97,115,104,95,112,121,99,49,2,0, + 0,115,12,0,0,0,0,17,16,1,2,1,8,255,4,2, + 2,254,114,158,0,0,0,99,4,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,80,0,0,0,116,0,160,1,124,0,161,1,125,4,116, + 2,124,4,116,3,131,2,114,56,116,4,160,5,100,1,124, + 2,161,2,1,0,124,3,100,2,117,1,114,52,116,6,160, + 7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,100, + 3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,130, + 1,100,2,83,0,41,5,122,35,67,111,109,112,105,108,101, + 32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,117, + 110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,111, + 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, + 33,114,125,78,122,23,78,111,110,45,99,111,100,101,32,111, + 98,106,101,99,116,32,105,110,32,123,33,114,125,169,2,114, + 116,0,0,0,114,43,0,0,0,41,10,218,7,109,97,114, + 115,104,97,108,90,5,108,111,97,100,115,218,10,105,115,105, + 110,115,116,97,110,99,101,218,10,95,99,111,100,101,95,116, + 121,112,101,114,134,0,0,0,114,149,0,0,0,218,4,95, + 105,109,112,90,16,95,102,105,120,95,99,111,95,102,105,108, + 101,110,97,109,101,114,117,0,0,0,114,61,0,0,0,41, + 5,114,25,0,0,0,114,116,0,0,0,114,106,0,0,0, + 114,107,0,0,0,218,4,99,111,100,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,109, + 112,105,108,101,95,98,121,116,101,99,111,100,101,73,2,0, + 0,115,20,0,0,0,0,2,10,1,10,1,12,1,8,1, + 12,1,4,2,10,1,2,0,2,255,114,165,0,0,0,114, + 72,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, + 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, + 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, + 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, + 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, + 161,1,1,0,124,3,83,0,41,2,122,43,80,114,111,100, + 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, + 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, + 101,100,32,112,121,99,46,114,72,0,0,0,41,6,218,9, + 98,121,116,101,97,114,114,97,121,114,148,0,0,0,218,6, + 101,120,116,101,110,100,114,20,0,0,0,114,160,0,0,0, + 218,5,100,117,109,112,115,41,4,114,164,0,0,0,218,5, + 109,116,105,109,101,114,155,0,0,0,114,25,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,22, + 95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,97, + 109,112,95,112,121,99,86,2,0,0,115,12,0,0,0,0, + 2,8,1,14,1,14,1,14,1,16,1,114,170,0,0,0, + 84,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,80,0,0,0,116, + 0,116,1,131,1,125,3,100,1,124,2,100,1,62,0,66, + 0,125,4,124,3,160,2,116,3,124,4,131,1,161,1,1, + 0,116,4,124,1,131,1,100,2,107,2,115,50,74,0,130, + 1,124,3,160,2,124,1,161,1,1,0,124,3,160,2,116, + 5,160,6,124,0,161,1,161,1,1,0,124,3,83,0,41, + 3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,100, + 97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,98, + 97,115,101,100,32,112,121,99,46,114,38,0,0,0,114,146, + 0,0,0,41,7,114,166,0,0,0,114,148,0,0,0,114, + 167,0,0,0,114,20,0,0,0,114,22,0,0,0,114,160, + 0,0,0,114,168,0,0,0,41,5,114,164,0,0,0,114, + 157,0,0,0,90,7,99,104,101,99,107,101,100,114,25,0, + 0,0,114,82,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,17,95,99,111,100,101,95,116,111, + 95,104,97,115,104,95,112,121,99,96,2,0,0,115,14,0, + 0,0,0,2,8,1,12,1,14,1,16,1,10,1,16,1, + 114,171,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,62, + 0,0,0,100,1,100,2,108,0,125,1,116,1,160,2,124, + 0,161,1,106,3,125,2,124,1,160,4,124,2,161,1,125, + 3,116,1,160,5,100,2,100,3,161,2,125,4,124,4,160, + 6,124,0,160,6,124,3,100,1,25,0,161,1,161,1,83, + 0,41,4,122,121,68,101,99,111,100,101,32,98,121,116,101, + 115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115, + 111,117,114,99,101,32,99,111,100,101,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,115,116,114,105,110,103, + 46,10,10,32,32,32,32,85,110,105,118,101,114,115,97,108, + 32,110,101,119,108,105,110,101,32,115,117,112,112,111,114,116, + 32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32, + 100,101,99,111,100,105,110,103,46,10,32,32,32,32,114,72, + 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, + 101,114,63,0,0,0,90,7,66,121,116,101,115,73,79,90, + 8,114,101,97,100,108,105,110,101,90,15,100,101,116,101,99, + 116,95,101,110,99,111,100,105,110,103,90,25,73,110,99,114, + 101,109,101,110,116,97,108,78,101,119,108,105,110,101,68,101, + 99,111,100,101,114,218,6,100,101,99,111,100,101,41,5,218, + 12,115,111,117,114,99,101,95,98,121,116,101,115,114,172,0, + 0,0,90,21,115,111,117,114,99,101,95,98,121,116,101,115, + 95,114,101,97,100,108,105,110,101,218,8,101,110,99,111,100, + 105,110,103,90,15,110,101,119,108,105,110,101,95,100,101,99, + 111,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, + 99,101,107,2,0,0,115,10,0,0,0,0,5,8,1,12, + 1,10,1,12,1,114,176,0,0,0,169,2,114,140,0,0, + 0,218,26,115,117,98,109,111,100,117,108,101,95,115,101,97, + 114,99,104,95,108,111,99,97,116,105,111,110,115,99,2,0, + 0,0,0,0,0,0,2,0,0,0,9,0,0,0,8,0, + 0,0,67,0,0,0,115,12,1,0,0,124,1,100,1,117, + 0,114,58,100,2,125,1,116,0,124,2,100,3,131,2,114, + 68,122,14,124,2,160,1,124,0,161,1,125,1,87,0,113, + 68,4,0,116,2,121,54,1,0,1,0,1,0,89,0,113, + 68,48,0,110,10,116,3,160,4,124,1,161,1,125,1,116, + 5,106,6,124,0,124,2,124,1,100,4,141,3,125,4,100, + 5,124,4,95,7,124,2,100,1,117,0,114,152,116,8,131, + 0,68,0,93,42,92,2,125,5,125,6,124,1,160,9,116, + 10,124,6,131,1,161,1,114,104,124,5,124,0,124,1,131, + 2,125,2,124,2,124,4,95,11,1,0,113,152,113,104,100, + 1,83,0,124,3,116,12,117,0,114,216,116,0,124,2,100, + 6,131,2,114,222,122,14,124,2,160,13,124,0,161,1,125, + 7,87,0,110,18,4,0,116,2,121,202,1,0,1,0,1, + 0,89,0,113,222,48,0,124,7,114,222,103,0,124,4,95, + 14,110,6,124,3,124,4,95,14,124,4,106,14,103,0,107, + 2,144,1,114,8,124,1,144,1,114,8,116,15,124,1,131, + 1,100,7,25,0,125,8,124,4,106,14,160,16,124,8,161, + 1,1,0,124,4,83,0,41,8,97,61,1,0,0,82,101, + 116,117,114,110,32,97,32,109,111,100,117,108,101,32,115,112, + 101,99,32,98,97,115,101,100,32,111,110,32,97,32,102,105, + 108,101,32,108,111,99,97,116,105,111,110,46,10,10,32,32, + 32,32,84,111,32,105,110,100,105,99,97,116,101,32,116,104, + 97,116,32,116,104,101,32,109,111,100,117,108,101,32,105,115, + 32,97,32,112,97,99,107,97,103,101,44,32,115,101,116,10, + 32,32,32,32,115,117,98,109,111,100,117,108,101,95,115,101, + 97,114,99,104,95,108,111,99,97,116,105,111,110,115,32,116, + 111,32,97,32,108,105,115,116,32,111,102,32,100,105,114,101, + 99,116,111,114,121,32,112,97,116,104,115,46,32,32,65,110, + 10,32,32,32,32,101,109,112,116,121,32,108,105,115,116,32, + 105,115,32,115,117,102,102,105,99,105,101,110,116,44,32,116, + 104,111,117,103,104,32,105,116,115,32,110,111,116,32,111,116, + 104,101,114,119,105,115,101,32,117,115,101,102,117,108,32,116, + 111,32,116,104,101,10,32,32,32,32,105,109,112,111,114,116, + 32,115,121,115,116,101,109,46,10,10,32,32,32,32,84,104, + 101,32,108,111,97,100,101,114,32,109,117,115,116,32,116,97, + 107,101,32,97,32,115,112,101,99,32,97,115,32,105,116,115, + 32,111,110,108,121,32,95,95,105,110,105,116,95,95,40,41, + 32,97,114,103,46,10,10,32,32,32,32,78,122,9,60,117, + 110,107,110,111,119,110,62,218,12,103,101,116,95,102,105,108, + 101,110,97,109,101,169,1,218,6,111,114,105,103,105,110,84, + 218,10,105,115,95,112,97,99,107,97,103,101,114,72,0,0, + 0,41,17,114,128,0,0,0,114,179,0,0,0,114,117,0, + 0,0,114,2,0,0,0,114,78,0,0,0,114,134,0,0, + 0,218,10,77,111,100,117,108,101,83,112,101,99,90,13,95, + 115,101,116,95,102,105,108,101,97,116,116,114,218,27,95,103, + 101,116,95,115,117,112,112,111,114,116,101,100,95,102,105,108, + 101,95,108,111,97,100,101,114,115,114,110,0,0,0,114,111, + 0,0,0,114,140,0,0,0,218,9,95,80,79,80,85,76, + 65,84,69,114,182,0,0,0,114,178,0,0,0,114,46,0, + 0,0,218,6,97,112,112,101,110,100,41,9,114,116,0,0, + 0,90,8,108,111,99,97,116,105,111,110,114,140,0,0,0, + 114,178,0,0,0,218,4,115,112,101,99,218,12,108,111,97, + 100,101,114,95,99,108,97,115,115,218,8,115,117,102,102,105, + 120,101,115,114,182,0,0,0,90,7,100,105,114,110,97,109, + 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,23,115,112,101,99,95,102,114,111,109,95,102,105,108,101, + 95,108,111,99,97,116,105,111,110,124,2,0,0,115,62,0, + 0,0,0,12,8,4,4,1,10,2,2,1,14,1,12,1, + 8,2,10,8,16,1,6,3,8,1,14,1,14,1,10,1, + 6,1,6,2,4,3,8,2,10,1,2,1,14,1,12,1, + 6,2,4,1,8,2,6,1,12,1,6,1,12,1,12,2, + 114,190,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,80, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,90,4,100,3,90,5,100,4,90,6,101,7,100,5,100, + 6,132,0,131,1,90,8,101,7,100,7,100,8,132,0,131, + 1,90,9,101,7,100,14,100,10,100,11,132,1,131,1,90, + 10,101,7,100,15,100,12,100,13,132,1,131,1,90,11,100, + 9,83,0,41,16,218,21,87,105,110,100,111,119,115,82,101, + 103,105,115,116,114,121,70,105,110,100,101,114,122,62,77,101, + 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102, + 111,114,32,109,111,100,117,108,101,115,32,100,101,99,108,97, + 114,101,100,32,105,110,32,116,104,101,32,87,105,110,100,111, + 119,115,32,114,101,103,105,115,116,114,121,46,122,59,83,111, + 102,116,119,97,114,101,92,80,121,116,104,111,110,92,80,121, + 116,104,111,110,67,111,114,101,92,123,115,121,115,95,118,101, + 114,115,105,111,110,125,92,77,111,100,117,108,101,115,92,123, + 102,117,108,108,110,97,109,101,125,122,65,83,111,102,116,119, + 97,114,101,92,80,121,116,104,111,110,92,80,121,116,104,111, + 110,67,111,114,101,92,123,115,121,115,95,118,101,114,115,105, + 111,110,125,92,77,111,100,117,108,101,115,92,123,102,117,108, + 108,110,97,109,101,125,92,68,101,98,117,103,70,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,54,0,0,0,122,16,116,0,160, + 1,116,0,106,2,124,1,161,2,87,0,83,0,4,0,116, + 3,121,48,1,0,1,0,1,0,116,0,160,1,116,0,106, + 4,124,1,161,2,6,0,89,0,83,0,48,0,100,0,83, + 0,114,109,0,0,0,41,5,218,7,95,119,105,110,114,101, + 103,90,7,79,112,101,110,75,101,121,90,17,72,75,69,89, + 95,67,85,82,82,69,78,84,95,85,83,69,82,114,49,0, + 0,0,90,18,72,75,69,89,95,76,79,67,65,76,95,77, + 65,67,72,73,78,69,41,2,218,3,99,108,115,114,5,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,114, + 121,204,2,0,0,115,8,0,0,0,0,2,2,1,16,1, + 12,1,122,36,87,105,110,100,111,119,115,82,101,103,105,115, + 116,114,121,70,105,110,100,101,114,46,95,111,112,101,110,95, + 114,101,103,105,115,116,114,121,99,2,0,0,0,0,0,0, + 0,0,0,0,0,6,0,0,0,8,0,0,0,67,0,0, + 0,115,132,0,0,0,124,0,106,0,114,14,124,0,106,1, + 125,2,110,6,124,0,106,2,125,2,124,2,106,3,124,1, + 100,1,116,4,106,5,100,0,100,2,133,2,25,0,22,0, + 100,3,141,2,125,3,122,58,124,0,160,6,124,3,161,1, + 143,28,125,4,116,7,160,8,124,4,100,4,161,2,125,5, + 87,0,100,0,4,0,4,0,131,3,1,0,110,16,49,0, + 115,94,48,0,1,0,1,0,1,0,89,0,1,0,87,0, + 110,20,4,0,116,9,121,126,1,0,1,0,1,0,89,0, + 100,0,83,0,48,0,124,5,83,0,41,5,78,122,5,37, + 100,46,37,100,114,27,0,0,0,41,2,114,139,0,0,0, + 90,11,115,121,115,95,118,101,114,115,105,111,110,114,39,0, + 0,0,41,10,218,11,68,69,66,85,71,95,66,85,73,76, + 68,218,18,82,69,71,73,83,84,82,89,95,75,69,89,95, + 68,69,66,85,71,218,12,82,69,71,73,83,84,82,89,95, + 75,69,89,114,61,0,0,0,114,8,0,0,0,218,12,118, + 101,114,115,105,111,110,95,105,110,102,111,114,194,0,0,0, + 114,192,0,0,0,90,10,81,117,101,114,121,86,97,108,117, + 101,114,49,0,0,0,41,6,114,193,0,0,0,114,139,0, + 0,0,90,12,114,101,103,105,115,116,114,121,95,107,101,121, + 114,5,0,0,0,90,4,104,107,101,121,218,8,102,105,108, + 101,112,97,116,104,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,16,95,115,101,97,114,99,104,95,114,101, + 103,105,115,116,114,121,211,2,0,0,115,24,0,0,0,0, + 2,6,1,8,2,6,1,6,1,16,255,6,2,2,1,12, + 1,46,1,12,1,8,1,122,38,87,105,110,100,111,119,115, + 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,95, + 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,78, + 99,4,0,0,0,0,0,0,0,0,0,0,0,8,0,0, + 0,8,0,0,0,67,0,0,0,115,120,0,0,0,124,0, + 160,0,124,1,161,1,125,4,124,4,100,0,117,0,114,22, + 100,0,83,0,122,12,116,1,124,4,131,1,1,0,87,0, + 110,20,4,0,116,2,121,54,1,0,1,0,1,0,89,0, + 100,0,83,0,48,0,116,3,131,0,68,0,93,52,92,2, + 125,5,125,6,124,4,160,4,116,5,124,6,131,1,161,1, + 114,62,116,6,106,7,124,1,124,5,124,1,124,4,131,2, + 124,4,100,1,141,3,125,7,124,7,2,0,1,0,83,0, + 113,62,100,0,83,0,41,2,78,114,180,0,0,0,41,8, + 114,200,0,0,0,114,48,0,0,0,114,49,0,0,0,114, + 184,0,0,0,114,110,0,0,0,114,111,0,0,0,114,134, + 0,0,0,218,16,115,112,101,99,95,102,114,111,109,95,108, + 111,97,100,101,114,41,8,114,193,0,0,0,114,139,0,0, + 0,114,43,0,0,0,218,6,116,97,114,103,101,116,114,199, + 0,0,0,114,140,0,0,0,114,189,0,0,0,114,187,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,9,102,105,110,100,95,115,112,101,99,226,2,0,0, + 115,28,0,0,0,0,2,10,1,8,1,4,1,2,1,12, + 1,12,1,8,1,14,1,14,1,6,1,8,1,2,254,6, + 3,122,31,87,105,110,100,111,119,115,82,101,103,105,115,116, + 114,121,70,105,110,100,101,114,46,102,105,110,100,95,115,112, + 101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,34,0,0,0, + 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1, + 117,1,114,26,124,3,106,1,83,0,100,1,83,0,100,1, + 83,0,41,2,122,108,70,105,110,100,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,105,110,32,116,104,101,32,114, + 101,103,105,115,116,114,121,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,78,169,2,114,203,0,0,0,114,140,0,0,0,169, + 4,114,193,0,0,0,114,139,0,0,0,114,43,0,0,0, + 114,187,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,11,102,105,110,100,95,109,111,100,117,108, + 101,242,2,0,0,115,8,0,0,0,0,7,12,1,8,1, + 6,2,122,33,87,105,110,100,111,119,115,82,101,103,105,115, + 116,114,121,70,105,110,100,101,114,46,102,105,110,100,95,109, + 111,100,117,108,101,41,2,78,78,41,1,78,41,12,114,125, + 0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0, + 0,0,114,197,0,0,0,114,196,0,0,0,114,195,0,0, + 0,218,11,99,108,97,115,115,109,101,116,104,111,100,114,194, + 0,0,0,114,200,0,0,0,114,203,0,0,0,114,206,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,191,0,0,0,192,2,0,0,115, + 28,0,0,0,8,2,4,3,2,255,2,4,2,255,2,3, + 4,2,2,1,10,6,2,1,10,14,2,1,12,15,2,1, + 114,191,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,48, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100, + 6,100,7,132,0,90,6,100,8,100,9,132,0,90,7,100, + 10,83,0,41,11,218,13,95,76,111,97,100,101,114,66,97, + 115,105,99,115,122,83,66,97,115,101,32,99,108,97,115,115, + 32,111,102,32,99,111,109,109,111,110,32,99,111,100,101,32, + 110,101,101,100,101,100,32,98,121,32,98,111,116,104,32,83, + 111,117,114,99,101,76,111,97,100,101,114,32,97,110,100,10, + 32,32,32,32,83,111,117,114,99,101,108,101,115,115,70,105, + 108,101,76,111,97,100,101,114,46,99,2,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,4,0,0,0,67,0, + 0,0,115,64,0,0,0,116,0,124,0,160,1,124,1,161, + 1,131,1,100,1,25,0,125,2,124,2,160,2,100,2,100, + 1,161,2,100,3,25,0,125,3,124,1,160,3,100,2,161, + 1,100,4,25,0,125,4,124,3,100,5,107,2,111,62,124, + 4,100,5,107,3,83,0,41,6,122,141,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97, + 100,101,114,46,105,115,95,112,97,99,107,97,103,101,32,98, + 121,32,99,104,101,99,107,105,110,103,32,105,102,10,32,32, + 32,32,32,32,32,32,116,104,101,32,112,97,116,104,32,114, + 101,116,117,114,110,101,100,32,98,121,32,103,101,116,95,102, + 105,108,101,110,97,109,101,32,104,97,115,32,97,32,102,105, + 108,101,110,97,109,101,32,111,102,32,39,95,95,105,110,105, + 116,95,95,46,112,121,39,46,114,38,0,0,0,114,70,0, + 0,0,114,72,0,0,0,114,27,0,0,0,218,8,95,95, + 105,110,105,116,95,95,41,4,114,46,0,0,0,114,179,0, + 0,0,114,42,0,0,0,114,40,0,0,0,41,5,114,118, + 0,0,0,114,139,0,0,0,114,96,0,0,0,90,13,102, + 105,108,101,110,97,109,101,95,98,97,115,101,90,9,116,97, + 105,108,95,110,97,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,182,0,0,0,5,3,0,0,115, + 8,0,0,0,0,3,18,1,16,1,14,1,122,24,95,76, + 111,97,100,101,114,66,97,115,105,99,115,46,105,115,95,112, + 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 4,0,0,0,100,1,83,0,169,2,122,42,85,115,101,32, + 100,101,102,97,117,108,116,32,115,101,109,97,110,116,105,99, + 115,32,102,111,114,32,109,111,100,117,108,101,32,99,114,101, + 97,116,105,111,110,46,78,114,3,0,0,0,169,2,114,118, + 0,0,0,114,187,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,13,99,114,101,97,116,101,95, + 109,111,100,117,108,101,13,3,0,0,115,2,0,0,0,0, + 1,122,27,95,76,111,97,100,101,114,66,97,115,105,99,115, + 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,56,0,0,0,124,0,160,0, + 124,1,106,1,161,1,125,2,124,2,100,1,117,0,114,36, + 116,2,100,2,160,3,124,1,106,1,161,1,131,1,130,1, + 116,4,160,5,116,6,124,2,124,1,106,7,161,3,1,0, + 100,1,83,0,41,3,122,19,69,120,101,99,117,116,101,32, + 116,104,101,32,109,111,100,117,108,101,46,78,122,52,99,97, + 110,110,111,116,32,108,111,97,100,32,109,111,100,117,108,101, + 32,123,33,114,125,32,119,104,101,110,32,103,101,116,95,99, + 111,100,101,40,41,32,114,101,116,117,114,110,115,32,78,111, + 110,101,41,8,218,8,103,101,116,95,99,111,100,101,114,125, + 0,0,0,114,117,0,0,0,114,61,0,0,0,114,134,0, + 0,0,218,25,95,99,97,108,108,95,119,105,116,104,95,102, + 114,97,109,101,115,95,114,101,109,111,118,101,100,218,4,101, + 120,101,99,114,131,0,0,0,41,3,114,118,0,0,0,218, + 6,109,111,100,117,108,101,114,164,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,101,120,101, + 99,95,109,111,100,117,108,101,16,3,0,0,115,12,0,0, + 0,0,2,12,1,8,1,6,1,4,255,6,2,122,25,95, + 76,111,97,100,101,114,66,97,115,105,99,115,46,101,120,101, + 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, + 0,115,12,0,0,0,116,0,160,1,124,0,124,1,161,2, + 83,0,41,1,122,26,84,104,105,115,32,109,111,100,117,108, + 101,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, + 41,2,114,134,0,0,0,218,17,95,108,111,97,100,95,109, + 111,100,117,108,101,95,115,104,105,109,169,2,114,118,0,0, + 0,114,139,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,108,111,97,100,95,109,111,100,117, + 108,101,24,3,0,0,115,2,0,0,0,0,2,122,25,95, + 76,111,97,100,101,114,66,97,115,105,99,115,46,108,111,97, + 100,95,109,111,100,117,108,101,78,41,8,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 182,0,0,0,114,212,0,0,0,114,217,0,0,0,114,220, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,208,0,0,0,0,3,0,0, + 115,10,0,0,0,8,2,4,3,8,8,8,3,8,8,114, + 208,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,74,0, + 0,0,101,0,90,1,100,0,90,2,100,1,100,2,132,0, + 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, + 90,5,100,7,100,8,132,0,90,6,100,9,100,10,132,0, + 90,7,100,11,100,12,156,1,100,13,100,14,132,2,90,8, + 100,15,100,16,132,0,90,9,100,17,83,0,41,18,218,12, + 83,111,117,114,99,101,76,111,97,100,101,114,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,8,0,0,0,116,0,130,1,100,1, + 83,0,41,2,122,165,79,112,116,105,111,110,97,108,32,109, + 101,116,104,111,100,32,116,104,97,116,32,114,101,116,117,114, + 110,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116, + 105,111,110,32,116,105,109,101,32,40,97,110,32,105,110,116, + 41,32,102,111,114,32,116,104,101,10,32,32,32,32,32,32, + 32,32,115,112,101,99,105,102,105,101,100,32,112,97,116,104, + 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, + 32,32,32,82,97,105,115,101,115,32,79,83,69,114,114,111, + 114,32,119,104,101,110,32,116,104,101,32,112,97,116,104,32, + 99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101, + 100,46,10,32,32,32,32,32,32,32,32,78,41,1,114,49, + 0,0,0,169,2,114,118,0,0,0,114,43,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, + 112,97,116,104,95,109,116,105,109,101,31,3,0,0,115,2, + 0,0,0,0,6,122,23,83,111,117,114,99,101,76,111,97, + 100,101,114,46,112,97,116,104,95,109,116,105,109,101,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,67,0,0,0,115,14,0,0,0,100,1,124,0, + 160,0,124,1,161,1,105,1,83,0,41,2,97,158,1,0, + 0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,114,101,116,117,114,110,105,110,103,32,97,32,109,101,116, + 97,100,97,116,97,32,100,105,99,116,32,102,111,114,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,10,32,32,32, + 32,32,32,32,32,112,97,116,104,32,40,97,32,115,116,114, + 41,46,10,10,32,32,32,32,32,32,32,32,80,111,115,115, + 105,98,108,101,32,107,101,121,115,58,10,32,32,32,32,32, + 32,32,32,45,32,39,109,116,105,109,101,39,32,40,109,97, + 110,100,97,116,111,114,121,41,32,105,115,32,116,104,101,32, + 110,117,109,101,114,105,99,32,116,105,109,101,115,116,97,109, + 112,32,111,102,32,108,97,115,116,32,115,111,117,114,99,101, + 10,32,32,32,32,32,32,32,32,32,32,99,111,100,101,32, + 109,111,100,105,102,105,99,97,116,105,111,110,59,10,32,32, + 32,32,32,32,32,32,45,32,39,115,105,122,101,39,32,40, + 111,112,116,105,111,110,97,108,41,32,105,115,32,116,104,101, + 32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,111, + 102,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100, + 101,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, + 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, + 116,104,111,100,32,97,108,108,111,119,115,32,116,104,101,32, + 108,111,97,100,101,114,32,116,111,32,114,101,97,100,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,32, + 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, + 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, + 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, + 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,114, + 169,0,0,0,41,1,114,223,0,0,0,114,222,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 13,99,114,101,97,116,101,95,109,111,100,117,108,101,12,3, - 0,0,115,2,0,0,0,0,1,122,27,95,76,111,97,100, - 101,114,66,97,115,105,99,115,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 56,0,0,0,124,0,160,0,124,1,106,1,161,1,125,2, - 124,2,100,1,117,0,114,36,116,2,100,2,160,3,124,1, - 106,1,161,1,131,1,130,1,116,4,160,5,116,6,124,2, - 124,1,106,7,161,3,1,0,100,1,83,0,41,3,122,19, - 69,120,101,99,117,116,101,32,116,104,101,32,109,111,100,117, - 108,101,46,78,122,52,99,97,110,110,111,116,32,108,111,97, - 100,32,109,111,100,117,108,101,32,123,33,114,125,32,119,104, - 101,110,32,103,101,116,95,99,111,100,101,40,41,32,114,101, - 116,117,114,110,115,32,78,111,110,101,41,8,218,8,103,101, - 116,95,99,111,100,101,114,125,0,0,0,114,117,0,0,0, - 114,61,0,0,0,114,134,0,0,0,218,25,95,99,97,108, - 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101, - 109,111,118,101,100,218,4,101,120,101,99,114,131,0,0,0, - 41,3,114,118,0,0,0,218,6,109,111,100,117,108,101,114, - 164,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,101, - 15,3,0,0,115,12,0,0,0,0,2,12,1,8,1,6, - 1,4,255,6,2,122,25,95,76,111,97,100,101,114,66,97, - 115,105,99,115,46,101,120,101,99,95,109,111,100,117,108,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,67,0,0,0,115,12,0,0,0,116,0, - 160,1,124,0,124,1,161,2,83,0,41,1,122,26,84,104, - 105,115,32,109,111,100,117,108,101,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,41,2,114,134,0,0,0,218, - 17,95,108,111,97,100,95,109,111,100,117,108,101,95,115,104, - 105,109,169,2,114,118,0,0,0,114,139,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,108, - 111,97,100,95,109,111,100,117,108,101,23,3,0,0,115,2, - 0,0,0,0,2,122,25,95,76,111,97,100,101,114,66,97, - 115,105,99,115,46,108,111,97,100,95,109,111,100,117,108,101, - 78,41,8,114,125,0,0,0,114,124,0,0,0,114,126,0, - 0,0,114,127,0,0,0,114,182,0,0,0,114,212,0,0, - 0,114,217,0,0,0,114,220,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 208,0,0,0,255,2,0,0,115,10,0,0,0,8,2,4, - 3,8,8,8,3,8,8,114,208,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,64,0,0,0,115,74,0,0,0,101,0,90,1,100,0, - 90,2,100,1,100,2,132,0,90,3,100,3,100,4,132,0, - 90,4,100,5,100,6,132,0,90,5,100,7,100,8,132,0, - 90,6,100,9,100,10,132,0,90,7,100,11,100,12,156,1, - 100,13,100,14,132,2,90,8,100,15,100,16,132,0,90,9, - 100,17,83,0,41,18,218,12,83,111,117,114,99,101,76,111, - 97,100,101,114,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,8,0, - 0,0,116,0,130,1,100,1,83,0,41,2,122,165,79,112, - 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104, - 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109, - 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101, - 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104, - 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102, - 105,101,100,32,112,97,116,104,32,40,97,32,115,116,114,41, - 46,10,10,32,32,32,32,32,32,32,32,82,97,105,115,101, - 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, - 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, - 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, - 32,32,32,78,41,1,114,49,0,0,0,169,2,114,118,0, - 0,0,114,43,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,10,112,97,116,104,95,109,116,105, - 109,101,30,3,0,0,115,2,0,0,0,0,6,122,23,83, - 111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,104, - 95,109,116,105,109,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, - 14,0,0,0,100,1,124,0,160,0,124,1,161,1,105,1, - 83,0,41,2,97,158,1,0,0,79,112,116,105,111,110,97, - 108,32,109,101,116,104,111,100,32,114,101,116,117,114,110,105, - 110,103,32,97,32,109,101,116,97,100,97,116,97,32,100,105, - 99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,10,32,32,32,32,32,32,32,32,112,97,116, + 10,112,97,116,104,95,115,116,97,116,115,39,3,0,0,115, + 2,0,0,0,0,12,122,23,83,111,117,114,99,101,76,111, + 97,100,101,114,46,112,97,116,104,95,115,116,97,116,115,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 4,0,0,0,67,0,0,0,115,12,0,0,0,124,0,160, + 0,124,2,124,3,161,2,83,0,41,1,122,228,79,112,116, + 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, + 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, + 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, + 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, + 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, + 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, + 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, + 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,115,46,10,10,32,32,32,32, + 32,32,32,32,84,104,101,32,115,111,117,114,99,101,32,112, + 97,116,104,32,105,115,32,110,101,101,100,101,100,32,105,110, + 32,111,114,100,101,114,32,116,111,32,99,111,114,114,101,99, + 116,108,121,32,116,114,97,110,115,102,101,114,32,112,101,114, + 109,105,115,115,105,111,110,115,10,32,32,32,32,32,32,32, + 32,41,1,218,8,115,101,116,95,100,97,116,97,41,4,114, + 118,0,0,0,114,107,0,0,0,90,10,99,97,99,104,101, + 95,112,97,116,104,114,25,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,15,95,99,97,99,104, + 101,95,98,121,116,101,99,111,100,101,53,3,0,0,115,2, + 0,0,0,0,8,122,28,83,111,117,114,99,101,76,111,97, + 100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,99, + 111,100,101,99,3,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,150,79,112,116,105,111,110,97, + 108,32,109,101,116,104,111,100,32,119,104,105,99,104,32,119, + 114,105,116,101,115,32,100,97,116,97,32,40,98,121,116,101, + 115,41,32,116,111,32,97,32,102,105,108,101,32,112,97,116, 104,32,40,97,32,115,116,114,41,46,10,10,32,32,32,32, - 32,32,32,32,80,111,115,115,105,98,108,101,32,107,101,121, - 115,58,10,32,32,32,32,32,32,32,32,45,32,39,109,116, - 105,109,101,39,32,40,109,97,110,100,97,116,111,114,121,41, - 32,105,115,32,116,104,101,32,110,117,109,101,114,105,99,32, - 116,105,109,101,115,116,97,109,112,32,111,102,32,108,97,115, - 116,32,115,111,117,114,99,101,10,32,32,32,32,32,32,32, - 32,32,32,99,111,100,101,32,109,111,100,105,102,105,99,97, - 116,105,111,110,59,10,32,32,32,32,32,32,32,32,45,32, - 39,115,105,122,101,39,32,40,111,112,116,105,111,110,97,108, - 41,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110, - 32,98,121,116,101,115,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,99,111,100,101,46,10,10,32,32,32,32, 32,32,32,32,73,109,112,108,101,109,101,110,116,105,110,103, 32,116,104,105,115,32,109,101,116,104,111,100,32,97,108,108, - 111,119,115,32,116,104,101,32,108,111,97,100,101,114,32,116, - 111,32,114,101,97,100,32,98,121,116,101,99,111,100,101,32, - 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,82, - 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, - 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, - 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, - 32,32,32,32,32,32,32,114,169,0,0,0,41,1,114,223, - 0,0,0,114,222,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,10,112,97,116,104,95,115,116, - 97,116,115,38,3,0,0,115,2,0,0,0,0,12,122,23, - 83,111,117,114,99,101,76,111,97,100,101,114,46,112,97,116, - 104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, - 115,12,0,0,0,124,0,160,0,124,2,124,3,161,2,83, - 0,41,1,122,228,79,112,116,105,111,110,97,108,32,109,101, - 116,104,111,100,32,119,104,105,99,104,32,119,114,105,116,101, - 115,32,100,97,116,97,32,40,98,121,116,101,115,41,32,116, - 111,32,97,32,102,105,108,101,32,112,97,116,104,32,40,97, - 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, - 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, - 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, - 102,111,114,32,116,104,101,32,119,114,105,116,105,110,103,32, - 111,102,32,98,121,116,101,99,111,100,101,32,102,105,108,101, - 115,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, - 115,111,117,114,99,101,32,112,97,116,104,32,105,115,32,110, - 101,101,100,101,100,32,105,110,32,111,114,100,101,114,32,116, - 111,32,99,111,114,114,101,99,116,108,121,32,116,114,97,110, - 115,102,101,114,32,112,101,114,109,105,115,115,105,111,110,115, - 10,32,32,32,32,32,32,32,32,41,1,218,8,115,101,116, - 95,100,97,116,97,41,4,114,118,0,0,0,114,107,0,0, - 0,90,10,99,97,99,104,101,95,112,97,116,104,114,25,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,15,95,99,97,99,104,101,95,98,121,116,101,99,111, - 100,101,52,3,0,0,115,2,0,0,0,0,8,122,28,83, - 111,117,114,99,101,76,111,97,100,101,114,46,95,99,97,99, - 104,101,95,98,121,116,101,99,111,100,101,99,3,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, - 150,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, - 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, - 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, - 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, - 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, - 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, - 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,32, - 32,32,32,32,32,32,32,78,114,3,0,0,0,41,3,114, - 118,0,0,0,114,43,0,0,0,114,25,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0, - 0,0,62,3,0,0,115,2,0,0,0,0,1,122,21,83, - 111,117,114,99,101,76,111,97,100,101,114,46,115,101,116,95, - 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,10,0,0,0,67,0,0,0,115,84,0, - 0,0,124,0,160,0,124,1,161,1,125,2,122,14,124,0, - 160,1,124,2,161,1,125,3,87,0,110,50,4,0,116,2, - 121,74,1,0,125,4,1,0,122,26,116,3,100,1,124,1, - 100,2,141,2,124,4,130,2,87,0,89,0,100,3,125,4, - 126,4,110,10,100,3,125,4,126,4,48,0,48,0,116,4, - 124,3,131,1,83,0,41,4,122,52,67,111,110,99,114,101, - 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,32,111,102,32,73,110,115,112,101,99,116,76,111,97,100, - 101,114,46,103,101,116,95,115,111,117,114,99,101,46,122,39, - 115,111,117,114,99,101,32,110,111,116,32,97,118,97,105,108, - 97,98,108,101,32,116,104,114,111,117,103,104,32,103,101,116, - 95,100,97,116,97,40,41,114,115,0,0,0,78,41,5,114, - 179,0,0,0,218,8,103,101,116,95,100,97,116,97,114,49, - 0,0,0,114,117,0,0,0,114,176,0,0,0,41,5,114, - 118,0,0,0,114,139,0,0,0,114,43,0,0,0,114,174, - 0,0,0,218,3,101,120,99,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,69,3,0,0,115,20,0,0,0,0,2,10,1, - 2,1,14,1,14,1,4,1,2,255,4,1,2,255,24,2, - 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,114,104,0,0,0,41,1, - 218,9,95,111,112,116,105,109,105,122,101,99,3,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0, - 67,0,0,0,115,22,0,0,0,116,0,106,1,116,2,124, - 1,124,2,100,1,100,2,124,3,100,3,141,6,83,0,41, - 4,122,130,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,99,111,109,112,105,108, - 101,100,32,102,114,111,109,32,115,111,117,114,99,101,46,10, - 10,32,32,32,32,32,32,32,32,84,104,101,32,39,100,97, - 116,97,39,32,97,114,103,117,109,101,110,116,32,99,97,110, - 32,98,101,32,97,110,121,32,111,98,106,101,99,116,32,116, - 121,112,101,32,116,104,97,116,32,99,111,109,112,105,108,101, - 40,41,32,115,117,112,112,111,114,116,115,46,10,32,32,32, - 32,32,32,32,32,114,215,0,0,0,84,41,2,218,12,100, - 111,110,116,95,105,110,104,101,114,105,116,114,83,0,0,0, - 41,3,114,134,0,0,0,114,214,0,0,0,218,7,99,111, - 109,112,105,108,101,41,4,114,118,0,0,0,114,25,0,0, - 0,114,43,0,0,0,114,230,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,14,115,111,117,114, - 99,101,95,116,111,95,99,111,100,101,79,3,0,0,115,8, - 0,0,0,0,5,12,1,2,0,2,255,122,27,83,111,117, - 114,99,101,76,111,97,100,101,114,46,115,111,117,114,99,101, - 95,116,111,95,99,111,100,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,15,0,0,0,9,0,0,0,67,0,0, - 0,115,24,2,0,0,124,0,160,0,124,1,161,1,125,2, - 100,1,125,3,100,1,125,4,100,1,125,5,100,2,125,6, - 100,3,125,7,122,12,116,1,124,2,131,1,125,8,87,0, - 110,24,4,0,116,2,121,66,1,0,1,0,1,0,100,1, - 125,8,89,0,144,1,110,42,48,0,122,14,124,0,160,3, - 124,2,161,1,125,9,87,0,110,20,4,0,116,4,121,102, - 1,0,1,0,1,0,89,0,144,1,110,6,48,0,116,5, - 124,9,100,4,25,0,131,1,125,3,122,14,124,0,160,6, - 124,8,161,1,125,10,87,0,110,18,4,0,116,4,121,148, - 1,0,1,0,1,0,89,0,110,216,48,0,124,1,124,8, - 100,5,156,2,125,11,122,148,116,7,124,10,124,1,124,11, - 131,3,125,12,116,8,124,10,131,1,100,6,100,1,133,2, - 25,0,125,13,124,12,100,7,64,0,100,8,107,3,125,6, - 124,6,144,1,114,30,124,12,100,9,64,0,100,8,107,3, - 125,7,116,9,106,10,100,10,107,3,144,1,114,50,124,7, - 115,248,116,9,106,10,100,11,107,2,144,1,114,50,124,0, - 160,6,124,2,161,1,125,4,116,9,160,11,116,12,124,4, - 161,2,125,5,116,13,124,10,124,5,124,1,124,11,131,4, - 1,0,110,20,116,14,124,10,124,3,124,9,100,12,25,0, - 124,1,124,11,131,5,1,0,87,0,110,24,4,0,116,15, - 116,16,102,2,144,1,121,76,1,0,1,0,1,0,89,0, - 110,32,48,0,116,17,160,18,100,13,124,8,124,2,161,3, - 1,0,116,19,124,13,124,1,124,8,124,2,100,14,141,4, - 83,0,124,4,100,1,117,0,144,1,114,128,124,0,160,6, - 124,2,161,1,125,4,124,0,160,20,124,4,124,2,161,2, - 125,14,116,17,160,18,100,15,124,2,161,2,1,0,116,21, - 106,22,144,2,115,20,124,8,100,1,117,1,144,2,114,20, - 124,3,100,1,117,1,144,2,114,20,124,6,144,1,114,220, - 124,5,100,1,117,0,144,1,114,206,116,9,160,11,124,4, - 161,1,125,5,116,23,124,14,124,5,124,7,131,3,125,10, - 110,16,116,24,124,14,124,3,116,25,124,4,131,1,131,3, - 125,10,122,18,124,0,160,26,124,2,124,8,124,10,161,3, - 1,0,87,0,110,20,4,0,116,2,144,2,121,18,1,0, - 1,0,1,0,89,0,110,2,48,0,124,14,83,0,41,16, - 122,190,67,111,110,99,114,101,116,101,32,105,109,112,108,101, + 111,119,115,32,102,111,114,32,116,104,101,32,119,114,105,116, + 105,110,103,32,111,102,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,115,46,10,32,32,32,32,32,32,32,32,78, + 114,3,0,0,0,41,3,114,118,0,0,0,114,43,0,0, + 0,114,25,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,225,0,0,0,63,3,0,0,115,2, + 0,0,0,0,1,122,21,83,111,117,114,99,101,76,111,97, + 100,101,114,46,115,101,116,95,100,97,116,97,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,10,0,0, + 0,67,0,0,0,115,84,0,0,0,124,0,160,0,124,1, + 161,1,125,2,122,14,124,0,160,1,124,2,161,1,125,3, + 87,0,110,50,4,0,116,2,121,74,1,0,125,4,1,0, + 122,26,116,3,100,1,124,1,100,2,141,2,124,4,130,2, + 87,0,89,0,100,3,125,4,126,4,110,10,100,3,125,4, + 126,4,48,0,48,0,116,4,124,3,131,1,83,0,41,4, + 122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,101, 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, - 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,99, - 111,100,101,46,10,10,32,32,32,32,32,32,32,32,82,101, - 97,100,105,110,103,32,111,102,32,98,121,116,101,99,111,100, - 101,32,114,101,113,117,105,114,101,115,32,112,97,116,104,95, - 115,116,97,116,115,32,116,111,32,98,101,32,105,109,112,108, - 101,109,101,110,116,101,100,46,32,84,111,32,119,114,105,116, - 101,10,32,32,32,32,32,32,32,32,98,121,116,101,99,111, - 100,101,44,32,115,101,116,95,100,97,116,97,32,109,117,115, - 116,32,97,108,115,111,32,98,101,32,105,109,112,108,101,109, - 101,110,116,101,100,46,10,10,32,32,32,32,32,32,32,32, - 78,70,84,114,169,0,0,0,114,159,0,0,0,114,145,0, - 0,0,114,38,0,0,0,114,72,0,0,0,114,27,0,0, - 0,90,5,110,101,118,101,114,90,6,97,108,119,97,121,115, - 218,4,115,105,122,101,122,13,123,125,32,109,97,116,99,104, - 101,115,32,123,125,41,3,114,116,0,0,0,114,106,0,0, - 0,114,107,0,0,0,122,19,99,111,100,101,32,111,98,106, - 101,99,116,32,102,114,111,109,32,123,125,41,27,114,179,0, - 0,0,114,97,0,0,0,114,81,0,0,0,114,224,0,0, - 0,114,49,0,0,0,114,17,0,0,0,114,227,0,0,0, - 114,152,0,0,0,218,10,109,101,109,111,114,121,118,105,101, - 119,114,163,0,0,0,90,21,99,104,101,99,107,95,104,97, - 115,104,95,98,97,115,101,100,95,112,121,99,115,114,157,0, - 0,0,218,17,95,82,65,87,95,77,65,71,73,67,95,78, - 85,77,66,69,82,114,158,0,0,0,114,156,0,0,0,114, - 117,0,0,0,114,150,0,0,0,114,134,0,0,0,114,149, - 0,0,0,114,165,0,0,0,114,233,0,0,0,114,8,0, - 0,0,218,19,100,111,110,116,95,119,114,105,116,101,95,98, - 121,116,101,99,111,100,101,114,171,0,0,0,114,170,0,0, - 0,114,22,0,0,0,114,226,0,0,0,41,15,114,118,0, - 0,0,114,139,0,0,0,114,107,0,0,0,114,154,0,0, - 0,114,174,0,0,0,114,157,0,0,0,90,10,104,97,115, - 104,95,98,97,115,101,100,90,12,99,104,101,99,107,95,115, - 111,117,114,99,101,114,106,0,0,0,218,2,115,116,114,25, - 0,0,0,114,151,0,0,0,114,82,0,0,0,90,10,98, - 121,116,101,115,95,100,97,116,97,90,11,99,111,100,101,95, - 111,98,106,101,99,116,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,213,0,0,0,87,3,0,0,115,152, - 0,0,0,0,7,10,1,4,1,4,1,4,1,4,1,4, - 1,2,1,12,1,12,1,12,2,2,1,14,1,12,1,8, - 2,12,1,2,1,14,1,12,1,6,3,2,1,2,254,6, - 4,2,1,12,1,16,1,12,1,6,1,12,1,12,1,2, - 255,2,2,8,254,4,3,10,1,4,1,2,1,2,254,4, - 4,8,1,2,255,6,3,2,1,2,1,2,1,6,1,2, - 1,2,251,8,7,18,1,6,2,8,1,2,255,4,2,6, - 1,2,1,2,254,6,3,10,1,10,1,12,1,12,1,18, - 1,6,255,4,2,6,1,10,1,10,1,14,2,6,1,6, - 255,4,2,2,1,18,1,14,1,6,1,122,21,83,111,117, - 114,99,101,76,111,97,100,101,114,46,103,101,116,95,99,111, - 100,101,78,41,10,114,125,0,0,0,114,124,0,0,0,114, - 126,0,0,0,114,223,0,0,0,114,224,0,0,0,114,226, - 0,0,0,114,225,0,0,0,114,229,0,0,0,114,233,0, - 0,0,114,213,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,221,0,0,0, - 28,3,0,0,115,14,0,0,0,8,2,8,8,8,14,8, - 10,8,7,8,10,14,8,114,221,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,0,0,0,0,115,124,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,100,7,132,0,90,6,101,7, - 135,0,102,1,100,8,100,9,132,8,131,1,90,8,101,7, - 100,10,100,11,132,0,131,1,90,9,100,12,100,13,132,0, - 90,10,101,7,100,14,100,15,132,0,131,1,90,11,100,16, - 100,17,132,0,90,12,100,18,100,19,132,0,90,13,100,20, - 100,21,132,0,90,14,100,22,100,23,132,0,90,15,135,0, - 4,0,90,16,83,0,41,24,218,10,70,105,108,101,76,111, - 97,100,101,114,122,103,66,97,115,101,32,102,105,108,101,32, - 108,111,97,100,101,114,32,99,108,97,115,115,32,119,104,105, - 99,104,32,105,109,112,108,101,109,101,110,116,115,32,116,104, - 101,32,108,111,97,100,101,114,32,112,114,111,116,111,99,111, - 108,32,109,101,116,104,111,100,115,32,116,104,97,116,10,32, - 32,32,32,114,101,113,117,105,114,101,32,102,105,108,101,32, - 115,121,115,116,101,109,32,117,115,97,103,101,46,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, - 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, - 0,124,2,124,0,95,1,100,1,83,0,41,2,122,75,67, - 97,99,104,101,32,116,104,101,32,109,111,100,117,108,101,32, - 110,97,109,101,32,97,110,100,32,116,104,101,32,112,97,116, - 104,32,116,111,32,116,104,101,32,102,105,108,101,32,102,111, - 117,110,100,32,98,121,32,116,104,101,10,32,32,32,32,32, - 32,32,32,102,105,110,100,101,114,46,78,114,159,0,0,0, - 41,3,114,118,0,0,0,114,139,0,0,0,114,43,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,209,0,0,0,177,3,0,0,115,4,0,0,0,0,3, - 6,1,122,19,70,105,108,101,76,111,97,100,101,114,46,95, - 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, - 115,24,0,0,0,124,0,106,0,124,1,106,0,107,2,111, - 22,124,0,106,1,124,1,106,1,107,2,83,0,114,109,0, - 0,0,169,2,218,9,95,95,99,108,97,115,115,95,95,114, - 131,0,0,0,169,2,114,118,0,0,0,90,5,111,116,104, - 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,6,95,95,101,113,95,95,183,3,0,0,115,6,0, - 0,0,0,1,12,1,10,255,122,17,70,105,108,101,76,111, - 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, - 1,116,0,124,0,106,2,131,1,65,0,83,0,114,109,0, - 0,0,169,3,218,4,104,97,115,104,114,116,0,0,0,114, - 43,0,0,0,169,1,114,118,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,8,95,95,104,97, - 115,104,95,95,187,3,0,0,115,2,0,0,0,0,1,122, - 19,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, - 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,3,0,0,0,115,16,0, - 0,0,116,0,116,1,124,0,131,2,160,2,124,1,161,1, - 83,0,41,1,122,100,76,111,97,100,32,97,32,109,111,100, - 117,108,101,32,102,114,111,109,32,97,32,102,105,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,41,3,218,5,115,117, - 112,101,114,114,239,0,0,0,114,220,0,0,0,114,219,0, - 0,0,169,1,114,241,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,220,0,0,0,190,3,0,0,115,2,0,0, - 0,0,10,122,22,70,105,108,101,76,111,97,100,101,114,46, - 108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,169, - 1,122,58,82,101,116,117,114,110,32,116,104,101,32,112,97, - 116,104,32,116,111,32,116,104,101,32,115,111,117,114,99,101, - 32,102,105,108,101,32,97,115,32,102,111,117,110,100,32,98, - 121,32,116,104,101,32,102,105,110,100,101,114,46,114,47,0, - 0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,179,0,0,0,202,3,0,0,115, - 2,0,0,0,0,3,122,23,70,105,108,101,76,111,97,100, - 101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 8,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, - 0,116,1,116,2,102,2,131,2,114,70,116,3,160,4,116, - 5,124,1,131,1,161,1,143,24,125,2,124,2,160,6,161, - 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, - 0,49,0,115,58,48,0,1,0,1,0,1,0,89,0,1, - 0,110,52,116,3,160,7,124,1,100,2,161,2,143,24,125, - 2,124,2,160,6,161,0,87,0,2,0,100,1,4,0,4, - 0,131,3,1,0,83,0,49,0,115,112,48,0,1,0,1, - 0,1,0,89,0,1,0,100,1,83,0,41,3,122,39,82, - 101,116,117,114,110,32,116,104,101,32,100,97,116,97,32,102, - 114,111,109,32,112,97,116,104,32,97,115,32,114,97,119,32, - 98,121,116,101,115,46,78,218,1,114,41,8,114,161,0,0, - 0,114,221,0,0,0,218,19,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,114,63,0,0,0, - 90,9,111,112,101,110,95,99,111,100,101,114,84,0,0,0, - 90,4,114,101,97,100,114,64,0,0,0,41,3,114,118,0, - 0,0,114,43,0,0,0,114,67,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,227,0,0,0, - 207,3,0,0,115,10,0,0,0,0,2,14,1,16,1,40, - 2,14,1,122,19,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,100,97,116,97,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, - 0,115,18,0,0,0,124,0,160,0,124,1,161,1,114,14, - 124,0,83,0,100,0,83,0,114,109,0,0,0,41,1,114, - 182,0,0,0,169,2,114,118,0,0,0,114,216,0,0,0, + 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,110, + 111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,114, + 111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,114, + 115,0,0,0,78,41,5,114,179,0,0,0,218,8,103,101, + 116,95,100,97,116,97,114,49,0,0,0,114,117,0,0,0, + 114,176,0,0,0,41,5,114,118,0,0,0,114,139,0,0, + 0,114,43,0,0,0,114,174,0,0,0,218,3,101,120,99, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101, - 97,100,101,114,218,3,0,0,115,6,0,0,0,0,2,10, - 1,4,1,122,30,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,4,0,0,0,67,0,0,0,115,32,0,0, - 0,116,0,116,1,124,0,106,2,131,1,100,1,25,0,124, - 1,131,2,125,2,116,3,160,4,124,2,100,2,161,2,83, - 0,41,3,78,114,72,0,0,0,114,251,0,0,0,41,5, - 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, - 63,0,0,0,114,64,0,0,0,169,3,114,118,0,0,0, - 90,8,114,101,115,111,117,114,99,101,114,43,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, - 111,112,101,110,95,114,101,115,111,117,114,99,101,224,3,0, - 0,115,4,0,0,0,0,1,20,1,122,24,70,105,108,101, - 76,111,97,100,101,114,46,111,112,101,110,95,114,101,115,111, - 117,114,99,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,67,0,0,0,115,38,0, - 0,0,124,0,160,0,124,1,161,1,115,14,116,1,130,1, - 116,2,116,3,124,0,106,4,131,1,100,1,25,0,124,1, - 131,2,125,2,124,2,83,0,169,2,78,114,72,0,0,0, - 41,5,218,11,105,115,95,114,101,115,111,117,114,99,101,218, - 17,70,105,108,101,78,111,116,70,111,117,110,100,69,114,114, - 111,114,114,37,0,0,0,114,46,0,0,0,114,43,0,0, - 0,114,255,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,13,114,101,115,111,117,114,99,101,95, - 112,97,116,104,228,3,0,0,115,8,0,0,0,0,1,10, - 1,4,1,20,1,122,24,70,105,108,101,76,111,97,100,101, - 114,46,114,101,115,111,117,114,99,101,95,112,97,116,104,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,40,0,0,0,116,0,124, - 1,118,0,114,12,100,1,83,0,116,1,116,2,124,0,106, - 3,131,1,100,2,25,0,124,1,131,2,125,2,116,4,124, - 2,131,1,83,0,41,3,78,70,114,72,0,0,0,41,5, - 114,34,0,0,0,114,37,0,0,0,114,46,0,0,0,114, - 43,0,0,0,114,53,0,0,0,169,3,114,118,0,0,0, - 114,116,0,0,0,114,43,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,2,1,0,0,234,3, - 0,0,115,8,0,0,0,0,1,8,1,4,1,20,1,122, - 22,70,105,108,101,76,111,97,100,101,114,46,105,115,95,114, - 101,115,111,117,114,99,101,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,5,0,0,0,67,0,0,0, - 115,24,0,0,0,116,0,116,1,160,2,116,3,124,0,106, - 4,131,1,100,1,25,0,161,1,131,1,83,0,114,1,1, - 0,0,41,5,218,4,105,116,101,114,114,2,0,0,0,218, - 7,108,105,115,116,100,105,114,114,46,0,0,0,114,43,0, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,8,99,111,110,116,101,110,116,115, - 240,3,0,0,115,2,0,0,0,0,1,122,19,70,105,108, - 101,76,111,97,100,101,114,46,99,111,110,116,101,110,116,115, - 41,17,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,127,0,0,0,114,209,0,0,0,114,243,0,0,0, - 114,247,0,0,0,114,136,0,0,0,114,220,0,0,0,114, - 179,0,0,0,114,227,0,0,0,114,254,0,0,0,114,0, - 1,0,0,114,4,1,0,0,114,2,1,0,0,114,8,1, - 0,0,90,13,95,95,99,108,97,115,115,99,101,108,108,95, - 95,114,3,0,0,0,114,3,0,0,0,114,249,0,0,0, - 114,6,0,0,0,114,239,0,0,0,172,3,0,0,115,30, - 0,0,0,8,2,4,3,8,6,8,4,8,3,2,1,14, - 11,2,1,10,4,8,11,2,1,10,5,8,4,8,6,8, - 6,114,239,0,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 46,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,156,1,100,8,100,9,132,2,90,6,100,10, - 83,0,41,11,218,16,83,111,117,114,99,101,70,105,108,101, - 76,111,97,100,101,114,122,62,67,111,110,99,114,101,116,101, - 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, - 111,102,32,83,111,117,114,99,101,76,111,97,100,101,114,32, - 117,115,105,110,103,32,116,104,101,32,102,105,108,101,32,115, - 121,115,116,101,109,46,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, - 22,0,0,0,116,0,124,1,131,1,125,2,124,2,106,1, - 124,2,106,2,100,1,156,2,83,0,41,2,122,33,82,101, - 116,117,114,110,32,116,104,101,32,109,101,116,97,100,97,116, - 97,32,102,111,114,32,116,104,101,32,112,97,116,104,46,41, - 2,114,169,0,0,0,114,234,0,0,0,41,3,114,48,0, - 0,0,218,8,115,116,95,109,116,105,109,101,90,7,115,116, - 95,115,105,122,101,41,3,114,118,0,0,0,114,43,0,0, - 0,114,238,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,224,0,0,0,248,3,0,0,115,4, - 0,0,0,0,2,8,1,122,27,83,111,117,114,99,101,70, - 105,108,101,76,111,97,100,101,114,46,112,97,116,104,95,115, - 116,97,116,115,99,4,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,24,0, - 0,0,116,0,124,1,131,1,125,4,124,0,106,1,124,2, - 124,3,124,4,100,1,141,3,83,0,41,2,78,169,1,218, - 5,95,109,111,100,101,41,2,114,114,0,0,0,114,225,0, - 0,0,41,5,114,118,0,0,0,114,107,0,0,0,114,106, - 0,0,0,114,25,0,0,0,114,51,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,226,0,0, - 0,253,3,0,0,115,4,0,0,0,0,2,8,1,122,32, - 83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,114, - 46,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, - 114,59,0,0,0,114,11,1,0,0,99,3,0,0,0,0, - 0,0,0,1,0,0,0,9,0,0,0,11,0,0,0,67, - 0,0,0,115,252,0,0,0,116,0,124,1,131,1,92,2, - 125,4,125,5,103,0,125,6,124,4,114,52,116,1,124,4, - 131,1,115,52,116,0,124,4,131,1,92,2,125,4,125,7, - 124,6,160,2,124,7,161,1,1,0,113,16,116,3,124,6, - 131,1,68,0,93,104,125,7,116,4,124,4,124,7,131,2, - 125,4,122,14,116,5,160,6,124,4,161,1,1,0,87,0, - 113,60,4,0,116,7,121,110,1,0,1,0,1,0,89,0, - 113,60,89,0,113,60,4,0,116,8,121,162,1,0,125,8, - 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, - 1,0,87,0,89,0,100,2,125,8,126,8,1,0,100,2, - 83,0,100,2,125,8,126,8,48,0,48,0,113,60,122,28, - 116,11,124,1,124,2,124,3,131,3,1,0,116,9,160,10, - 100,3,124,1,161,2,1,0,87,0,110,52,4,0,116,8, - 144,0,121,246,1,0,125,8,1,0,122,26,116,9,160,10, - 100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,2, - 125,8,126,8,110,10,100,2,125,8,126,8,48,0,48,0, - 100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121, - 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, - 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, - 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, - 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, - 12,114,46,0,0,0,114,55,0,0,0,114,186,0,0,0, - 114,41,0,0,0,114,37,0,0,0,114,2,0,0,0,90, - 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,114,49,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,68,0,0,0,41,9,114,118,0, - 0,0,114,43,0,0,0,114,25,0,0,0,114,12,1,0, - 0,218,6,112,97,114,101,110,116,114,96,0,0,0,114,36, - 0,0,0,114,32,0,0,0,114,228,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, - 0,2,4,0,0,115,48,0,0,0,0,2,12,1,4,2, - 12,1,12,1,12,2,12,1,10,1,2,1,14,1,12,2, - 8,1,14,3,6,1,2,0,2,255,4,2,28,1,2,1, - 12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116, - 95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0, - 0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 9,1,0,0,244,3,0,0,115,8,0,0,0,8,2,4, - 2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, - 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, - 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, - 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, - 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, - 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, - 0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2, - 114,116,0,0,0,114,106,0,0,0,41,5,114,179,0,0, - 0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0, - 114,235,0,0,0,41,5,114,118,0,0,0,114,139,0,0, - 0,114,43,0,0,0,114,25,0,0,0,114,151,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,37,4,0,0,115,22,0,0,0,0,1,10, - 1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2, - 1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111, - 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, - 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,229,0,0,0,53,4, - 0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99, - 101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0, - 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, - 0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 15,1,0,0,33,4,0,0,115,6,0,0,0,8,2,4, - 2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, - 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, - 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, - 90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20, - 83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101, - 114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32, - 109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104, - 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115, - 32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114, - 107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101, - 114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, - 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, - 95,1,100,0,83,0,114,109,0,0,0,114,159,0,0,0, - 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,70,4,0,0,115,4,0, - 0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110, - 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0, - 0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0, - 106,1,124,1,106,1,107,2,83,0,114,109,0,0,0,114, - 240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,243,0,0,0,74,4,0, - 0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, - 124,0,106,2,131,1,65,0,83,0,114,109,0,0,0,114, - 244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,247,0,0,0,78,4,0, - 0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, - 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, - 125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6, - 161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97, - 116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101, - 100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100, - 32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0, - 0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101, - 97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,116,0,0,0,114,43,0,0,0,41,3,114,118,0,0, - 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,81, - 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, - 4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, - 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, - 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, - 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, - 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, - 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, - 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, - 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, - 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,116,0,0,0,114,43,0,0,0,114,253,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, - 0,0,0,89,4,0,0,115,10,0,0,0,0,2,14,1, - 6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, - 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, - 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, - 3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,38, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, - 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, - 2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0, - 0,0,78,114,3,0,0,0,169,2,114,31,0,0,0,218, - 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, - 110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9, - 60,103,101,110,101,120,112,114,62,98,4,0,0,115,4,0, - 0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46, - 60,103,101,110,101,120,112,114,62,41,4,114,46,0,0,0, - 114,43,0,0,0,218,3,97,110,121,218,18,69,88,84,69, - 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219, - 0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0, - 0,0,114,182,0,0,0,95,4,0,0,115,8,0,0,0, - 0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115, - 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, - 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,101,4,0,0, - 115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, - 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,114, - 110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,115, - 105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,101, - 32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46, - 78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,105, - 4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250, - 0,0,0,114,47,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, - 0,109,4,0,0,115,2,0,0,0,0,3,122,32,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, - 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, - 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, - 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, - 0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, - 62,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8, - 4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114, - 252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, + 10,103,101,116,95,115,111,117,114,99,101,70,3,0,0,115, + 20,0,0,0,0,2,10,1,2,1,14,1,14,1,4,1, + 2,255,4,1,2,255,24,2,122,23,83,111,117,114,99,101, + 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, + 101,114,104,0,0,0,41,1,218,9,95,111,112,116,105,109, + 105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,0, + 0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,124, + 3,100,3,141,6,83,0,41,4,122,130,82,101,116,117,114, + 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, + 116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,117, + 109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,32, + 111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,116, + 32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,111, + 114,116,115,46,10,32,32,32,32,32,32,32,32,114,215,0, + 0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,101, + 114,105,116,114,83,0,0,0,41,3,114,134,0,0,0,114, + 214,0,0,0,218,7,99,111,109,112,105,108,101,41,4,114, + 118,0,0,0,114,25,0,0,0,114,43,0,0,0,114,230, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,111, + 100,101,80,3,0,0,115,8,0,0,0,0,5,12,1,2, + 0,2,255,122,27,83,111,117,114,99,101,76,111,97,100,101, + 114,46,115,111,117,114,99,101,95,116,111,95,99,111,100,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,15,0,0, + 0,9,0,0,0,67,0,0,0,115,24,2,0,0,124,0, + 160,0,124,1,161,1,125,2,100,1,125,3,100,1,125,4, + 100,1,125,5,100,2,125,6,100,3,125,7,122,12,116,1, + 124,2,131,1,125,8,87,0,110,24,4,0,116,2,121,66, + 1,0,1,0,1,0,100,1,125,8,89,0,144,1,110,42, + 48,0,122,14,124,0,160,3,124,2,161,1,125,9,87,0, + 110,20,4,0,116,4,121,102,1,0,1,0,1,0,89,0, + 144,1,110,6,48,0,116,5,124,9,100,4,25,0,131,1, + 125,3,122,14,124,0,160,6,124,8,161,1,125,10,87,0, + 110,18,4,0,116,4,121,148,1,0,1,0,1,0,89,0, + 110,216,48,0,124,1,124,8,100,5,156,2,125,11,122,148, + 116,7,124,10,124,1,124,11,131,3,125,12,116,8,124,10, + 131,1,100,6,100,1,133,2,25,0,125,13,124,12,100,7, + 64,0,100,8,107,3,125,6,124,6,144,1,114,30,124,12, + 100,9,64,0,100,8,107,3,125,7,116,9,106,10,100,10, + 107,3,144,1,114,50,124,7,115,248,116,9,106,10,100,11, + 107,2,144,1,114,50,124,0,160,6,124,2,161,1,125,4, + 116,9,160,11,116,12,124,4,161,2,125,5,116,13,124,10, + 124,5,124,1,124,11,131,4,1,0,110,20,116,14,124,10, + 124,3,124,9,100,12,25,0,124,1,124,11,131,5,1,0, + 87,0,110,24,4,0,116,15,116,16,102,2,144,1,121,76, + 1,0,1,0,1,0,89,0,110,32,48,0,116,17,160,18, + 100,13,124,8,124,2,161,3,1,0,116,19,124,13,124,1, + 124,8,124,2,100,14,141,4,83,0,124,4,100,1,117,0, + 144,1,114,128,124,0,160,6,124,2,161,1,125,4,124,0, + 160,20,124,4,124,2,161,2,125,14,116,17,160,18,100,15, + 124,2,161,2,1,0,116,21,106,22,144,2,115,20,124,8, + 100,1,117,1,144,2,114,20,124,3,100,1,117,1,144,2, + 114,20,124,6,144,1,114,220,124,5,100,1,117,0,144,1, + 114,206,116,9,160,11,124,4,161,1,125,5,116,23,124,14, + 124,5,124,7,131,3,125,10,110,16,116,24,124,14,124,3, + 116,25,124,4,131,1,131,3,125,10,122,18,124,0,160,26, + 124,2,124,8,124,10,161,3,1,0,87,0,110,20,4,0, + 116,2,144,2,121,18,1,0,1,0,1,0,89,0,110,2, + 48,0,124,14,83,0,41,16,122,190,67,111,110,99,114,101, + 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,73,110,115,112,101,99,116,76,111,97,100, + 101,114,46,103,101,116,95,99,111,100,101,46,10,10,32,32, + 32,32,32,32,32,32,82,101,97,100,105,110,103,32,111,102, + 32,98,121,116,101,99,111,100,101,32,114,101,113,117,105,114, + 101,115,32,112,97,116,104,95,115,116,97,116,115,32,116,111, + 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, + 32,84,111,32,119,114,105,116,101,10,32,32,32,32,32,32, + 32,32,98,121,116,101,99,111,100,101,44,32,115,101,116,95, + 100,97,116,97,32,109,117,115,116,32,97,108,115,111,32,98, + 101,32,105,109,112,108,101,109,101,110,116,101,100,46,10,10, + 32,32,32,32,32,32,32,32,78,70,84,114,169,0,0,0, + 114,159,0,0,0,114,145,0,0,0,114,38,0,0,0,114, + 72,0,0,0,114,27,0,0,0,90,5,110,101,118,101,114, + 90,6,97,108,119,97,121,115,218,4,115,105,122,101,122,13, + 123,125,32,109,97,116,99,104,101,115,32,123,125,41,3,114, + 116,0,0,0,114,106,0,0,0,114,107,0,0,0,122,19, + 99,111,100,101,32,111,98,106,101,99,116,32,102,114,111,109, + 32,123,125,41,27,114,179,0,0,0,114,97,0,0,0,114, + 81,0,0,0,114,224,0,0,0,114,49,0,0,0,114,17, + 0,0,0,114,227,0,0,0,114,152,0,0,0,218,10,109, + 101,109,111,114,121,118,105,101,119,114,163,0,0,0,90,21, + 99,104,101,99,107,95,104,97,115,104,95,98,97,115,101,100, + 95,112,121,99,115,114,157,0,0,0,218,17,95,82,65,87, + 95,77,65,71,73,67,95,78,85,77,66,69,82,114,158,0, + 0,0,114,156,0,0,0,114,117,0,0,0,114,150,0,0, + 0,114,134,0,0,0,114,149,0,0,0,114,165,0,0,0, + 114,233,0,0,0,114,8,0,0,0,218,19,100,111,110,116, + 95,119,114,105,116,101,95,98,121,116,101,99,111,100,101,114, + 171,0,0,0,114,170,0,0,0,114,22,0,0,0,114,226, + 0,0,0,41,15,114,118,0,0,0,114,139,0,0,0,114, + 107,0,0,0,114,154,0,0,0,114,174,0,0,0,114,157, + 0,0,0,90,10,104,97,115,104,95,98,97,115,101,100,90, + 12,99,104,101,99,107,95,115,111,117,114,99,101,114,106,0, + 0,0,218,2,115,116,114,25,0,0,0,114,151,0,0,0, + 114,82,0,0,0,90,10,98,121,116,101,115,95,100,97,116, + 97,90,11,99,111,100,101,95,111,98,106,101,99,116,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, + 0,0,88,3,0,0,115,152,0,0,0,0,7,10,1,4, + 1,4,1,4,1,4,1,4,1,2,1,12,1,12,1,12, + 2,2,1,14,1,12,1,8,2,12,1,2,1,14,1,12, + 1,6,3,2,1,2,254,6,4,2,1,12,1,16,1,12, + 1,6,1,12,1,12,1,2,255,2,2,8,254,4,3,10, + 1,4,1,2,1,2,254,4,4,8,1,2,255,6,3,2, + 1,2,1,2,1,6,1,2,1,2,251,8,7,18,1,6, + 2,8,1,2,255,4,2,6,1,2,1,2,254,6,3,10, + 1,10,1,12,1,12,1,18,1,6,255,4,2,6,1,10, + 1,10,1,14,2,6,1,6,255,4,2,2,1,18,1,14, + 1,6,1,122,21,83,111,117,114,99,101,76,111,97,100,101, + 114,46,103,101,116,95,99,111,100,101,78,41,10,114,125,0, + 0,0,114,124,0,0,0,114,126,0,0,0,114,223,0,0, + 0,114,224,0,0,0,114,226,0,0,0,114,225,0,0,0, + 114,229,0,0,0,114,233,0,0,0,114,213,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,221,0,0,0,29,3,0,0,115,14,0,0, + 0,8,2,8,8,8,14,8,10,8,7,8,10,14,8,114, + 221,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,0,0,0,0,115,124,0, 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, - 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, - 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, - 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, - 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, - 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, - 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, - 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, - 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, - 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, - 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, - 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, - 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, - 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, - 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, - 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, - 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, - 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, - 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, - 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, - 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, - 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, - 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, - 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, - 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, - 3,124,0,95,5,100,0,83,0,114,109,0,0,0,41,6, - 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,111, - 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, - 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, - 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, - 102,105,110,100,101,114,169,4,114,118,0,0,0,114,116,0, - 0,0,114,43,0,0,0,90,11,112,97,116,104,95,102,105, - 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,209,0,0,0,122,4,0,0,115,8,0,0, - 0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, - 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, - 100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110, - 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, - 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, - 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, - 116,114,45,110,97,109,101,41,114,70,0,0,0,114,39,0, - 0,0,41,2,114,8,0,0,0,114,43,0,0,0,90,8, - 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, - 40,0,0,0,41,4,114,118,0,0,0,114,14,1,0,0, - 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, - 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, - 115,128,4,0,0,115,8,0,0,0,0,2,18,1,8,2, - 4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95, - 112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2, - 125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2, - 131,2,83,0,114,109,0,0,0,41,4,114,30,1,0,0, - 114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117, - 108,101,115,41,3,114,118,0,0,0,90,18,112,97,114,101, - 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, - 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, - 0,0,138,4,0,0,115,4,0,0,0,0,1,12,1,122, - 31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0, - 124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2, - 107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2, - 125,2,124,2,100,0,117,1,114,68,124,2,106,5,100,0, - 117,0,114,68,124,2,106,6,114,68,124,2,106,6,124,0, - 95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,109, - 0,0,0,41,8,114,111,0,0,0,114,25,1,0,0,114, - 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, - 0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114, - 118,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116, - 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, - 97,116,101,142,4,0,0,115,16,0,0,0,0,2,12,1, - 10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101, - 99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,109,0,0,0,41,2,114,6,1,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, - 95,95,155,4,0,0,115,2,0,0,0,0,1,122,23,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, - 114,109,0,0,0,169,1,114,32,1,0,0,41,2,114,118, - 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, - 105,116,101,109,95,95,158,4,0,0,115,2,0,0,0,0, - 1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106, - 0,124,1,60,0,100,0,83,0,114,109,0,0,0,41,1, - 114,24,1,0,0,41,3,114,118,0,0,0,114,35,1,0, - 0,114,43,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, - 95,95,161,4,0,0,115,2,0,0,0,0,1,122,26,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,109,0,0,0,41,2,114,22,0,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, - 95,164,4,0,0,115,2,0,0,0,0,1,122,22,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108, - 101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, - 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,40,123,33,114,125,41,41,2,114,61,0,0,0,114,24, - 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, - 95,167,4,0,0,115,2,0,0,0,0,1,122,23,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114, - 101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,124,1,124,0,160,0,161,0,118,0,83,0,114, - 109,0,0,0,114,34,1,0,0,169,2,114,118,0,0,0, - 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,170,4,0,0,115,2,0,0,0,0,1,122,27, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, - 95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, - 1,161,1,1,0,100,0,83,0,114,109,0,0,0,41,2, - 114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, - 0,0,0,173,4,0,0,115,2,0,0,0,0,1,122,21, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, - 112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, - 0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0, - 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, - 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,22,1,0,0,115,4,0,0, - 115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8, - 13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0, - 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, - 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6, - 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10, - 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14, - 132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0, - 41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0, - 0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1, - 100,0,83,0,114,109,0,0,0,41,2,114,22,1,0,0, - 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,209,0,0,0,179,4, - 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, - 115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110, - 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, - 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, - 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, - 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, - 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, - 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, - 41,2,114,61,0,0,0,114,125,0,0,0,41,2,114,193, + 100,7,132,0,90,6,101,7,135,0,102,1,100,8,100,9, + 132,8,131,1,90,8,101,7,100,10,100,11,132,0,131,1, + 90,9,100,12,100,13,132,0,90,10,101,7,100,14,100,15, + 132,0,131,1,90,11,100,16,100,17,132,0,90,12,100,18, + 100,19,132,0,90,13,100,20,100,21,132,0,90,14,100,22, + 100,23,132,0,90,15,135,0,4,0,90,16,83,0,41,24, + 218,10,70,105,108,101,76,111,97,100,101,114,122,103,66,97, + 115,101,32,102,105,108,101,32,108,111,97,100,101,114,32,99, + 108,97,115,115,32,119,104,105,99,104,32,105,109,112,108,101, + 109,101,110,116,115,32,116,104,101,32,108,111,97,100,101,114, + 32,112,114,111,116,111,99,111,108,32,109,101,116,104,111,100, + 115,32,116,104,97,116,10,32,32,32,32,114,101,113,117,105, + 114,101,32,102,105,108,101,32,115,121,115,116,101,109,32,117, + 115,97,103,101,46,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,16, + 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,100, + 1,83,0,41,2,122,75,67,97,99,104,101,32,116,104,101, + 32,109,111,100,117,108,101,32,110,97,109,101,32,97,110,100, + 32,116,104,101,32,112,97,116,104,32,116,111,32,116,104,101, + 32,102,105,108,101,32,102,111,117,110,100,32,98,121,32,116, + 104,101,10,32,32,32,32,32,32,32,32,102,105,110,100,101, + 114,46,78,114,159,0,0,0,41,3,114,118,0,0,0,114, + 139,0,0,0,114,43,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,209,0,0,0,178,3,0, + 0,115,4,0,0,0,0,3,6,1,122,19,70,105,108,101, + 76,111,97,100,101,114,46,95,95,105,110,105,116,95,95,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 2,0,0,0,67,0,0,0,115,24,0,0,0,124,0,106, + 0,124,1,106,0,107,2,111,22,124,0,106,1,124,1,106, + 1,107,2,83,0,114,109,0,0,0,169,2,218,9,95,95, + 99,108,97,115,115,95,95,114,131,0,0,0,169,2,114,118, + 0,0,0,90,5,111,116,104,101,114,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,6,95,95,101,113,95, + 95,184,3,0,0,115,6,0,0,0,0,1,12,1,10,255, + 122,17,70,105,108,101,76,111,97,100,101,114,46,95,95,101, + 113,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,20,0,0, + 0,116,0,124,0,106,1,131,1,116,0,124,0,106,2,131, + 1,65,0,83,0,114,109,0,0,0,169,3,218,4,104,97, + 115,104,114,116,0,0,0,114,43,0,0,0,169,1,114,118, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,8,95,95,104,97,115,104,95,95,188,3,0,0, + 115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,97, + 100,101,114,46,95,95,104,97,115,104,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,3,0,0,0,115,16,0,0,0,116,0,116,1,124,0, + 131,2,160,2,124,1,161,1,83,0,41,1,122,100,76,111, + 97,100,32,97,32,109,111,100,117,108,101,32,102,114,111,109, + 32,97,32,102,105,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, + 32,32,41,3,218,5,115,117,112,101,114,114,239,0,0,0, + 114,220,0,0,0,114,219,0,0,0,169,1,114,241,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,220,0,0,0, + 191,3,0,0,115,2,0,0,0,0,10,122,22,70,105,108, + 101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,6,0,0, + 0,124,0,106,0,83,0,169,1,122,58,82,101,116,117,114, + 110,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,32,97,115, + 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, + 110,100,101,114,46,114,47,0,0,0,114,219,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,179, + 0,0,0,203,3,0,0,115,2,0,0,0,0,3,122,23, + 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,102, + 105,108,101,110,97,109,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, + 115,126,0,0,0,116,0,124,0,116,1,116,2,102,2,131, + 2,114,70,116,3,160,4,116,5,124,1,131,1,161,1,143, + 24,125,2,124,2,160,6,161,0,87,0,2,0,100,1,4, + 0,4,0,131,3,1,0,83,0,49,0,115,58,48,0,1, + 0,1,0,1,0,89,0,1,0,110,52,116,3,160,7,124, + 1,100,2,161,2,143,24,125,2,124,2,160,6,161,0,87, + 0,2,0,100,1,4,0,4,0,131,3,1,0,83,0,49, + 0,115,112,48,0,1,0,1,0,1,0,89,0,1,0,100, + 1,83,0,41,3,122,39,82,101,116,117,114,110,32,116,104, + 101,32,100,97,116,97,32,102,114,111,109,32,112,97,116,104, + 32,97,115,32,114,97,119,32,98,121,116,101,115,46,78,218, + 1,114,41,8,114,161,0,0,0,114,221,0,0,0,218,19, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,114,63,0,0,0,90,9,111,112,101,110,95,99, + 111,100,101,114,84,0,0,0,90,4,114,101,97,100,114,64, + 0,0,0,41,3,114,118,0,0,0,114,43,0,0,0,114, + 67,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,227,0,0,0,208,3,0,0,115,10,0,0, + 0,0,2,14,1,16,1,40,2,14,1,122,19,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,100,97,116,97, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,3,0,0,0,67,0,0,0,115,18,0,0,0,124,0, + 160,0,124,1,161,1,114,14,124,0,83,0,100,0,83,0, + 114,109,0,0,0,41,1,114,182,0,0,0,169,2,114,118, 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, - 114,101,112,114,182,4,0,0,115,2,0,0,0,0,7,122, - 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,191,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,39, - 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, - 0,194,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, - 0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100, - 4,100,5,141,4,83,0,41,6,78,114,39,0,0,0,122, - 8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41, - 1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,213,0,0,0,197,4,0,0,115,2,0,0,0,0, - 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210, - 0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, - 0,200,4,0,0,115,2,0,0,0,0,1,122,30,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,109, - 0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,203,4,0,0,115,2,0,0,0,0,1,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0, - 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,206, - 4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2, - 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114, - 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, - 0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,19,103,101,116,95,114,101,115, + 111,117,114,99,101,95,114,101,97,100,101,114,219,3,0,0, + 115,6,0,0,0,0,2,10,1,4,1,122,30,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,114,101,115,111, + 117,114,99,101,95,114,101,97,100,101,114,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0, + 67,0,0,0,115,32,0,0,0,116,0,116,1,124,0,106, + 2,131,1,100,1,25,0,124,1,131,2,125,2,116,3,160, + 4,124,2,100,2,161,2,83,0,41,3,78,114,72,0,0, + 0,114,251,0,0,0,41,5,114,37,0,0,0,114,46,0, + 0,0,114,43,0,0,0,114,63,0,0,0,114,64,0,0, + 0,169,3,114,118,0,0,0,90,8,114,101,115,111,117,114, + 99,101,114,43,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,13,111,112,101,110,95,114,101,115, + 111,117,114,99,101,225,3,0,0,115,4,0,0,0,0,1, + 20,1,122,24,70,105,108,101,76,111,97,100,101,114,46,111, + 112,101,110,95,114,101,115,111,117,114,99,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,38,0,0,0,124,0,160,0,124,1, + 161,1,115,14,116,1,130,1,116,2,116,3,124,0,106,4, + 131,1,100,1,25,0,124,1,131,2,125,2,124,2,83,0, + 169,2,78,114,72,0,0,0,41,5,218,11,105,115,95,114, + 101,115,111,117,114,99,101,218,17,70,105,108,101,78,111,116, + 70,111,117,110,100,69,114,114,111,114,114,37,0,0,0,114, + 46,0,0,0,114,43,0,0,0,114,255,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,114, + 101,115,111,117,114,99,101,95,112,97,116,104,229,3,0,0, + 115,8,0,0,0,0,1,10,1,4,1,20,1,122,24,70, + 105,108,101,76,111,97,100,101,114,46,114,101,115,111,117,114, + 99,101,95,112,97,116,104,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,40,0,0,0,116,0,124,1,118,0,114,12,100,1,83, + 0,116,1,116,2,124,0,106,3,131,1,100,2,25,0,124, + 1,131,2,125,2,116,4,124,2,131,1,83,0,41,3,78, + 70,114,72,0,0,0,41,5,114,34,0,0,0,114,37,0, + 0,0,114,46,0,0,0,114,43,0,0,0,114,53,0,0, + 0,169,3,114,118,0,0,0,114,116,0,0,0,114,43,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,43,1,0,0,178,4,0,0,115,18,0,0,0,8, - 1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8, - 3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 118,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, - 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, - 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, - 101,4,100,19,100,11,100,12,132,1,131,1,90,9,101,4, - 100,20,100,13,100,14,132,1,131,1,90,10,101,4,100,21, - 100,15,100,16,132,1,131,1,90,11,101,4,100,17,100,18, - 132,0,131,1,90,12,100,10,83,0,41,22,218,10,80,97, - 116,104,70,105,110,100,101,114,122,62,77,101,116,97,32,112, - 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,115, - 121,115,46,112,97,116,104,32,97,110,100,32,112,97,99,107, - 97,103,101,32,95,95,112,97,116,104,95,95,32,97,116,116, - 114,105,98,117,116,101,115,46,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, - 0,115,64,0,0,0,116,0,116,1,106,2,160,3,161,0, - 131,1,68,0,93,44,92,2,125,1,125,2,124,2,100,1, - 117,0,114,40,116,1,106,2,124,1,61,0,113,14,116,4, - 124,2,100,2,131,2,114,14,124,2,160,5,161,0,1,0, - 113,14,100,1,83,0,41,3,122,125,67,97,108,108,32,116, - 104,101,32,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,40,41,32,109,101,116,104,111,100,32,111,110, - 32,97,108,108,32,112,97,116,104,32,101,110,116,114,121,32, - 102,105,110,100,101,114,115,10,32,32,32,32,32,32,32,32, - 115,116,111,114,101,100,32,105,110,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,115,32,40,119,104,101,114,101,32,105,109,112,108,101,109, - 101,110,116,101,100,41,46,78,218,17,105,110,118,97,108,105, - 100,97,116,101,95,99,97,99,104,101,115,41,6,218,4,108, - 105,115,116,114,8,0,0,0,218,19,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,218,5,105, - 116,101,109,115,114,128,0,0,0,114,46,1,0,0,41,3, - 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, - 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,46,1,0,0,224,4,0,0,115,10,0,0,0,0, - 4,22,1,8,1,10,1,10,1,122,28,80,97,116,104,70, - 105,110,100,101,114,46,105,110,118,97,108,105,100,97,116,101, - 95,99,97,99,104,101,115,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,9,0,0,0,67,0,0,0, - 115,82,0,0,0,116,0,106,1,100,1,117,1,114,28,116, - 0,106,1,115,28,116,2,160,3,100,2,116,4,161,2,1, - 0,116,0,106,1,68,0,93,42,125,2,122,14,124,2,124, - 1,131,1,87,0,2,0,1,0,83,0,4,0,116,5,121, - 74,1,0,1,0,1,0,89,0,113,34,89,0,113,34,48, - 0,113,34,100,1,83,0,41,3,122,46,83,101,97,114,99, - 104,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,102,111,114,32,97,32,102,105,110,100,101,114,32,102,111, - 114,32,39,112,97,116,104,39,46,78,122,23,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,105,115,32,101,109, - 112,116,121,41,6,114,8,0,0,0,218,10,112,97,116,104, - 95,104,111,111,107,115,114,74,0,0,0,114,75,0,0,0, - 114,138,0,0,0,114,117,0,0,0,41,3,114,193,0,0, - 0,114,43,0,0,0,90,4,104,111,111,107,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, - 116,104,95,104,111,111,107,115,234,4,0,0,115,16,0,0, - 0,0,3,16,1,12,1,10,1,2,1,14,1,12,1,12, - 2,122,22,80,97,116,104,70,105,110,100,101,114,46,95,112, - 97,116,104,95,104,111,111,107,115,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,100,0,0,0,124,1,100,1,107,2,114,42,122, - 12,116,0,160,1,161,0,125,1,87,0,110,20,4,0,116, - 2,121,40,1,0,1,0,1,0,89,0,100,2,83,0,48, - 0,122,14,116,3,106,4,124,1,25,0,125,2,87,0,110, - 38,4,0,116,5,121,94,1,0,1,0,1,0,124,0,160, - 6,124,1,161,1,125,2,124,2,116,3,106,4,124,1,60, - 0,89,0,110,2,48,0,124,2,83,0,41,3,122,210,71, - 101,116,32,116,104,101,32,102,105,110,100,101,114,32,102,111, - 114,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121, - 32,102,114,111,109,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, - 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, - 97,116,104,32,101,110,116,114,121,32,105,115,32,110,111,116, - 32,105,110,32,116,104,101,32,99,97,99,104,101,44,32,102, - 105,110,100,32,116,104,101,32,97,112,112,114,111,112,114,105, - 97,116,101,32,102,105,110,100,101,114,10,32,32,32,32,32, - 32,32,32,97,110,100,32,99,97,99,104,101,32,105,116,46, - 32,73,102,32,110,111,32,102,105,110,100,101,114,32,105,115, - 32,97,118,97,105,108,97,98,108,101,44,32,115,116,111,114, - 101,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, - 32,114,39,0,0,0,78,41,7,114,2,0,0,0,114,54, - 0,0,0,114,3,1,0,0,114,8,0,0,0,114,48,1, - 0,0,218,8,75,101,121,69,114,114,111,114,114,52,1,0, - 0,41,3,114,193,0,0,0,114,43,0,0,0,114,50,1, + 0,114,2,1,0,0,235,3,0,0,115,8,0,0,0,0, + 1,8,1,4,1,20,1,122,22,70,105,108,101,76,111,97, + 100,101,114,46,105,115,95,114,101,115,111,117,114,99,101,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 5,0,0,0,67,0,0,0,115,24,0,0,0,116,0,116, + 1,160,2,116,3,124,0,106,4,131,1,100,1,25,0,161, + 1,131,1,83,0,114,1,1,0,0,41,5,218,4,105,116, + 101,114,114,2,0,0,0,218,7,108,105,115,116,100,105,114, + 114,46,0,0,0,114,43,0,0,0,114,246,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,8, + 99,111,110,116,101,110,116,115,241,3,0,0,115,2,0,0, + 0,0,1,122,19,70,105,108,101,76,111,97,100,101,114,46, + 99,111,110,116,101,110,116,115,41,17,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, + 0,0,0,114,243,0,0,0,114,247,0,0,0,114,136,0, + 0,0,114,220,0,0,0,114,179,0,0,0,114,227,0,0, + 0,114,254,0,0,0,114,0,1,0,0,114,4,1,0,0, + 114,2,1,0,0,114,8,1,0,0,90,13,95,95,99,108, + 97,115,115,99,101,108,108,95,95,114,3,0,0,0,114,3, + 0,0,0,114,249,0,0,0,114,6,0,0,0,114,239,0, + 0,0,173,3,0,0,115,30,0,0,0,8,2,4,3,8, + 6,8,4,8,3,2,1,14,11,2,1,10,4,8,11,2, + 1,10,5,8,4,8,6,8,6,114,239,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,64,0,0,0,115,46,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,100,7,156,1,100,8, + 100,9,132,2,90,6,100,10,83,0,41,11,218,16,83,111, + 117,114,99,101,70,105,108,101,76,111,97,100,101,114,122,62, + 67,111,110,99,114,101,116,101,32,105,109,112,108,101,109,101, + 110,116,97,116,105,111,110,32,111,102,32,83,111,117,114,99, + 101,76,111,97,100,101,114,32,117,115,105,110,103,32,116,104, + 101,32,102,105,108,101,32,115,121,115,116,101,109,46,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,67,0,0,0,115,22,0,0,0,116,0,124,1, + 131,1,125,2,124,2,106,1,124,2,106,2,100,1,156,2, + 83,0,41,2,122,33,82,101,116,117,114,110,32,116,104,101, + 32,109,101,116,97,100,97,116,97,32,102,111,114,32,116,104, + 101,32,112,97,116,104,46,41,2,114,169,0,0,0,114,234, + 0,0,0,41,3,114,48,0,0,0,218,8,115,116,95,109, + 116,105,109,101,90,7,115,116,95,115,105,122,101,41,3,114, + 118,0,0,0,114,43,0,0,0,114,238,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,224,0, + 0,0,249,3,0,0,115,4,0,0,0,0,2,8,1,122, + 27,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101, + 114,46,112,97,116,104,95,115,116,97,116,115,99,4,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0, + 0,67,0,0,0,115,24,0,0,0,116,0,124,1,131,1, + 125,4,124,0,106,1,124,2,124,3,124,4,100,1,141,3, + 83,0,41,2,78,169,1,218,5,95,109,111,100,101,41,2, + 114,114,0,0,0,114,225,0,0,0,41,5,114,118,0,0, + 0,114,107,0,0,0,114,106,0,0,0,114,25,0,0,0, + 114,51,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,226,0,0,0,254,3,0,0,115,4,0, + 0,0,0,2,8,1,122,32,83,111,117,114,99,101,70,105, + 108,101,76,111,97,100,101,114,46,95,99,97,99,104,101,95, + 98,121,116,101,99,111,100,101,114,59,0,0,0,114,11,1, + 0,0,99,3,0,0,0,0,0,0,0,1,0,0,0,9, + 0,0,0,11,0,0,0,67,0,0,0,115,252,0,0,0, + 116,0,124,1,131,1,92,2,125,4,125,5,103,0,125,6, + 124,4,114,52,116,1,124,4,131,1,115,52,116,0,124,4, + 131,1,92,2,125,4,125,7,124,6,160,2,124,7,161,1, + 1,0,113,16,116,3,124,6,131,1,68,0,93,104,125,7, + 116,4,124,4,124,7,131,2,125,4,122,14,116,5,160,6, + 124,4,161,1,1,0,87,0,113,60,4,0,116,7,121,110, + 1,0,1,0,1,0,89,0,113,60,89,0,113,60,4,0, + 116,8,121,162,1,0,125,8,1,0,122,30,116,9,160,10, + 100,1,124,4,124,8,161,3,1,0,87,0,89,0,100,2, + 125,8,126,8,1,0,100,2,83,0,100,2,125,8,126,8, + 48,0,48,0,113,60,122,28,116,11,124,1,124,2,124,3, + 131,3,1,0,116,9,160,10,100,3,124,1,161,2,1,0, + 87,0,110,52,4,0,116,8,144,0,121,246,1,0,125,8, + 1,0,122,26,116,9,160,10,100,1,124,1,124,8,161,3, + 1,0,87,0,89,0,100,2,125,8,126,8,110,10,100,2, + 125,8,126,8,48,0,48,0,100,2,83,0,41,4,122,27, + 87,114,105,116,101,32,98,121,116,101,115,32,100,97,116,97, + 32,116,111,32,97,32,102,105,108,101,46,122,27,99,111,117, + 108,100,32,110,111,116,32,99,114,101,97,116,101,32,123,33, + 114,125,58,32,123,33,114,125,78,122,12,99,114,101,97,116, + 101,100,32,123,33,114,125,41,12,114,46,0,0,0,114,55, + 0,0,0,114,186,0,0,0,114,41,0,0,0,114,37,0, + 0,0,114,2,0,0,0,90,5,109,107,100,105,114,218,15, + 70,105,108,101,69,120,105,115,116,115,69,114,114,111,114,114, + 49,0,0,0,114,134,0,0,0,114,149,0,0,0,114,68, + 0,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, + 25,0,0,0,114,12,1,0,0,218,6,112,97,114,101,110, + 116,114,96,0,0,0,114,36,0,0,0,114,32,0,0,0, + 114,228,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,225,0,0,0,3,4,0,0,115,48,0, + 0,0,0,2,12,1,4,2,12,1,12,1,12,2,12,1, + 10,1,2,1,14,1,12,2,8,1,14,3,6,1,2,0, + 2,255,4,2,28,1,2,1,12,1,16,1,16,2,8,1, + 2,255,122,25,83,111,117,114,99,101,70,105,108,101,76,111, + 97,100,101,114,46,115,101,116,95,100,97,116,97,78,41,7, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,224,0,0,0,114,226,0,0,0,114,225, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,9,1,0,0,245,3,0,0, + 115,8,0,0,0,8,2,4,2,8,5,8,5,114,9,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, + 41,7,218,20,83,111,117,114,99,101,108,101,115,115,70,105, + 108,101,76,111,97,100,101,114,122,45,76,111,97,100,101,114, + 32,119,104,105,99,104,32,104,97,110,100,108,101,115,32,115, + 111,117,114,99,101,108,101,115,115,32,102,105,108,101,32,105, + 109,112,111,114,116,115,46,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,68,0,0,0,124,0,160,0,124,1,161,1,125,2,124, + 0,160,1,124,2,161,1,125,3,124,1,124,2,100,1,156, + 2,125,4,116,2,124,3,124,1,124,4,131,3,1,0,116, + 3,116,4,124,3,131,1,100,2,100,0,133,2,25,0,124, + 1,124,2,100,3,141,3,83,0,41,4,78,114,159,0,0, + 0,114,145,0,0,0,41,2,114,116,0,0,0,114,106,0, + 0,0,41,5,114,179,0,0,0,114,227,0,0,0,114,152, + 0,0,0,114,165,0,0,0,114,235,0,0,0,41,5,114, + 118,0,0,0,114,139,0,0,0,114,43,0,0,0,114,25, + 0,0,0,114,151,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,38,4,0,0, + 115,22,0,0,0,0,1,10,1,10,4,2,1,2,254,6, + 4,12,1,2,1,14,1,2,1,2,253,122,29,83,111,117, + 114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101, + 114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,39, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,116, + 104,101,114,101,32,105,115,32,110,111,32,115,111,117,114,99, + 101,32,99,111,100,101,46,78,114,3,0,0,0,114,219,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,20,95,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,247,4,0,0,115,22,0,0,0, - 0,8,8,1,2,1,12,1,12,3,8,1,2,1,14,1, - 12,1,10,1,16,1,122,31,80,97,116,104,70,105,110,100, - 101,114,46,95,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,99,3,0,0,0,0,0,0,0, - 0,0,0,0,6,0,0,0,4,0,0,0,67,0,0,0, - 115,82,0,0,0,116,0,124,2,100,1,131,2,114,26,124, - 2,160,1,124,1,161,1,92,2,125,3,125,4,110,14,124, - 2,160,2,124,1,161,1,125,3,103,0,125,4,124,3,100, - 0,117,1,114,60,116,3,160,4,124,1,124,3,161,2,83, - 0,116,3,160,5,124,1,100,0,161,2,125,5,124,4,124, - 5,95,6,124,5,83,0,41,2,78,114,137,0,0,0,41, - 7,114,128,0,0,0,114,137,0,0,0,114,206,0,0,0, - 114,134,0,0,0,114,201,0,0,0,114,183,0,0,0,114, - 178,0,0,0,41,6,114,193,0,0,0,114,139,0,0,0, - 114,50,1,0,0,114,140,0,0,0,114,141,0,0,0,114, - 187,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116, - 95,115,112,101,99,13,5,0,0,115,18,0,0,0,0,4, - 10,1,16,2,10,1,4,1,8,1,12,1,12,1,6,1, - 122,27,80,97,116,104,70,105,110,100,101,114,46,95,108,101, - 103,97,99,121,95,103,101,116,95,115,112,101,99,78,99,4, - 0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,5, - 0,0,0,67,0,0,0,115,166,0,0,0,103,0,125,4, - 124,2,68,0,93,134,125,5,116,0,124,5,116,1,116,2, - 102,2,131,2,115,28,113,8,124,0,160,3,124,5,161,1, - 125,6,124,6,100,1,117,1,114,8,116,4,124,6,100,2, - 131,2,114,70,124,6,160,5,124,1,124,3,161,2,125,7, - 110,12,124,0,160,6,124,1,124,6,161,2,125,7,124,7, - 100,1,117,0,114,92,113,8,124,7,106,7,100,1,117,1, - 114,110,124,7,2,0,1,0,83,0,124,7,106,8,125,8, - 124,8,100,1,117,0,114,132,116,9,100,3,131,1,130,1, - 124,4,160,10,124,8,161,1,1,0,113,8,116,11,160,12, - 124,1,100,1,161,2,125,7,124,4,124,7,95,8,124,7, - 83,0,41,4,122,63,70,105,110,100,32,116,104,101,32,108, - 111,97,100,101,114,32,111,114,32,110,97,109,101,115,112,97, - 99,101,95,112,97,116,104,32,102,111,114,32,116,104,105,115, - 32,109,111,100,117,108,101,47,112,97,99,107,97,103,101,32, - 110,97,109,101,46,78,114,203,0,0,0,122,19,115,112,101, - 99,32,109,105,115,115,105,110,103,32,108,111,97,100,101,114, - 41,13,114,161,0,0,0,114,84,0,0,0,218,5,98,121, - 116,101,115,114,54,1,0,0,114,128,0,0,0,114,203,0, - 0,0,114,55,1,0,0,114,140,0,0,0,114,178,0,0, - 0,114,117,0,0,0,114,167,0,0,0,114,134,0,0,0, - 114,183,0,0,0,41,9,114,193,0,0,0,114,139,0,0, - 0,114,43,0,0,0,114,202,0,0,0,218,14,110,97,109, - 101,115,112,97,99,101,95,112,97,116,104,90,5,101,110,116, - 114,121,114,50,1,0,0,114,187,0,0,0,114,141,0,0, + 0,114,229,0,0,0,54,4,0,0,115,2,0,0,0,0, + 2,122,31,83,111,117,114,99,101,108,101,115,115,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, + 99,101,78,41,6,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,213,0,0,0,114,229, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,15,1,0,0,34,4,0,0, + 115,6,0,0,0,8,2,4,2,8,16,114,15,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, + 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, + 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, + 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, + 132,0,131,1,90,13,100,20,83,0,41,21,114,252,0,0, + 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, + 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, + 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, + 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, + 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,109, + 0,0,0,114,159,0,0,0,114,5,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, + 0,71,4,0,0,115,4,0,0,0,0,1,6,1,122,28, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, + 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, + 83,0,114,109,0,0,0,114,240,0,0,0,114,242,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,9,95,103,101,116,95,115,112,101,99,28,5,0,0,115, - 40,0,0,0,0,5,4,1,8,1,14,1,2,1,10,1, - 8,1,10,1,14,2,12,1,8,1,2,1,10,1,8,1, - 6,1,8,1,8,5,12,2,12,1,6,1,122,20,80,97, - 116,104,70,105,110,100,101,114,46,95,103,101,116,95,115,112, - 101,99,99,4,0,0,0,0,0,0,0,0,0,0,0,6, - 0,0,0,5,0,0,0,67,0,0,0,115,100,0,0,0, - 124,2,100,1,117,0,114,14,116,0,106,1,125,2,124,0, - 160,2,124,1,124,2,124,3,161,3,125,4,124,4,100,1, - 117,0,114,40,100,1,83,0,124,4,106,3,100,1,117,0, - 114,92,124,4,106,4,125,5,124,5,114,86,100,1,124,4, - 95,5,116,6,124,1,124,5,124,0,106,2,131,3,124,4, - 95,4,124,4,83,0,100,1,83,0,110,4,124,4,83,0, - 100,1,83,0,41,2,122,141,84,114,121,32,116,111,32,102, - 105,110,100,32,97,32,115,112,101,99,32,102,111,114,32,39, - 102,117,108,108,110,97,109,101,39,32,111,110,32,115,121,115, - 46,112,97,116,104,32,111,114,32,39,112,97,116,104,39,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,101, - 97,114,99,104,32,105,115,32,98,97,115,101,100,32,111,110, - 32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, - 97,110,100,32,115,121,115,46,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,46,10,32,32,32, - 32,32,32,32,32,78,41,7,114,8,0,0,0,114,43,0, - 0,0,114,58,1,0,0,114,140,0,0,0,114,178,0,0, - 0,114,181,0,0,0,114,22,1,0,0,41,6,114,193,0, - 0,0,114,139,0,0,0,114,43,0,0,0,114,202,0,0, - 0,114,187,0,0,0,114,57,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,60, - 5,0,0,115,26,0,0,0,0,6,8,1,6,1,14,1, - 8,1,4,1,10,1,6,1,4,3,6,1,16,1,4,2, - 6,2,122,20,80,97,116,104,70,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,30,0,0,0,124,0,160,0,124,1,124,2,161,2, - 125,3,124,3,100,1,117,0,114,24,100,1,83,0,124,3, - 106,1,83,0,41,2,122,170,102,105,110,100,32,116,104,101, - 32,109,111,100,117,108,101,32,111,110,32,115,121,115,46,112, - 97,116,104,32,111,114,32,39,112,97,116,104,39,32,98,97, - 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,115,32,97,110,100,10,32,32,32,32,32,32, - 32,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, - 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,78,114,204,0,0,0,114,205,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,206,0,0, - 0,84,5,0,0,115,8,0,0,0,0,8,12,1,8,1, - 4,1,122,22,80,97,116,104,70,105,110,100,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,99,1,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,79, - 0,0,0,115,24,0,0,0,100,1,100,2,108,0,109,1, - 125,3,1,0,124,3,106,2,124,1,124,2,142,1,83,0, - 41,3,97,32,1,0,0,10,32,32,32,32,32,32,32,32, - 70,105,110,100,32,100,105,115,116,114,105,98,117,116,105,111, - 110,115,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,97,110,32,105,116,101,114,97,98,108,101,32, - 111,102,32,97,108,108,32,68,105,115,116,114,105,98,117,116, - 105,111,110,32,105,110,115,116,97,110,99,101,115,32,99,97, - 112,97,98,108,101,32,111,102,10,32,32,32,32,32,32,32, - 32,108,111,97,100,105,110,103,32,116,104,101,32,109,101,116, - 97,100,97,116,97,32,102,111,114,32,112,97,99,107,97,103, - 101,115,32,109,97,116,99,104,105,110,103,32,96,96,99,111, - 110,116,101,120,116,46,110,97,109,101,96,96,10,32,32,32, - 32,32,32,32,32,40,111,114,32,97,108,108,32,110,97,109, - 101,115,32,105,102,32,96,96,78,111,110,101,96,96,32,105, - 110,100,105,99,97,116,101,100,41,32,97,108,111,110,103,32, - 116,104,101,32,112,97,116,104,115,32,105,110,32,116,104,101, - 32,108,105,115,116,10,32,32,32,32,32,32,32,32,111,102, - 32,100,105,114,101,99,116,111,114,105,101,115,32,96,96,99, - 111,110,116,101,120,116,46,112,97,116,104,96,96,46,10,32, - 32,32,32,32,32,32,32,114,72,0,0,0,41,1,218,18, - 77,101,116,97,100,97,116,97,80,97,116,104,70,105,110,100, - 101,114,41,3,90,18,105,109,112,111,114,116,108,105,98,46, - 109,101,116,97,100,97,116,97,114,59,1,0,0,218,18,102, - 105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,110, - 115,41,4,114,193,0,0,0,114,119,0,0,0,114,120,0, - 0,0,114,59,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,60,1,0,0,97,5,0,0,115, - 4,0,0,0,0,10,12,1,122,29,80,97,116,104,70,105, - 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105, - 98,117,116,105,111,110,115,41,1,78,41,2,78,78,41,1, - 78,41,13,114,125,0,0,0,114,124,0,0,0,114,126,0, - 0,0,114,127,0,0,0,114,207,0,0,0,114,46,1,0, - 0,114,52,1,0,0,114,54,1,0,0,114,55,1,0,0, - 114,58,1,0,0,114,203,0,0,0,114,206,0,0,0,114, - 60,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,45,1,0,0,220,4,0, - 0,115,34,0,0,0,8,2,4,2,2,1,10,9,2,1, - 10,12,2,1,10,21,2,1,10,14,2,1,12,31,2,1, - 12,23,2,1,12,12,2,1,114,45,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, - 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, - 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, - 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, - 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, - 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, - 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, - 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, - 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, - 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, - 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, - 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, - 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, - 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, - 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, - 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, - 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, - 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, - 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, - 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, - 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, - 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, - 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, - 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, - 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, - 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, - 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, - 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, - 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, - 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, - 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, - 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, - 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, - 2,100,0,83,0,114,109,0,0,0,114,3,0,0,0,114, - 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,19,1,0,0,126,5,0,0,115,4, - 0,0,0,4,0,2,0,122,38,70,105,108,101,70,105,110, - 100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,111, - 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,114, - 70,0,0,0,114,104,0,0,0,78,41,7,114,167,0,0, - 0,218,8,95,108,111,97,100,101,114,115,114,43,0,0,0, - 218,11,95,112,97,116,104,95,109,116,105,109,101,218,3,115, - 101,116,218,11,95,112,97,116,104,95,99,97,99,104,101,218, - 19,95,114,101,108,97,120,101,100,95,112,97,116,104,95,99, - 97,99,104,101,41,5,114,118,0,0,0,114,43,0,0,0, - 218,14,108,111,97,100,101,114,95,100,101,116,97,105,108,115, - 90,7,108,111,97,100,101,114,115,114,189,0,0,0,114,3, - 0,0,0,114,62,1,0,0,114,6,0,0,0,114,209,0, - 0,0,120,5,0,0,115,16,0,0,0,0,4,4,1,12, - 1,26,1,6,2,10,1,6,1,8,1,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, + 114,243,0,0,0,75,4,0,0,115,6,0,0,0,0,1, + 12,1,10,255,122,26,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, - 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, - 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, - 116,111,114,121,32,109,116,105,109,101,46,114,104,0,0,0, - 78,41,1,114,64,1,0,0,114,246,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, - 0,134,5,0,0,115,2,0,0,0,0,2,122,28,70,105, - 108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,100, - 97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,42,0,0,0,124,0,160,0,124,1,161,1, - 125,2,124,2,100,1,117,0,114,26,100,1,103,0,102,2, - 83,0,124,2,106,1,124,2,106,2,112,38,103,0,102,2, - 83,0,41,2,122,197,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,44,32,111,114,32,116,104,101,32,110,97,109,101, - 115,112,97,99,101,10,32,32,32,32,32,32,32,32,112,97, - 99,107,97,103,101,32,112,111,114,116,105,111,110,115,46,32, - 82,101,116,117,114,110,115,32,40,108,111,97,100,101,114,44, - 32,108,105,115,116,45,111,102,45,112,111,114,116,105,111,110, - 115,41,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, - 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,78,41,3,114,203, - 0,0,0,114,140,0,0,0,114,178,0,0,0,41,3,114, - 118,0,0,0,114,139,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, - 0,0,140,5,0,0,115,8,0,0,0,0,7,10,1,8, - 1,8,1,122,22,70,105,108,101,70,105,110,100,101,114,46, - 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, - 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, - 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, - 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, - 0,0,41,7,114,118,0,0,0,114,188,0,0,0,114,139, - 0,0,0,114,43,0,0,0,90,4,115,109,115,108,114,202, - 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,58,1,0,0,152,5,0,0, - 115,8,0,0,0,0,1,10,1,8,1,2,255,122,20,70, - 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, - 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, - 0,14,0,0,0,8,0,0,0,67,0,0,0,115,96,1, - 0,0,100,1,125,3,124,1,160,0,100,2,161,1,100,3, - 25,0,125,4,122,24,116,1,124,0,106,2,112,34,116,3, - 160,4,161,0,131,1,106,5,125,5,87,0,110,22,4,0, - 116,6,121,64,1,0,1,0,1,0,100,4,125,5,89,0, - 110,2,48,0,124,5,124,0,106,7,107,3,114,90,124,0, - 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, - 114,112,124,0,106,10,125,6,124,4,160,11,161,0,125,7, - 110,10,124,0,106,12,125,6,124,4,125,7,124,7,124,6, - 118,0,114,216,116,13,124,0,106,2,124,4,131,2,125,8, - 124,0,106,14,68,0,93,58,92,2,125,9,125,10,100,5, - 124,9,23,0,125,11,116,13,124,8,124,11,131,2,125,12, - 116,15,124,12,131,1,114,148,124,0,160,16,124,10,124,1, - 124,12,124,8,103,1,124,2,161,5,2,0,1,0,83,0, - 113,148,116,17,124,8,131,1,125,3,124,0,106,14,68,0, - 93,82,92,2,125,9,125,10,116,13,124,0,106,2,124,4, - 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, - 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, - 118,0,114,222,116,15,124,12,131,1,114,222,124,0,160,16, - 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, - 83,0,113,222,124,3,144,1,114,92,116,18,160,19,100,9, - 124,8,161,2,1,0,116,18,160,20,124,1,100,8,161,2, - 125,13,124,8,103,1,124,13,95,21,124,13,83,0,100,8, - 83,0,41,10,122,111,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,115,112,101,99,32,102,111,114,32,116,104,101, - 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,115,32,116,104,101,32,109,97,116,99,104,105,110,103, - 32,115,112,101,99,44,32,111,114,32,78,111,110,101,32,105, - 102,32,110,111,116,32,102,111,117,110,100,46,10,32,32,32, - 32,32,32,32,32,70,114,70,0,0,0,114,27,0,0,0, - 114,104,0,0,0,114,209,0,0,0,122,9,116,114,121,105, - 110,103,32,123,125,41,1,90,9,118,101,114,98,111,115,105, - 116,121,78,122,25,112,111,115,115,105,98,108,101,32,110,97, - 109,101,115,112,97,99,101,32,102,111,114,32,123,125,41,22, - 114,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, - 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, - 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, - 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, - 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, - 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,0, - 0,0,114,134,0,0,0,114,149,0,0,0,114,183,0,0, - 0,114,178,0,0,0,41,14,114,118,0,0,0,114,139,0, - 0,0,114,202,0,0,0,90,12,105,115,95,110,97,109,101, - 115,112,97,99,101,90,11,116,97,105,108,95,109,111,100,117, - 108,101,114,169,0,0,0,90,5,99,97,99,104,101,90,12, - 99,97,99,104,101,95,109,111,100,117,108,101,90,9,98,97, - 115,101,95,112,97,116,104,114,17,1,0,0,114,188,0,0, - 0,90,13,105,110,105,116,95,102,105,108,101,110,97,109,101, - 90,9,102,117,108,108,95,112,97,116,104,114,187,0,0,0, + 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, + 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, + 83,0,114,109,0,0,0,114,244,0,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,247,0,0,0,79,4,0,0,115,2,0,0,0,0,1, + 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, + 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, + 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, + 41,2,122,38,67,114,101,97,116,101,32,97,110,32,117,110, + 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,41,7,114,134,0,0,0,114,214,0,0,0,114,163, + 0,0,0,90,14,99,114,101,97,116,101,95,100,121,110,97, + 109,105,99,114,149,0,0,0,114,116,0,0,0,114,43,0, + 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,212,0,0,0,82,4,0,0,115,18,0,0,0, + 0,2,4,1,4,0,2,255,4,2,6,1,4,0,4,255, + 4,2,122,33,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,5,0,0,0,67,0,0,0,115,36, + 0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,1, + 0,116,0,160,4,100,1,124,0,106,5,124,0,106,6,161, + 3,1,0,100,2,83,0,41,3,122,30,73,110,105,116,105, + 97,108,105,122,101,32,97,110,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,122,40,101,120,116,101,110, + 115,105,111,110,32,109,111,100,117,108,101,32,123,33,114,125, + 32,101,120,101,99,117,116,101,100,32,102,114,111,109,32,123, + 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, + 114,163,0,0,0,90,12,101,120,101,99,95,100,121,110,97, + 109,105,99,114,149,0,0,0,114,116,0,0,0,114,43,0, + 0,0,114,253,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,217,0,0,0,90,4,0,0,115, + 10,0,0,0,0,2,14,1,6,1,4,0,4,255,122,31, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,3,0,0,0,115,36,0,0,0,116,0,124, + 0,106,1,131,1,100,1,25,0,137,0,116,2,135,0,102, + 1,100,2,100,3,132,8,116,3,68,0,131,1,131,1,83, + 0,41,4,122,49,82,101,116,117,114,110,32,84,114,117,101, + 32,105,102,32,116,104,101,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,32,105,115,32,97,32,112,97, + 99,107,97,103,101,46,114,38,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 51,0,0,0,115,26,0,0,0,124,0,93,18,125,1,136, + 0,100,0,124,1,23,0,107,2,86,0,1,0,113,2,100, + 1,83,0,41,2,114,209,0,0,0,78,114,3,0,0,0, + 169,2,114,31,0,0,0,218,6,115,117,102,102,105,120,169, + 1,90,9,102,105,108,101,95,110,97,109,101,114,3,0,0, + 0,114,6,0,0,0,218,9,60,103,101,110,101,120,112,114, + 62,99,4,0,0,115,4,0,0,0,4,1,2,255,122,49, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,105,115,95,112,97,99,107,97,103,101,46,60, + 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, + 62,41,4,114,46,0,0,0,114,43,0,0,0,218,3,97, + 110,121,218,18,69,88,84,69,78,83,73,79,78,95,83,85, + 70,70,73,88,69,83,114,219,0,0,0,114,3,0,0,0, + 114,18,1,0,0,114,6,0,0,0,114,182,0,0,0,96, + 4,0,0,115,8,0,0,0,0,2,14,1,12,1,2,255, + 122,30,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,63,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, + 99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,98, + 106,101,99,116,46,78,114,3,0,0,0,114,219,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 203,0,0,0,157,5,0,0,115,74,0,0,0,0,5,4, - 1,14,1,2,1,24,1,12,1,10,1,10,1,8,1,6, - 2,6,1,6,1,10,2,6,1,4,2,8,1,12,1,14, - 1,8,1,10,1,8,1,26,4,8,2,14,1,16,1,16, - 1,12,1,8,1,10,1,2,0,2,255,10,2,6,1,12, - 1,12,1,8,1,4,1,122,20,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, - 0,0,67,0,0,0,115,188,0,0,0,124,0,106,0,125, - 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, - 0,161,1,125,2,87,0,110,28,4,0,116,4,116,5,116, - 6,102,3,121,56,1,0,1,0,1,0,103,0,125,2,89, - 0,110,2,48,0,116,7,106,8,160,9,100,1,161,1,115, - 82,116,10,124,2,131,1,124,0,95,11,110,74,116,10,131, - 0,125,3,124,2,68,0,93,56,125,4,124,4,160,12,100, - 2,161,1,92,3,125,5,125,6,125,7,124,6,114,134,100, - 3,160,13,124,5,124,7,160,14,161,0,161,2,125,8,110, - 4,124,5,125,8,124,3,160,15,124,8,161,1,1,0,113, - 92,124,3,124,0,95,11,116,7,106,8,160,9,116,16,161, - 1,114,184,100,4,100,5,132,0,124,2,68,0,131,1,124, - 0,95,17,100,6,83,0,41,7,122,68,70,105,108,108,32, - 116,104,101,32,99,97,99,104,101,32,111,102,32,112,111,116, - 101,110,116,105,97,108,32,109,111,100,117,108,101,115,32,97, - 110,100,32,112,97,99,107,97,103,101,115,32,102,111,114,32, - 116,104,105,115,32,100,105,114,101,99,116,111,114,121,46,114, - 0,0,0,0,114,70,0,0,0,114,60,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,83,0,0,0,115,20,0,0,0,104,0,124,0, - 93,12,125,1,124,1,160,0,161,0,146,2,113,4,83,0, - 114,3,0,0,0,41,1,114,105,0,0,0,41,2,114,31, - 0,0,0,90,2,102,110,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,9,60,115,101,116,99,111,109,112, - 62,234,5,0,0,115,4,0,0,0,6,0,2,0,122,41, - 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, - 95,99,97,99,104,101,46,60,108,111,99,97,108,115,62,46, - 60,115,101,116,99,111,109,112,62,78,41,18,114,43,0,0, - 0,114,2,0,0,0,114,7,1,0,0,114,54,0,0,0, - 114,3,1,0,0,218,15,80,101,114,109,105,115,115,105,111, - 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101, - 99,116,111,114,121,69,114,114,111,114,114,8,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,65,1,0,0,114,66, - 1,0,0,114,100,0,0,0,114,61,0,0,0,114,105,0, - 0,0,218,3,97,100,100,114,11,0,0,0,114,67,1,0, - 0,41,9,114,118,0,0,0,114,43,0,0,0,114,8,1, - 0,0,90,21,108,111,119,101,114,95,115,117,102,102,105,120, - 95,99,111,110,116,101,110,116,115,114,41,1,0,0,114,116, - 0,0,0,114,29,1,0,0,114,17,1,0,0,90,8,110, - 101,119,95,110,97,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,69,1,0,0,205,5,0,0,115, - 34,0,0,0,0,2,6,1,2,1,22,1,18,3,10,3, - 12,1,12,7,6,1,8,1,16,1,4,1,18,2,4,1, - 12,1,6,1,12,1,122,22,70,105,108,101,70,105,110,100, - 101,114,46,95,102,105,108,108,95,99,97,99,104,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,7,0,0,0,115,18,0,0,0,135,0,135,1, - 102,2,100,1,100,2,132,8,125,2,124,2,83,0,41,3, - 97,20,1,0,0,65,32,99,108,97,115,115,32,109,101,116, - 104,111,100,32,119,104,105,99,104,32,114,101,116,117,114,110, - 115,32,97,32,99,108,111,115,117,114,101,32,116,111,32,117, - 115,101,32,111,110,32,115,121,115,46,112,97,116,104,95,104, - 111,111,107,10,32,32,32,32,32,32,32,32,119,104,105,99, - 104,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110, - 32,105,110,115,116,97,110,99,101,32,117,115,105,110,103,32, - 116,104,101,32,115,112,101,99,105,102,105,101,100,32,108,111, - 97,100,101,114,115,32,97,110,100,32,116,104,101,32,112,97, - 116,104,10,32,32,32,32,32,32,32,32,99,97,108,108,101, - 100,32,111,110,32,116,104,101,32,99,108,111,115,117,114,101, - 46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,104, - 101,32,112,97,116,104,32,99,97,108,108,101,100,32,111,110, - 32,116,104,101,32,99,108,111,115,117,114,101,32,105,115,32, - 110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,44, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,10, - 32,32,32,32,32,32,32,32,114,97,105,115,101,100,46,10, - 10,32,32,32,32,32,32,32,32,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,19,0, - 0,0,115,36,0,0,0,116,0,124,0,131,1,115,20,116, - 1,100,1,124,0,100,2,141,2,130,1,136,0,124,0,103, - 1,136,1,162,1,82,0,142,0,83,0,41,3,122,45,80, - 97,116,104,32,104,111,111,107,32,102,111,114,32,105,109,112, - 111,114,116,108,105,98,46,109,97,99,104,105,110,101,114,121, - 46,70,105,108,101,70,105,110,100,101,114,46,122,30,111,110, - 108,121,32,100,105,114,101,99,116,111,114,105,101,115,32,97, - 114,101,32,115,117,112,112,111,114,116,101,100,114,47,0,0, - 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, - 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, - 0,0,0,114,6,0,0,0,218,24,112,97,116,104,95,104, - 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100, - 101,114,246,5,0,0,115,6,0,0,0,0,2,8,1,12, - 1,122,54,70,105,108,101,70,105,110,100,101,114,46,112,97, - 116,104,95,104,111,111,107,46,60,108,111,99,97,108,115,62, - 46,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, - 105,108,101,70,105,110,100,101,114,114,3,0,0,0,41,3, - 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, - 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, - 112,97,116,104,95,104,111,111,107,236,5,0,0,115,4,0, - 0,0,0,10,14,6,122,20,70,105,108,101,70,105,110,100, - 101,114,46,112,97,116,104,95,104,111,111,107,99,1,0,0, + 213,0,0,0,102,4,0,0,115,2,0,0,0,0,2,122, + 28,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,53,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,115,32,104,97,118,101,32,110,111,32,115,111,117,114, + 99,101,32,99,111,100,101,46,78,114,3,0,0,0,114,219, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,229,0,0,0,106,4,0,0,115,2,0,0,0, + 0,2,122,30,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, + 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, + 124,0,106,0,83,0,114,250,0,0,0,114,47,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,179,0,0,0,110,4,0,0,115,2,0, + 0,0,0,3,122,32,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,102,105, + 108,101,110,97,109,101,78,41,14,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,127,0,0,0,114,209,0, + 0,0,114,243,0,0,0,114,247,0,0,0,114,212,0,0, + 0,114,217,0,0,0,114,182,0,0,0,114,213,0,0,0, + 114,229,0,0,0,114,136,0,0,0,114,179,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,252,0,0,0,63,4,0,0,115,22,0,0, + 0,8,2,4,6,8,4,8,4,8,3,8,8,8,6,8, + 6,8,4,8,4,2,1,114,252,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,104,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,100,7,132,0,90,6,100,8, + 100,9,132,0,90,7,100,10,100,11,132,0,90,8,100,12, + 100,13,132,0,90,9,100,14,100,15,132,0,90,10,100,16, + 100,17,132,0,90,11,100,18,100,19,132,0,90,12,100,20, + 100,21,132,0,90,13,100,22,100,23,132,0,90,14,100,24, + 83,0,41,25,218,14,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,97,38,1,0,0,82,101,112,114,101,115,101, + 110,116,115,32,97,32,110,97,109,101,115,112,97,99,101,32, + 112,97,99,107,97,103,101,39,115,32,112,97,116,104,46,32, + 32,73,116,32,117,115,101,115,32,116,104,101,32,109,111,100, + 117,108,101,32,110,97,109,101,10,32,32,32,32,116,111,32, + 102,105,110,100,32,105,116,115,32,112,97,114,101,110,116,32, + 109,111,100,117,108,101,44,32,97,110,100,32,102,114,111,109, + 32,116,104,101,114,101,32,105,116,32,108,111,111,107,115,32, + 117,112,32,116,104,101,32,112,97,114,101,110,116,39,115,10, + 32,32,32,32,95,95,112,97,116,104,95,95,46,32,32,87, + 104,101,110,32,116,104,105,115,32,99,104,97,110,103,101,115, + 44,32,116,104,101,32,109,111,100,117,108,101,39,115,32,111, + 119,110,32,112,97,116,104,32,105,115,32,114,101,99,111,109, + 112,117,116,101,100,44,10,32,32,32,32,117,115,105,110,103, + 32,112,97,116,104,95,102,105,110,100,101,114,46,32,32,70, + 111,114,32,116,111,112,45,108,101,118,101,108,32,109,111,100, + 117,108,101,115,44,32,116,104,101,32,112,97,114,101,110,116, + 32,109,111,100,117,108,101,39,115,32,112,97,116,104,10,32, + 32,32,32,105,115,32,115,121,115,46,112,97,116,104,46,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 3,0,0,0,67,0,0,0,115,36,0,0,0,124,1,124, + 0,95,0,124,2,124,0,95,1,116,2,124,0,160,3,161, + 0,131,1,124,0,95,4,124,3,124,0,95,5,100,0,83, + 0,114,109,0,0,0,41,6,218,5,95,110,97,109,101,218, + 5,95,112,97,116,104,114,111,0,0,0,218,16,95,103,101, + 116,95,112,97,114,101,110,116,95,112,97,116,104,218,17,95, + 108,97,115,116,95,112,97,114,101,110,116,95,112,97,116,104, + 218,12,95,112,97,116,104,95,102,105,110,100,101,114,169,4, + 114,118,0,0,0,114,116,0,0,0,114,43,0,0,0,90, + 11,112,97,116,104,95,102,105,110,100,101,114,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, + 123,4,0,0,115,8,0,0,0,0,1,6,1,6,1,14, + 1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,124,0,106,0,160,1,100,1, + 161,1,92,3,125,1,125,2,125,3,124,2,100,2,107,2, + 114,30,100,3,83,0,124,1,100,4,102,2,83,0,41,5, + 122,62,82,101,116,117,114,110,115,32,97,32,116,117,112,108, + 101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100, + 117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116, + 45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41, + 114,70,0,0,0,114,39,0,0,0,41,2,114,8,0,0, + 0,114,43,0,0,0,90,8,95,95,112,97,116,104,95,95, + 41,2,114,23,1,0,0,114,40,0,0,0,41,4,114,118, + 0,0,0,114,14,1,0,0,218,3,100,111,116,90,2,109, + 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,23,95,102,105,110,100,95,112,97,114,101,110,116,95,112, + 97,116,104,95,110,97,109,101,115,129,4,0,0,115,8,0, + 0,0,0,2,18,1,8,2,4,3,122,38,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,102,105,110,100, + 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, + 101,115,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,28,0,0,0, + 124,0,160,0,161,0,92,2,125,1,125,2,116,1,116,2, + 106,3,124,1,25,0,124,2,131,2,83,0,114,109,0,0, + 0,41,4,114,30,1,0,0,114,130,0,0,0,114,8,0, + 0,0,218,7,109,111,100,117,108,101,115,41,3,114,118,0, + 0,0,90,18,112,97,114,101,110,116,95,109,111,100,117,108, + 101,95,110,97,109,101,90,14,112,97,116,104,95,97,116,116, + 114,95,110,97,109,101,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,25,1,0,0,139,4,0,0,115,4, + 0,0,0,0,1,12,1,122,31,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,103,101,116,95,112,97,114, + 101,110,116,95,112,97,116,104,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,80,0,0,0,116,0,124,0,160,1,161,0,131,1, + 125,1,124,1,124,0,106,2,107,3,114,74,124,0,160,3, + 124,0,106,4,124,1,161,2,125,2,124,2,100,0,117,1, + 114,68,124,2,106,5,100,0,117,0,114,68,124,2,106,6, + 114,68,124,2,106,6,124,0,95,7,124,1,124,0,95,2, + 124,0,106,7,83,0,114,109,0,0,0,41,8,114,111,0, + 0,0,114,25,1,0,0,114,26,1,0,0,114,27,1,0, + 0,114,23,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,24,1,0,0,41,3,114,118,0,0,0,90,11,112,97, + 114,101,110,116,95,112,97,116,104,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, + 114,101,99,97,108,99,117,108,97,116,101,143,4,0,0,115, + 16,0,0,0,0,2,12,1,10,1,14,3,18,1,6,1, + 8,1,6,1,122,27,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,114,101,99,97,108,99,117,108,97,116, + 101,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, + 41,2,114,6,1,0,0,114,32,1,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,8,95,95,105,116,101,114,95,95,156,4,0,0,115,2, + 0,0,0,0,1,122,23,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, + 161,0,124,1,25,0,83,0,114,109,0,0,0,169,1,114, + 32,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, + 101,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,11,95,95,103,101,116,105,116,101,109,95,95,159,4, + 0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, + 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, + 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, + 0,114,109,0,0,0,41,1,114,24,1,0,0,41,3,114, + 118,0,0,0,114,35,1,0,0,114,43,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, + 95,115,101,116,105,116,101,109,95,95,162,4,0,0,115,2, + 0,0,0,0,1,122,26,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,95, + 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, + 41,2,114,22,0,0,0,114,32,1,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,7,95,95,108,101,110,95,95,165,4,0,0,115,2,0, + 0,0,0,1,122,22,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,95,108,101,110,95,95,99,1,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, - 106,1,161,1,83,0,41,2,78,122,16,70,105,108,101,70, - 105,110,100,101,114,40,123,33,114,125,41,41,2,114,61,0, - 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, - 254,5,0,0,115,2,0,0,0,0,1,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,95, - 41,1,78,41,15,114,125,0,0,0,114,124,0,0,0,114, - 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,46, - 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, - 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, - 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,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,61,0,0,0,114,24,1,0,0,114,246,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 8,95,95,114,101,112,114,95,95,168,4,0,0,115,2,0, + 0,0,0,1,122,23,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,95,114,101,112,114,95,95,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,12,0,0,0,124,1,124,0,160, + 0,161,0,118,0,83,0,114,109,0,0,0,114,34,1,0, + 0,169,2,114,118,0,0,0,218,4,105,116,101,109,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, + 95,99,111,110,116,97,105,110,115,95,95,171,4,0,0,115, + 2,0,0,0,0,1,122,27,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,95,95,99,111,110,116,97,105,110, + 115,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, + 0,124,0,106,0,160,1,124,1,161,1,1,0,100,0,83, + 0,114,109,0,0,0,41,2,114,24,1,0,0,114,186,0, + 0,0,114,40,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,186,0,0,0,174,4,0,0,115, + 2,0,0,0,0,1,122,21,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,97,112,112,101,110,100,78,41,15, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,209,0,0,0,114,30,1,0,0,114,25, + 1,0,0,114,32,1,0,0,114,33,1,0,0,114,36,1, + 0,0,114,37,1,0,0,114,38,1,0,0,114,39,1,0, + 0,114,42,1,0,0,114,186,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 22,1,0,0,116,4,0,0,115,24,0,0,0,8,1,4, + 6,8,6,8,10,8,4,8,13,8,3,8,3,8,3,8, + 3,8,3,8,3,114,22,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, + 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, + 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, + 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, + 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, + 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, + 124,3,131,3,124,0,95,1,100,0,83,0,114,109,0,0, + 0,41,2,114,22,1,0,0,114,24,1,0,0,114,28,1, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,209,0,0,0,180,4,0,0,115,2,0,0,0,0, + 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,1, + 106,1,161,1,83,0,41,2,122,115,82,101,116,117,114,110, + 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, + 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, + 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, + 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, + 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, + 101,115,112,97,99,101,41,62,41,2,114,61,0,0,0,114, + 125,0,0,0,41,2,114,193,0,0,0,114,216,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 11,109,111,100,117,108,101,95,114,101,112,114,183,4,0,0, + 115,2,0,0,0,0,7,122,28,95,78,97,109,101,115,112, + 97,99,101,76,111,97,100,101,114,46,109,111,100,117,108,101, + 95,114,101,112,114,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,78,84,114,3,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,182,0,0,0,192,4,0,0,115,2,0, + 0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,105,115,95,112,97,99,107,97,103, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,78,114,39,0,0,0,114,3,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,229,0,0,0,195,4,0,0,115,2,0, + 0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,6,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,100,1,100,2,100,3,100,4,100,5,141,4,83,0,41, + 6,78,114,39,0,0,0,122,8,60,115,116,114,105,110,103, + 62,114,215,0,0,0,84,41,1,114,231,0,0,0,41,1, + 114,232,0,0,0,114,219,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,213,0,0,0,198,4, + 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, + 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95, + 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,114,210,0,0,0,114,3,0,0,0, + 114,211,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,212,0,0,0,201,4,0,0,115,2,0, + 0,0,0,1,122,30,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,0,83,0,114,109,0,0,0,114,3,0,0,0, + 114,253,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,217,0,0,0,204,4,0,0,115,2,0, + 0,0,0,1,122,28,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,101,120,101,99,95,109,111,100,117, + 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,26,0,0,0, + 116,0,160,1,100,1,124,0,106,2,161,2,1,0,116,0, + 160,3,124,0,124,1,161,2,83,0,41,2,122,98,76,111, + 97,100,32,97,32,110,97,109,101,115,112,97,99,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 122,38,110,97,109,101,115,112,97,99,101,32,109,111,100,117, + 108,101,32,108,111,97,100,101,100,32,119,105,116,104,32,112, + 97,116,104,32,123,33,114,125,41,4,114,134,0,0,0,114, + 149,0,0,0,114,24,1,0,0,114,218,0,0,0,114,219, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,220,0,0,0,207,4,0,0,115,8,0,0,0, + 0,7,6,1,4,255,4,2,122,28,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,78,41,12,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,209,0,0,0,114,207,0, + 0,0,114,44,1,0,0,114,182,0,0,0,114,229,0,0, + 0,114,213,0,0,0,114,212,0,0,0,114,217,0,0,0, + 114,220,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,43,1,0,0,179,4, + 0,0,115,18,0,0,0,8,1,8,3,2,1,10,8,8, + 3,8,3,8,3,8,3,8,3,114,43,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,118,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,101,4,100,2,100,3,132,0, + 131,1,90,5,101,4,100,4,100,5,132,0,131,1,90,6, + 101,4,100,6,100,7,132,0,131,1,90,7,101,4,100,8, + 100,9,132,0,131,1,90,8,101,4,100,19,100,11,100,12, + 132,1,131,1,90,9,101,4,100,20,100,13,100,14,132,1, + 131,1,90,10,101,4,100,21,100,15,100,16,132,1,131,1, + 90,11,101,4,100,17,100,18,132,0,131,1,90,12,100,10, + 83,0,41,22,218,10,80,97,116,104,70,105,110,100,101,114, + 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, + 101,114,32,102,111,114,32,115,121,115,46,112,97,116,104,32, + 97,110,100,32,112,97,99,107,97,103,101,32,95,95,112,97, + 116,104,95,95,32,97,116,116,114,105,98,117,116,101,115,46, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,64,0,0,0,116,0, + 116,1,106,2,160,3,161,0,131,1,68,0,93,44,92,2, + 125,1,125,2,124,2,100,1,117,0,114,40,116,1,106,2, + 124,1,61,0,113,14,116,4,124,2,100,2,131,2,114,14, + 124,2,160,5,161,0,1,0,113,14,100,1,83,0,41,3, + 122,125,67,97,108,108,32,116,104,101,32,105,110,118,97,108, + 105,100,97,116,101,95,99,97,99,104,101,115,40,41,32,109, + 101,116,104,111,100,32,111,110,32,97,108,108,32,112,97,116, + 104,32,101,110,116,114,121,32,102,105,110,100,101,114,115,10, + 32,32,32,32,32,32,32,32,115,116,111,114,101,100,32,105, + 110,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,115,32,40,119,104,101,114, + 101,32,105,109,112,108,101,109,101,110,116,101,100,41,46,78, + 218,17,105,110,118,97,108,105,100,97,116,101,95,99,97,99, + 104,101,115,41,6,218,4,108,105,115,116,114,8,0,0,0, + 218,19,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,218,5,105,116,101,109,115,114,128,0,0, + 0,114,46,1,0,0,41,3,114,193,0,0,0,114,116,0, + 0,0,218,6,102,105,110,100,101,114,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,46,1,0,0,225,4, + 0,0,115,10,0,0,0,0,4,22,1,8,1,10,1,10, + 1,122,28,80,97,116,104,70,105,110,100,101,114,46,105,110, + 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 9,0,0,0,67,0,0,0,115,82,0,0,0,116,0,106, + 1,100,1,117,1,114,28,116,0,106,1,115,28,116,2,160, + 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, + 42,125,2,122,14,124,2,124,1,131,1,87,0,2,0,1, + 0,83,0,4,0,116,5,121,74,1,0,1,0,1,0,89, + 0,113,34,89,0,113,34,48,0,113,34,100,1,83,0,41, + 3,122,46,83,101,97,114,99,104,32,115,121,115,46,112,97, + 116,104,95,104,111,111,107,115,32,102,111,114,32,97,32,102, + 105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,39, + 46,78,122,23,115,121,115,46,112,97,116,104,95,104,111,111, + 107,115,32,105,115,32,101,109,112,116,121,41,6,114,8,0, + 0,0,218,10,112,97,116,104,95,104,111,111,107,115,114,74, + 0,0,0,114,75,0,0,0,114,138,0,0,0,114,117,0, + 0,0,41,3,114,193,0,0,0,114,43,0,0,0,90,4, + 104,111,111,107,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,95,112,97,116,104,95,104,111,111,107,115, + 235,4,0,0,115,16,0,0,0,0,3,16,1,12,1,10, + 1,2,1,14,1,12,1,12,2,122,22,80,97,116,104,70, + 105,110,100,101,114,46,95,112,97,116,104,95,104,111,111,107, + 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,100,0,0,0,124, + 1,100,1,107,2,114,42,122,12,116,0,160,1,161,0,125, + 1,87,0,110,20,4,0,116,2,121,40,1,0,1,0,1, + 0,89,0,100,2,83,0,48,0,122,14,116,3,106,4,124, + 1,25,0,125,2,87,0,110,38,4,0,116,5,121,94,1, + 0,1,0,1,0,124,0,160,6,124,1,161,1,125,2,124, + 2,116,3,106,4,124,1,60,0,89,0,110,2,48,0,124, + 2,83,0,41,3,122,210,71,101,116,32,116,104,101,32,102, + 105,110,100,101,114,32,102,111,114,32,116,104,101,32,112,97, + 116,104,32,101,110,116,114,121,32,102,114,111,109,32,115,121, + 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,46,10,10,32,32,32,32,32,32,32,32, + 73,102,32,116,104,101,32,112,97,116,104,32,101,110,116,114, + 121,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32, + 99,97,99,104,101,44,32,102,105,110,100,32,116,104,101,32, + 97,112,112,114,111,112,114,105,97,116,101,32,102,105,110,100, + 101,114,10,32,32,32,32,32,32,32,32,97,110,100,32,99, + 97,99,104,101,32,105,116,46,32,73,102,32,110,111,32,102, + 105,110,100,101,114,32,105,115,32,97,118,97,105,108,97,98, + 108,101,44,32,115,116,111,114,101,32,78,111,110,101,46,10, + 10,32,32,32,32,32,32,32,32,114,39,0,0,0,78,41, + 7,114,2,0,0,0,114,54,0,0,0,114,3,1,0,0, + 114,8,0,0,0,114,48,1,0,0,218,8,75,101,121,69, + 114,114,111,114,114,52,1,0,0,41,3,114,193,0,0,0, + 114,43,0,0,0,114,50,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,20,95,112,97,116,104, + 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,248, + 4,0,0,115,22,0,0,0,0,8,8,1,2,1,12,1, + 12,3,8,1,2,1,14,1,12,1,10,1,16,1,122,31, + 80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,104, + 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,99, + 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 4,0,0,0,67,0,0,0,115,82,0,0,0,116,0,124, + 2,100,1,131,2,114,26,124,2,160,1,124,1,161,1,92, + 2,125,3,125,4,110,14,124,2,160,2,124,1,161,1,125, + 3,103,0,125,4,124,3,100,0,117,1,114,60,116,3,160, + 4,124,1,124,3,161,2,83,0,116,3,160,5,124,1,100, + 0,161,2,125,5,124,4,124,5,95,6,124,5,83,0,41, + 2,78,114,137,0,0,0,41,7,114,128,0,0,0,114,137, + 0,0,0,114,206,0,0,0,114,134,0,0,0,114,201,0, + 0,0,114,183,0,0,0,114,178,0,0,0,41,6,114,193, + 0,0,0,114,139,0,0,0,114,50,1,0,0,114,140,0, + 0,0,114,141,0,0,0,114,187,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,16,95,108,101, + 103,97,99,121,95,103,101,116,95,115,112,101,99,14,5,0, + 0,115,18,0,0,0,0,4,10,1,16,2,10,1,4,1, + 8,1,12,1,12,1,6,1,122,27,80,97,116,104,70,105, + 110,100,101,114,46,95,108,101,103,97,99,121,95,103,101,116, + 95,115,112,101,99,78,99,4,0,0,0,0,0,0,0,0, + 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115, + 166,0,0,0,103,0,125,4,124,2,68,0,93,134,125,5, + 116,0,124,5,116,1,116,2,102,2,131,2,115,28,113,8, + 124,0,160,3,124,5,161,1,125,6,124,6,100,1,117,1, + 114,8,116,4,124,6,100,2,131,2,114,70,124,6,160,5, + 124,1,124,3,161,2,125,7,110,12,124,0,160,6,124,1, + 124,6,161,2,125,7,124,7,100,1,117,0,114,92,113,8, + 124,7,106,7,100,1,117,1,114,110,124,7,2,0,1,0, + 83,0,124,7,106,8,125,8,124,8,100,1,117,0,114,132, + 116,9,100,3,131,1,130,1,124,4,160,10,124,8,161,1, + 1,0,113,8,116,11,160,12,124,1,100,1,161,2,125,7, + 124,4,124,7,95,8,124,7,83,0,41,4,122,63,70,105, + 110,100,32,116,104,101,32,108,111,97,100,101,114,32,111,114, + 32,110,97,109,101,115,112,97,99,101,95,112,97,116,104,32, + 102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,47, + 112,97,99,107,97,103,101,32,110,97,109,101,46,78,114,203, + 0,0,0,122,19,115,112,101,99,32,109,105,115,115,105,110, + 103,32,108,111,97,100,101,114,41,13,114,161,0,0,0,114, + 84,0,0,0,218,5,98,121,116,101,115,114,54,1,0,0, + 114,128,0,0,0,114,203,0,0,0,114,55,1,0,0,114, + 140,0,0,0,114,178,0,0,0,114,117,0,0,0,114,167, + 0,0,0,114,134,0,0,0,114,183,0,0,0,41,9,114, + 193,0,0,0,114,139,0,0,0,114,43,0,0,0,114,202, + 0,0,0,218,14,110,97,109,101,115,112,97,99,101,95,112, + 97,116,104,90,5,101,110,116,114,121,114,50,1,0,0,114, + 187,0,0,0,114,141,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,9,95,103,101,116,95,115, + 112,101,99,29,5,0,0,115,40,0,0,0,0,5,4,1, + 8,1,14,1,2,1,10,1,8,1,10,1,14,2,12,1, + 8,1,2,1,10,1,8,1,6,1,8,1,8,5,12,2, + 12,1,6,1,122,20,80,97,116,104,70,105,110,100,101,114, + 46,95,103,101,116,95,115,112,101,99,99,4,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,67, + 0,0,0,115,100,0,0,0,124,2,100,1,117,0,114,14, + 116,0,106,1,125,2,124,0,160,2,124,1,124,2,124,3, + 161,3,125,4,124,4,100,1,117,0,114,40,100,1,83,0, + 124,4,106,3,100,1,117,0,114,92,124,4,106,4,125,5, + 124,5,114,86,100,1,124,4,95,5,116,6,124,1,124,5, + 124,0,106,2,131,3,124,4,95,4,124,4,83,0,100,1, + 83,0,110,4,124,4,83,0,100,1,83,0,41,2,122,141, + 84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112, + 101,99,32,102,111,114,32,39,102,117,108,108,110,97,109,101, + 39,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114, + 32,39,112,97,116,104,39,46,10,10,32,32,32,32,32,32, + 32,32,84,104,101,32,115,101,97,114,99,104,32,105,115,32, + 98,97,115,101,100,32,111,110,32,115,121,115,46,112,97,116, + 104,95,104,111,111,107,115,32,97,110,100,32,115,121,115,46, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,46,10,32,32,32,32,32,32,32,32,78,41,7, + 114,8,0,0,0,114,43,0,0,0,114,58,1,0,0,114, + 140,0,0,0,114,178,0,0,0,114,181,0,0,0,114,22, + 1,0,0,41,6,114,193,0,0,0,114,139,0,0,0,114, + 43,0,0,0,114,202,0,0,0,114,187,0,0,0,114,57, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,203,0,0,0,61,5,0,0,115,26,0,0,0, + 0,6,8,1,6,1,14,1,8,1,4,1,10,1,6,1, + 4,3,6,1,16,1,4,2,6,2,122,20,80,97,116,104, + 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,30,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,117,0, + 114,24,100,1,83,0,124,3,106,1,83,0,41,2,122,170, + 102,105,110,100,32,116,104,101,32,109,111,100,117,108,101,32, + 111,110,32,115,121,115,46,112,97,116,104,32,111,114,32,39, + 112,97,116,104,39,32,98,97,115,101,100,32,111,110,32,115, + 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, + 100,10,32,32,32,32,32,32,32,32,115,121,115,46,112,97, + 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,78,114,204,0,0,0, + 114,205,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,206,0,0,0,85,5,0,0,115,8,0, + 0,0,0,8,12,1,8,1,4,1,122,22,80,97,116,104, + 70,105,110,100,101,114,46,102,105,110,100,95,109,111,100,117, + 108,101,99,1,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,79,0,0,0,115,28,0,0,0, + 100,1,100,2,108,0,109,1,125,3,1,0,124,3,106,2, + 124,1,105,0,124,2,164,1,142,1,83,0,41,3,97,32, + 1,0,0,10,32,32,32,32,32,32,32,32,70,105,110,100, + 32,100,105,115,116,114,105,98,117,116,105,111,110,115,46,10, + 10,32,32,32,32,32,32,32,32,82,101,116,117,114,110,32, + 97,110,32,105,116,101,114,97,98,108,101,32,111,102,32,97, + 108,108,32,68,105,115,116,114,105,98,117,116,105,111,110,32, + 105,110,115,116,97,110,99,101,115,32,99,97,112,97,98,108, + 101,32,111,102,10,32,32,32,32,32,32,32,32,108,111,97, + 100,105,110,103,32,116,104,101,32,109,101,116,97,100,97,116, + 97,32,102,111,114,32,112,97,99,107,97,103,101,115,32,109, + 97,116,99,104,105,110,103,32,96,96,99,111,110,116,101,120, + 116,46,110,97,109,101,96,96,10,32,32,32,32,32,32,32, + 32,40,111,114,32,97,108,108,32,110,97,109,101,115,32,105, + 102,32,96,96,78,111,110,101,96,96,32,105,110,100,105,99, + 97,116,101,100,41,32,97,108,111,110,103,32,116,104,101,32, + 112,97,116,104,115,32,105,110,32,116,104,101,32,108,105,115, + 116,10,32,32,32,32,32,32,32,32,111,102,32,100,105,114, + 101,99,116,111,114,105,101,115,32,96,96,99,111,110,116,101, + 120,116,46,112,97,116,104,96,96,46,10,32,32,32,32,32, + 32,32,32,114,72,0,0,0,41,1,218,18,77,101,116,97, + 100,97,116,97,80,97,116,104,70,105,110,100,101,114,41,3, + 90,18,105,109,112,111,114,116,108,105,98,46,109,101,116,97, + 100,97,116,97,114,59,1,0,0,218,18,102,105,110,100,95, + 100,105,115,116,114,105,98,117,116,105,111,110,115,41,4,114, + 193,0,0,0,114,119,0,0,0,114,120,0,0,0,114,59, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,60,1,0,0,98,5,0,0,115,4,0,0,0, + 0,10,12,1,122,29,80,97,116,104,70,105,110,100,101,114, + 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, + 111,110,115,41,1,78,41,2,78,78,41,1,78,41,13,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,207,0,0,0,114,46,1,0,0,114,52,1, + 0,0,114,54,1,0,0,114,55,1,0,0,114,58,1,0, + 0,114,203,0,0,0,114,206,0,0,0,114,60,1,0,0, 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,61,1,0,0,111,5,0,0,115,22,0, - 0,0,8,2,4,7,8,14,8,4,4,2,8,12,8,5, - 10,48,8,31,2,1,10,17,114,61,1,0,0,99,4,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, - 0,0,67,0,0,0,115,144,0,0,0,124,0,160,0,100, - 1,161,1,125,4,124,0,160,0,100,2,161,1,125,5,124, - 4,115,66,124,5,114,36,124,5,106,1,125,4,110,30,124, - 2,124,3,107,2,114,56,116,2,124,1,124,2,131,2,125, - 4,110,10,116,3,124,1,124,2,131,2,125,4,124,5,115, - 84,116,4,124,1,124,2,124,4,100,3,141,3,125,5,122, - 36,124,5,124,0,100,2,60,0,124,4,124,0,100,1,60, - 0,124,2,124,0,100,4,60,0,124,3,124,0,100,5,60, - 0,87,0,110,18,4,0,116,5,121,138,1,0,1,0,1, - 0,89,0,110,2,48,0,100,0,83,0,41,6,78,218,10, - 95,95,108,111,97,100,101,114,95,95,218,8,95,95,115,112, - 101,99,95,95,114,62,1,0,0,90,8,95,95,102,105,108, - 101,95,95,90,10,95,95,99,97,99,104,101,100,95,95,41, - 6,218,3,103,101,116,114,140,0,0,0,114,15,1,0,0, - 114,9,1,0,0,114,190,0,0,0,218,9,69,120,99,101, - 112,116,105,111,110,41,6,90,2,110,115,114,116,0,0,0, - 90,8,112,97,116,104,110,97,109,101,90,9,99,112,97,116, - 104,110,97,109,101,114,140,0,0,0,114,187,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,14, - 95,102,105,120,95,117,112,95,109,111,100,117,108,101,4,6, - 0,0,115,34,0,0,0,0,2,10,1,10,1,4,1,4, - 1,8,1,8,1,12,2,10,1,4,1,14,1,2,1,8, - 1,8,1,8,1,12,1,12,2,114,81,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,67,0,0,0,115,38,0,0,0,116,0,116,1, - 160,2,161,0,102,2,125,0,116,3,116,4,102,2,125,1, - 116,5,116,6,102,2,125,2,124,0,124,1,124,2,103,3, - 83,0,41,1,122,95,82,101,116,117,114,110,115,32,97,32, - 108,105,115,116,32,111,102,32,102,105,108,101,45,98,97,115, - 101,100,32,109,111,100,117,108,101,32,108,111,97,100,101,114, - 115,46,10,10,32,32,32,32,69,97,99,104,32,105,116,101, - 109,32,105,115,32,97,32,116,117,112,108,101,32,40,108,111, - 97,100,101,114,44,32,115,117,102,102,105,120,101,115,41,46, - 10,32,32,32,32,41,7,114,252,0,0,0,114,163,0,0, - 0,218,18,101,120,116,101,110,115,105,111,110,95,115,117,102, - 102,105,120,101,115,114,9,1,0,0,114,101,0,0,0,114, - 15,1,0,0,114,88,0,0,0,41,3,90,10,101,120,116, - 101,110,115,105,111,110,115,90,6,115,111,117,114,99,101,90, - 8,98,121,116,101,99,111,100,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,184,0,0,0,27,6,0, - 0,115,8,0,0,0,0,5,12,1,8,1,8,1,114,184, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 12,0,0,0,9,0,0,0,67,0,0,0,115,176,1,0, - 0,124,0,97,0,116,0,106,1,97,1,116,0,106,2,97, - 2,116,1,106,3,116,4,25,0,125,1,100,1,68,0,93, - 48,125,2,124,2,116,1,106,3,118,1,114,56,116,0,160, - 5,124,2,161,1,125,3,110,10,116,1,106,3,124,2,25, - 0,125,3,116,6,124,1,124,2,124,3,131,3,1,0,113, - 30,100,2,100,3,103,1,102,2,100,4,100,5,100,3,103, - 2,102,2,102,2,125,4,124,4,68,0,93,108,92,2,125, - 5,125,6,116,7,100,6,100,7,132,0,124,6,68,0,131, - 1,131,1,115,136,74,0,130,1,124,6,100,8,25,0,125, - 7,124,5,116,1,106,3,118,0,114,170,116,1,106,3,124, - 5,25,0,125,8,1,0,113,224,113,106,122,20,116,0,160, - 5,124,5,161,1,125,8,87,0,1,0,113,224,87,0,113, - 106,4,0,116,8,121,212,1,0,1,0,1,0,89,0,113, - 106,89,0,113,106,48,0,113,106,116,8,100,9,131,1,130, - 1,116,6,124,1,100,10,124,8,131,3,1,0,116,6,124, - 1,100,11,124,7,131,3,1,0,116,6,124,1,100,12,100, - 13,160,9,124,6,161,1,131,3,1,0,116,6,124,1,100, - 14,100,15,100,16,132,0,124,6,68,0,131,1,131,3,1, - 0,116,0,160,5,100,17,161,1,125,9,116,6,124,1,100, - 17,124,9,131,3,1,0,116,0,160,5,100,18,161,1,125, - 10,116,6,124,1,100,18,124,10,131,3,1,0,124,5,100, - 4,107,2,144,1,114,108,116,0,160,5,100,19,161,1,125, - 11,116,6,124,1,100,20,124,11,131,3,1,0,116,6,124, - 1,100,21,116,10,131,0,131,3,1,0,116,11,160,12,116, - 2,160,13,161,0,161,1,1,0,124,5,100,4,107,2,144, - 1,114,172,116,14,160,15,100,22,161,1,1,0,100,23,116, - 11,118,0,144,1,114,172,100,24,116,16,95,17,100,25,83, - 0,41,26,122,205,83,101,116,117,112,32,116,104,101,32,112, - 97,116,104,45,98,97,115,101,100,32,105,109,112,111,114,116, - 101,114,115,32,102,111,114,32,105,109,112,111,114,116,108,105, - 98,32,98,121,32,105,109,112,111,114,116,105,110,103,32,110, - 101,101,100,101,100,10,32,32,32,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,97,110,100,32,105, - 110,106,101,99,116,105,110,103,32,116,104,101,109,32,105,110, - 116,111,32,116,104,101,32,103,108,111,98,97,108,32,110,97, - 109,101,115,112,97,99,101,46,10,10,32,32,32,32,79,116, - 104,101,114,32,99,111,109,112,111,110,101,110,116,115,32,97, - 114,101,32,101,120,116,114,97,99,116,101,100,32,102,114,111, - 109,32,116,104,101,32,99,111,114,101,32,98,111,111,116,115, - 116,114,97,112,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,41,4,114,63,0,0,0,114,74,0,0,0,218,8, - 98,117,105,108,116,105,110,115,114,160,0,0,0,90,5,112, - 111,115,105,120,250,1,47,90,2,110,116,250,1,92,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,115,0,0,0,115,26,0,0,0,124,0,93,18, - 125,1,116,0,124,1,131,1,100,0,107,2,86,0,1,0, - 113,2,100,1,83,0,41,2,114,38,0,0,0,78,41,1, - 114,22,0,0,0,41,2,114,31,0,0,0,114,94,0,0, + 6,0,0,0,114,45,1,0,0,221,4,0,0,115,34,0, + 0,0,8,2,4,2,2,1,10,9,2,1,10,12,2,1, + 10,21,2,1,10,14,2,1,12,31,2,1,12,23,2,1, + 12,12,2,1,114,45,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,90,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,101,6,90,7,100,6,100,7,132,0,90,8,100, + 8,100,9,132,0,90,9,100,19,100,11,100,12,132,1,90, + 10,100,13,100,14,132,0,90,11,101,12,100,15,100,16,132, + 0,131,1,90,13,100,17,100,18,132,0,90,14,100,10,83, + 0,41,20,218,10,70,105,108,101,70,105,110,100,101,114,122, + 172,70,105,108,101,45,98,97,115,101,100,32,102,105,110,100, + 101,114,46,10,10,32,32,32,32,73,110,116,101,114,97,99, + 116,105,111,110,115,32,119,105,116,104,32,116,104,101,32,102, + 105,108,101,32,115,121,115,116,101,109,32,97,114,101,32,99, + 97,99,104,101,100,32,102,111,114,32,112,101,114,102,111,114, + 109,97,110,99,101,44,32,98,101,105,110,103,10,32,32,32, + 32,114,101,102,114,101,115,104,101,100,32,119,104,101,110,32, + 116,104,101,32,100,105,114,101,99,116,111,114,121,32,116,104, + 101,32,102,105,110,100,101,114,32,105,115,32,104,97,110,100, + 108,105,110,103,32,104,97,115,32,98,101,101,110,32,109,111, + 100,105,102,105,101,100,46,10,10,32,32,32,32,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0, + 0,0,7,0,0,0,115,84,0,0,0,103,0,125,3,124, + 2,68,0,93,32,92,2,137,0,125,4,124,3,160,0,135, + 0,102,1,100,1,100,2,132,8,124,4,68,0,131,1,161, + 1,1,0,113,8,124,3,124,0,95,1,124,1,112,54,100, + 3,124,0,95,2,100,4,124,0,95,3,116,4,131,0,124, + 0,95,5,116,4,131,0,124,0,95,6,100,5,83,0,41, + 6,122,154,73,110,105,116,105,97,108,105,122,101,32,119,105, + 116,104,32,116,104,101,32,112,97,116,104,32,116,111,32,115, + 101,97,114,99,104,32,111,110,32,97,110,100,32,97,32,118, + 97,114,105,97,98,108,101,32,110,117,109,98,101,114,32,111, + 102,10,32,32,32,32,32,32,32,32,50,45,116,117,112,108, + 101,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104, + 101,32,108,111,97,100,101,114,32,97,110,100,32,116,104,101, + 32,102,105,108,101,32,115,117,102,102,105,120,101,115,32,116, + 104,101,32,108,111,97,100,101,114,10,32,32,32,32,32,32, + 32,32,114,101,99,111,103,110,105,122,101,115,46,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,51,0,0,0,115,22,0,0,0,124,0,93,14,125, + 1,124,1,136,0,102,2,86,0,1,0,113,2,100,0,83, + 0,114,109,0,0,0,114,3,0,0,0,114,16,1,0,0, + 169,1,114,140,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,19,1,0,0,127,5,0,0,115,4,0,0,0,4, + 0,2,0,122,38,70,105,108,101,70,105,110,100,101,114,46, + 95,95,105,110,105,116,95,95,46,60,108,111,99,97,108,115, + 62,46,60,103,101,110,101,120,112,114,62,114,70,0,0,0, + 114,104,0,0,0,78,41,7,114,167,0,0,0,218,8,95, + 108,111,97,100,101,114,115,114,43,0,0,0,218,11,95,112, + 97,116,104,95,109,116,105,109,101,218,3,115,101,116,218,11, + 95,112,97,116,104,95,99,97,99,104,101,218,19,95,114,101, + 108,97,120,101,100,95,112,97,116,104,95,99,97,99,104,101, + 41,5,114,118,0,0,0,114,43,0,0,0,218,14,108,111, + 97,100,101,114,95,100,101,116,97,105,108,115,90,7,108,111, + 97,100,101,114,115,114,189,0,0,0,114,3,0,0,0,114, + 62,1,0,0,114,6,0,0,0,114,209,0,0,0,121,5, + 0,0,115,16,0,0,0,0,4,4,1,12,1,26,1,6, + 2,10,1,6,1,8,1,122,19,70,105,108,101,70,105,110, + 100,101,114,46,95,95,105,110,105,116,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0, + 0,67,0,0,0,115,10,0,0,0,100,1,124,0,95,0, + 100,2,83,0,41,3,122,31,73,110,118,97,108,105,100,97, + 116,101,32,116,104,101,32,100,105,114,101,99,116,111,114,121, + 32,109,116,105,109,101,46,114,104,0,0,0,78,41,1,114, + 64,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,46,1,0,0,135,5,0, + 0,115,2,0,0,0,0,2,122,28,70,105,108,101,70,105, + 110,100,101,114,46,105,110,118,97,108,105,100,97,116,101,95, + 99,97,99,104,101,115,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, + 42,0,0,0,124,0,160,0,124,1,161,1,125,2,124,2, + 100,1,117,0,114,26,100,1,103,0,102,2,83,0,124,2, + 106,1,124,2,106,2,112,38,103,0,102,2,83,0,41,2, + 122,197,84,114,121,32,116,111,32,102,105,110,100,32,97,32, + 108,111,97,100,101,114,32,102,111,114,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,44, + 32,111,114,32,116,104,101,32,110,97,109,101,115,112,97,99, + 101,10,32,32,32,32,32,32,32,32,112,97,99,107,97,103, + 101,32,112,111,114,116,105,111,110,115,46,32,82,101,116,117, + 114,110,115,32,40,108,111,97,100,101,114,44,32,108,105,115, + 116,45,111,102,45,112,111,114,116,105,111,110,115,41,46,10, + 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, + 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,78,41,3,114,203,0,0,0,114, + 140,0,0,0,114,178,0,0,0,41,3,114,118,0,0,0, + 114,139,0,0,0,114,187,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,137,0,0,0,141,5, + 0,0,115,8,0,0,0,0,7,10,1,8,1,8,1,122, + 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, + 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, + 0,0,0,0,7,0,0,0,6,0,0,0,67,0,0,0, + 115,26,0,0,0,124,1,124,2,124,3,131,2,125,6,116, + 0,124,2,124,3,124,6,124,4,100,1,141,4,83,0,41, + 2,78,114,177,0,0,0,41,1,114,190,0,0,0,41,7, + 114,118,0,0,0,114,188,0,0,0,114,139,0,0,0,114, + 43,0,0,0,90,4,115,109,115,108,114,202,0,0,0,114, + 140,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,58,1,0,0,153,5,0,0,115,8,0,0, + 0,0,1,10,1,8,1,2,255,122,20,70,105,108,101,70, + 105,110,100,101,114,46,95,103,101,116,95,115,112,101,99,78, + 99,3,0,0,0,0,0,0,0,0,0,0,0,14,0,0, + 0,8,0,0,0,67,0,0,0,115,96,1,0,0,100,1, + 125,3,124,1,160,0,100,2,161,1,100,3,25,0,125,4, + 122,24,116,1,124,0,106,2,112,34,116,3,160,4,161,0, + 131,1,106,5,125,5,87,0,110,22,4,0,116,6,121,64, + 1,0,1,0,1,0,100,4,125,5,89,0,110,2,48,0, + 124,5,124,0,106,7,107,3,114,90,124,0,160,8,161,0, + 1,0,124,5,124,0,95,7,116,9,131,0,114,112,124,0, + 106,10,125,6,124,4,160,11,161,0,125,7,110,10,124,0, + 106,12,125,6,124,4,125,7,124,7,124,6,118,0,114,216, + 116,13,124,0,106,2,124,4,131,2,125,8,124,0,106,14, + 68,0,93,58,92,2,125,9,125,10,100,5,124,9,23,0, + 125,11,116,13,124,8,124,11,131,2,125,12,116,15,124,12, + 131,1,114,148,124,0,160,16,124,10,124,1,124,12,124,8, + 103,1,124,2,161,5,2,0,1,0,83,0,113,148,116,17, + 124,8,131,1,125,3,124,0,106,14,68,0,93,82,92,2, + 125,9,125,10,116,13,124,0,106,2,124,4,124,9,23,0, + 131,2,125,12,116,18,106,19,100,6,124,12,100,3,100,7, + 141,3,1,0,124,7,124,9,23,0,124,6,118,0,114,222, + 116,15,124,12,131,1,114,222,124,0,160,16,124,10,124,1, + 124,12,100,8,124,2,161,5,2,0,1,0,83,0,113,222, + 124,3,144,1,114,92,116,18,160,19,100,9,124,8,161,2, + 1,0,116,18,160,20,124,1,100,8,161,2,125,13,124,8, + 103,1,124,13,95,21,124,13,83,0,100,8,83,0,41,10, + 122,111,84,114,121,32,116,111,32,102,105,110,100,32,97,32, + 115,112,101,99,32,102,111,114,32,116,104,101,32,115,112,101, + 99,105,102,105,101,100,32,109,111,100,117,108,101,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,115,32, + 116,104,101,32,109,97,116,99,104,105,110,103,32,115,112,101, + 99,44,32,111,114,32,78,111,110,101,32,105,102,32,110,111, + 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,70,114,70,0,0,0,114,27,0,0,0,114,104,0,0, + 0,114,209,0,0,0,122,9,116,114,121,105,110,103,32,123, + 125,41,1,90,9,118,101,114,98,111,115,105,116,121,78,122, + 25,112,111,115,115,105,98,108,101,32,110,97,109,101,115,112, + 97,99,101,32,102,111,114,32,123,125,41,22,114,40,0,0, + 0,114,48,0,0,0,114,43,0,0,0,114,2,0,0,0, + 114,54,0,0,0,114,10,1,0,0,114,49,0,0,0,114, + 64,1,0,0,218,11,95,102,105,108,108,95,99,97,99,104, + 101,114,7,0,0,0,114,67,1,0,0,114,105,0,0,0, + 114,66,1,0,0,114,37,0,0,0,114,63,1,0,0,114, + 53,0,0,0,114,58,1,0,0,114,55,0,0,0,114,134, + 0,0,0,114,149,0,0,0,114,183,0,0,0,114,178,0, + 0,0,41,14,114,118,0,0,0,114,139,0,0,0,114,202, + 0,0,0,90,12,105,115,95,110,97,109,101,115,112,97,99, + 101,90,11,116,97,105,108,95,109,111,100,117,108,101,114,169, + 0,0,0,90,5,99,97,99,104,101,90,12,99,97,99,104, + 101,95,109,111,100,117,108,101,90,9,98,97,115,101,95,112, + 97,116,104,114,17,1,0,0,114,188,0,0,0,90,13,105, + 110,105,116,95,102,105,108,101,110,97,109,101,90,9,102,117, + 108,108,95,112,97,116,104,114,187,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,203,0,0,0, + 158,5,0,0,115,74,0,0,0,0,5,4,1,14,1,2, + 1,24,1,12,1,10,1,10,1,8,1,6,2,6,1,6, + 1,10,2,6,1,4,2,8,1,12,1,14,1,8,1,10, + 1,8,1,26,4,8,2,14,1,16,1,16,1,12,1,8, + 1,10,1,2,0,2,255,10,2,6,1,12,1,12,1,8, + 1,4,1,122,20,70,105,108,101,70,105,110,100,101,114,46, + 102,105,110,100,95,115,112,101,99,99,1,0,0,0,0,0, + 0,0,0,0,0,0,9,0,0,0,10,0,0,0,67,0, + 0,0,115,188,0,0,0,124,0,106,0,125,1,122,22,116, + 1,160,2,124,1,112,22,116,1,160,3,161,0,161,1,125, + 2,87,0,110,28,4,0,116,4,116,5,116,6,102,3,121, + 56,1,0,1,0,1,0,103,0,125,2,89,0,110,2,48, + 0,116,7,106,8,160,9,100,1,161,1,115,82,116,10,124, + 2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124, + 2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92, + 3,125,5,125,6,125,7,124,6,114,134,100,3,160,13,124, + 5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125, + 8,124,3,160,15,124,8,161,1,1,0,113,92,124,3,124, + 0,95,11,116,7,106,8,160,9,116,16,161,1,114,184,100, + 4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100, + 6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32, + 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105, + 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112, + 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115, + 32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,0, + 114,70,0,0,0,114,60,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83, + 0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1, + 124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,0, + 0,41,1,114,105,0,0,0,41,2,114,31,0,0,0,90, + 2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,9,60,115,101,116,99,111,109,112,62,235,5,0, + 0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,101, + 70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99, + 104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,116, + 99,111,109,112,62,78,41,18,114,43,0,0,0,114,2,0, + 0,0,114,7,1,0,0,114,54,0,0,0,114,3,1,0, + 0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,114, + 111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,114, + 121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,65,1,0,0,114,66,1,0,0,114, + 100,0,0,0,114,61,0,0,0,114,105,0,0,0,218,3, + 97,100,100,114,11,0,0,0,114,67,1,0,0,41,9,114, + 118,0,0,0,114,43,0,0,0,114,8,1,0,0,90,21, + 108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110, + 116,101,110,116,115,114,41,1,0,0,114,116,0,0,0,114, + 29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110, + 97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,69,1,0,0,206,5,0,0,115,34,0,0,0, + 0,2,6,1,2,1,22,1,18,3,10,3,12,1,12,7, + 6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,1, + 12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,95, + 102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,7, + 0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,1, + 100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,0, + 0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,32, + 119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,32, + 99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,111, + 110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,10, + 32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,105, + 108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,115, + 116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,114, + 115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,32, + 32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,110, + 32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, + 116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,101, + 32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,32, + 97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,112, + 111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,32, + 32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,32, + 32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,36, + 0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,124, + 0,100,2,141,2,130,1,136,0,124,0,103,1,136,1,162, + 1,82,0,142,0,83,0,41,3,122,45,80,97,116,104,32, + 104,111,111,107,32,102,111,114,32,105,109,112,111,114,116,108, + 105,98,46,109,97,99,104,105,110,101,114,121,46,70,105,108, + 101,70,105,110,100,101,114,46,122,30,111,110,108,121,32,100, + 105,114,101,99,116,111,114,105,101,115,32,97,114,101,32,115, + 117,112,112,111,114,116,101,100,114,47,0,0,0,41,2,114, + 55,0,0,0,114,117,0,0,0,114,47,0,0,0,169,2, + 114,193,0,0,0,114,68,1,0,0,114,3,0,0,0,114, + 6,0,0,0,218,24,112,97,116,104,95,104,111,111,107,95, + 102,111,114,95,70,105,108,101,70,105,110,100,101,114,247,5, + 0,0,115,6,0,0,0,0,2,8,1,12,1,122,54,70, + 105,108,101,70,105,110,100,101,114,46,112,97,116,104,95,104, + 111,111,107,46,60,108,111,99,97,108,115,62,46,112,97,116, + 104,95,104,111,111,107,95,102,111,114,95,70,105,108,101,70, + 105,110,100,101,114,114,3,0,0,0,41,3,114,193,0,0, + 0,114,68,1,0,0,114,75,1,0,0,114,3,0,0,0, + 114,74,1,0,0,114,6,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,237,5,0,0,115,4,0,0,0,0,10, + 14,6,122,20,70,105,108,101,70,105,110,100,101,114,46,112, + 97,116,104,95,104,111,111,107,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,100,1,160,0,124,0,106,1,161,1, + 83,0,41,2,78,122,16,70,105,108,101,70,105,110,100,101, + 114,40,123,33,114,125,41,41,2,114,61,0,0,0,114,43, + 0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,39,1,0,0,255,5,0,0, + 115,2,0,0,0,0,1,122,19,70,105,108,101,70,105,110, + 100,101,114,46,95,95,114,101,112,114,95,95,41,1,78,41, + 15,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,209,0,0,0,114,46,1,0,0,114, + 143,0,0,0,114,206,0,0,0,114,137,0,0,0,114,58, + 1,0,0,114,203,0,0,0,114,69,1,0,0,114,207,0, + 0,0,114,76,1,0,0,114,39,1,0,0,114,3,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,19,1,0,0,63,6,0,0,115,4,0,0,0,4,0, + 114,61,1,0,0,112,5,0,0,115,22,0,0,0,8,2, + 4,7,8,14,8,4,4,2,8,12,8,5,10,48,8,31, + 2,1,10,17,114,61,1,0,0,99,4,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,8,0,0,0,67,0, + 0,0,115,144,0,0,0,124,0,160,0,100,1,161,1,125, + 4,124,0,160,0,100,2,161,1,125,5,124,4,115,66,124, + 5,114,36,124,5,106,1,125,4,110,30,124,2,124,3,107, + 2,114,56,116,2,124,1,124,2,131,2,125,4,110,10,116, + 3,124,1,124,2,131,2,125,4,124,5,115,84,116,4,124, + 1,124,2,124,4,100,3,141,3,125,5,122,36,124,5,124, + 0,100,2,60,0,124,4,124,0,100,1,60,0,124,2,124, + 0,100,4,60,0,124,3,124,0,100,5,60,0,87,0,110, + 18,4,0,116,5,121,138,1,0,1,0,1,0,89,0,110, + 2,48,0,100,0,83,0,41,6,78,218,10,95,95,108,111, + 97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95, + 114,62,1,0,0,90,8,95,95,102,105,108,101,95,95,90, + 10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103, + 101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0, + 0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111, + 110,41,6,90,2,110,115,114,116,0,0,0,90,8,112,97, + 116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109, + 101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,5,6,0,0,115,34, + 0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8, + 1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8, + 1,12,1,12,2,114,81,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0, + 102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6, + 102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1, + 122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116, + 32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109, + 111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10, + 32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115, + 32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114, + 44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32, + 32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101, + 120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101, + 115,114,9,1,0,0,114,101,0,0,0,114,15,1,0,0, + 114,88,0,0,0,41,3,90,10,101,120,116,101,110,115,105, + 111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116, + 101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,184,0,0,0,28,6,0,0,115,8,0, + 0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0, + 9,0,0,0,67,0,0,0,115,176,1,0,0,124,0,97, + 0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106, + 3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124, + 2,116,1,106,3,118,1,114,56,116,0,160,5,124,2,161, + 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, + 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, + 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, + 2,125,4,124,4,68,0,93,108,92,2,125,5,125,6,116, + 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, + 136,74,0,130,1,124,6,100,8,25,0,125,7,124,5,116, + 1,106,3,118,0,114,170,116,1,106,3,124,5,25,0,125, + 8,1,0,113,224,113,106,122,20,116,0,160,5,124,5,161, + 1,125,8,87,0,1,0,113,224,87,0,113,106,4,0,116, + 8,121,212,1,0,1,0,1,0,89,0,113,106,89,0,113, + 106,48,0,113,106,116,8,100,9,131,1,130,1,116,6,124, + 1,100,10,124,8,131,3,1,0,116,6,124,1,100,11,124, + 7,131,3,1,0,116,6,124,1,100,12,100,13,160,9,124, + 6,161,1,131,3,1,0,116,6,124,1,100,14,100,15,100, + 16,132,0,124,6,68,0,131,1,131,3,1,0,116,0,160, + 5,100,17,161,1,125,9,116,6,124,1,100,17,124,9,131, + 3,1,0,116,0,160,5,100,18,161,1,125,10,116,6,124, + 1,100,18,124,10,131,3,1,0,124,5,100,4,107,2,144, + 1,114,108,116,0,160,5,100,19,161,1,125,11,116,6,124, + 1,100,20,124,11,131,3,1,0,116,6,124,1,100,21,116, + 10,131,0,131,3,1,0,116,11,160,12,116,2,160,13,161, + 0,161,1,1,0,124,5,100,4,107,2,144,1,114,172,116, + 14,160,15,100,22,161,1,1,0,100,23,116,11,118,0,144, + 1,114,172,100,24,116,16,95,17,100,25,83,0,41,26,122, + 205,83,101,116,117,112,32,116,104,101,32,112,97,116,104,45, + 98,97,115,101,100,32,105,109,112,111,114,116,101,114,115,32, + 102,111,114,32,105,109,112,111,114,116,108,105,98,32,98,121, + 32,105,109,112,111,114,116,105,110,103,32,110,101,101,100,101, + 100,10,32,32,32,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,32,97,110,100,32,105,110,106,101,99, + 116,105,110,103,32,116,104,101,109,32,105,110,116,111,32,116, + 104,101,32,103,108,111,98,97,108,32,110,97,109,101,115,112, + 97,99,101,46,10,10,32,32,32,32,79,116,104,101,114,32, + 99,111,109,112,111,110,101,110,116,115,32,97,114,101,32,101, + 120,116,114,97,99,116,101,100,32,102,114,111,109,32,116,104, + 101,32,99,111,114,101,32,98,111,111,116,115,116,114,97,112, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,41,4, + 114,63,0,0,0,114,74,0,0,0,218,8,98,117,105,108, + 116,105,110,115,114,160,0,0,0,90,5,112,111,115,105,120, + 250,1,47,90,2,110,116,250,1,92,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,115, + 0,0,0,115,26,0,0,0,124,0,93,18,125,1,116,0, + 124,1,131,1,100,0,107,2,86,0,1,0,113,2,100,1, + 83,0,41,2,114,38,0,0,0,78,41,1,114,22,0,0, + 0,41,2,114,31,0,0,0,114,94,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,19,1,0, + 0,64,6,0,0,115,4,0,0,0,4,0,2,0,122,25, + 95,115,101,116,117,112,46,60,108,111,99,97,108,115,62,46, + 60,103,101,110,101,120,112,114,62,114,72,0,0,0,122,30, + 105,109,112,111,114,116,108,105,98,32,114,101,113,117,105,114, + 101,115,32,112,111,115,105,120,32,111,114,32,110,116,114,2, + 0,0,0,114,34,0,0,0,114,30,0,0,0,114,39,0, + 0,0,114,57,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,4,0,0,0,83,0,0,0, + 115,22,0,0,0,104,0,124,0,93,14,125,1,100,0,124, + 1,155,0,157,2,146,2,113,4,83,0,41,1,114,73,0, + 0,0,114,3,0,0,0,41,2,114,31,0,0,0,218,1, + 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,70,1,0,0,80,6,0,0,115,4,0,0,0,6,0, 2,0,122,25,95,115,101,116,117,112,46,60,108,111,99,97, - 108,115,62,46,60,103,101,110,101,120,112,114,62,114,72,0, - 0,0,122,30,105,109,112,111,114,116,108,105,98,32,114,101, - 113,117,105,114,101,115,32,112,111,115,105,120,32,111,114,32, - 110,116,114,2,0,0,0,114,34,0,0,0,114,30,0,0, - 0,114,39,0,0,0,114,57,0,0,0,99,1,0,0,0, + 108,115,62,46,60,115,101,116,99,111,109,112,62,90,7,95, + 116,104,114,101,97,100,90,8,95,119,101,97,107,114,101,102, + 90,6,119,105,110,114,101,103,114,192,0,0,0,114,7,0, + 0,0,122,4,46,112,121,119,122,6,95,100,46,112,121,100, + 84,78,41,18,114,134,0,0,0,114,8,0,0,0,114,163, + 0,0,0,114,31,1,0,0,114,125,0,0,0,90,18,95, + 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, + 101,114,129,0,0,0,218,3,97,108,108,114,117,0,0,0, + 114,35,0,0,0,114,13,0,0,0,114,21,1,0,0,114, + 167,0,0,0,114,82,1,0,0,114,101,0,0,0,114,186, + 0,0,0,114,191,0,0,0,114,195,0,0,0,41,12,218, + 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, + 108,101,90,11,115,101,108,102,95,109,111,100,117,108,101,90, + 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, + 117,105,108,116,105,110,95,109,111,100,117,108,101,90,10,111, + 115,95,100,101,116,97,105,108,115,90,10,98,117,105,108,116, + 105,110,95,111,115,114,30,0,0,0,114,34,0,0,0,90, + 9,111,115,95,109,111,100,117,108,101,90,13,116,104,114,101, + 97,100,95,109,111,100,117,108,101,90,14,119,101,97,107,114, + 101,102,95,109,111,100,117,108,101,90,13,119,105,110,114,101, + 103,95,109,111,100,117,108,101,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,39, + 6,0,0,115,78,0,0,0,0,8,4,1,6,1,6,3, + 10,1,8,1,10,1,12,2,10,1,14,3,22,1,12,2, + 22,1,8,1,10,1,10,1,6,2,2,1,10,1,10,1, + 12,1,12,2,8,1,12,1,12,1,18,1,22,3,10,1, + 12,3,10,1,12,3,10,1,10,1,12,3,14,1,14,1, + 10,1,10,1,10,1,114,89,1,0,0,99,1,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 83,0,0,0,115,22,0,0,0,104,0,124,0,93,14,125, - 1,100,0,124,1,155,0,157,2,146,2,113,4,83,0,41, - 1,114,73,0,0,0,114,3,0,0,0,41,2,114,31,0, - 0,0,218,1,115,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,70,1,0,0,79,6,0,0,115,4,0, - 0,0,6,0,2,0,122,25,95,115,101,116,117,112,46,60, - 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, - 62,90,7,95,116,104,114,101,97,100,90,8,95,119,101,97, - 107,114,101,102,90,6,119,105,110,114,101,103,114,192,0,0, - 0,114,7,0,0,0,122,4,46,112,121,119,122,6,95,100, - 46,112,121,100,84,78,41,18,114,134,0,0,0,114,8,0, - 0,0,114,163,0,0,0,114,31,1,0,0,114,125,0,0, - 0,90,18,95,98,117,105,108,116,105,110,95,102,114,111,109, - 95,110,97,109,101,114,129,0,0,0,218,3,97,108,108,114, - 117,0,0,0,114,35,0,0,0,114,13,0,0,0,114,21, - 1,0,0,114,167,0,0,0,114,82,1,0,0,114,101,0, - 0,0,114,186,0,0,0,114,191,0,0,0,114,195,0,0, - 0,41,12,218,17,95,98,111,111,116,115,116,114,97,112,95, - 109,111,100,117,108,101,90,11,115,101,108,102,95,109,111,100, - 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, - 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, - 101,90,10,111,115,95,100,101,116,97,105,108,115,90,10,98, - 117,105,108,116,105,110,95,111,115,114,30,0,0,0,114,34, - 0,0,0,90,9,111,115,95,109,111,100,117,108,101,90,13, - 116,104,114,101,97,100,95,109,111,100,117,108,101,90,14,119, - 101,97,107,114,101,102,95,109,111,100,117,108,101,90,13,119, - 105,110,114,101,103,95,109,111,100,117,108,101,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,6,95,115,101, - 116,117,112,38,6,0,0,115,78,0,0,0,0,8,4,1, - 6,1,6,3,10,1,8,1,10,1,12,2,10,1,14,3, - 22,1,12,2,22,1,8,1,10,1,10,1,6,2,2,1, - 10,1,10,1,12,1,12,2,8,1,12,1,12,1,18,1, - 22,3,10,1,12,3,10,1,12,3,10,1,10,1,12,3, - 14,1,14,1,10,1,10,1,10,1,114,89,1,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,50,0,0,0,116,0,124, - 0,131,1,1,0,116,1,131,0,125,1,116,2,106,3,160, - 4,116,5,106,6,124,1,142,0,103,1,161,1,1,0,116, - 2,106,7,160,8,116,9,161,1,1,0,100,1,83,0,41, - 2,122,41,73,110,115,116,97,108,108,32,116,104,101,32,112, - 97,116,104,45,98,97,115,101,100,32,105,109,112,111,114,116, - 32,99,111,109,112,111,110,101,110,116,115,46,78,41,10,114, - 89,1,0,0,114,184,0,0,0,114,8,0,0,0,114,51, - 1,0,0,114,167,0,0,0,114,61,1,0,0,114,76,1, - 0,0,218,9,109,101,116,97,95,112,97,116,104,114,186,0, - 0,0,114,45,1,0,0,41,2,114,88,1,0,0,90,17, - 115,117,112,112,111,114,116,101,100,95,108,111,97,100,101,114, - 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,8,95,105,110,115,116,97,108,108,103,6,0,0,115,8, - 0,0,0,0,2,8,1,6,1,20,1,114,91,1,0,0, - 41,1,114,59,0,0,0,41,1,78,41,3,78,78,78,41, - 2,114,72,0,0,0,114,72,0,0,0,41,1,84,41,1, - 78,41,1,78,41,63,114,127,0,0,0,114,12,0,0,0, - 90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,84, - 73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,89, - 84,69,83,95,75,69,89,114,11,0,0,0,114,13,0,0, - 0,114,20,0,0,0,114,26,0,0,0,114,28,0,0,0, - 114,37,0,0,0,114,46,0,0,0,114,48,0,0,0,114, - 52,0,0,0,114,53,0,0,0,114,55,0,0,0,114,58, - 0,0,0,114,68,0,0,0,218,4,116,121,112,101,218,8, - 95,95,99,111,100,101,95,95,114,162,0,0,0,114,18,0, - 0,0,114,148,0,0,0,114,17,0,0,0,114,23,0,0, - 0,114,236,0,0,0,114,91,0,0,0,114,87,0,0,0, - 114,101,0,0,0,114,88,0,0,0,90,23,68,69,66,85, - 71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73, - 88,69,83,90,27,79,80,84,73,77,73,90,69,68,95,66, - 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, - 114,97,0,0,0,114,102,0,0,0,114,108,0,0,0,114, - 112,0,0,0,114,114,0,0,0,114,136,0,0,0,114,143, - 0,0,0,114,152,0,0,0,114,156,0,0,0,114,158,0, - 0,0,114,165,0,0,0,114,170,0,0,0,114,171,0,0, - 0,114,176,0,0,0,218,6,111,98,106,101,99,116,114,185, - 0,0,0,114,190,0,0,0,114,191,0,0,0,114,208,0, - 0,0,114,221,0,0,0,114,239,0,0,0,114,9,1,0, - 0,114,15,1,0,0,114,21,1,0,0,114,252,0,0,0, - 114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114, - 61,1,0,0,114,81,1,0,0,114,184,0,0,0,114,89, - 1,0,0,114,91,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,8,60,109, - 111,100,117,108,101,62,1,0,0,0,115,126,0,0,0,4, - 22,4,1,4,1,2,1,2,255,4,4,8,17,8,5,8, - 5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,8, - 9,10,22,10,127,0,19,16,1,12,2,4,1,4,2,6, - 2,6,2,8,2,16,71,8,40,8,19,8,12,8,12,8, - 28,8,17,8,33,8,28,8,24,10,13,10,10,10,11,8, - 14,6,3,4,1,2,255,12,68,14,64,14,29,16,127,0, - 17,14,72,18,45,18,26,4,3,18,53,14,63,14,42,14, - 127,0,20,14,127,0,22,10,23,8,11,8,65, + 67,0,0,0,115,50,0,0,0,116,0,124,0,131,1,1, + 0,116,1,131,0,125,1,116,2,106,3,160,4,116,5,106, + 6,124,1,142,0,103,1,161,1,1,0,116,2,106,7,160, + 8,116,9,161,1,1,0,100,1,83,0,41,2,122,41,73, + 110,115,116,97,108,108,32,116,104,101,32,112,97,116,104,45, + 98,97,115,101,100,32,105,109,112,111,114,116,32,99,111,109, + 112,111,110,101,110,116,115,46,78,41,10,114,89,1,0,0, + 114,184,0,0,0,114,8,0,0,0,114,51,1,0,0,114, + 167,0,0,0,114,61,1,0,0,114,76,1,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,186,0,0,0,114,45, + 1,0,0,41,2,114,88,1,0,0,90,17,115,117,112,112, + 111,114,116,101,100,95,108,111,97,100,101,114,115,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,105, + 110,115,116,97,108,108,104,6,0,0,115,8,0,0,0,0, + 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,59, + 0,0,0,41,1,78,41,3,78,78,78,41,2,114,72,0, + 0,0,114,72,0,0,0,41,1,84,41,1,78,41,1,78, + 41,63,114,127,0,0,0,114,12,0,0,0,90,37,95,67, + 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, + 80,76,65,84,70,79,82,77,83,95,66,89,84,69,83,95, + 75,69,89,114,11,0,0,0,114,13,0,0,0,114,20,0, + 0,0,114,26,0,0,0,114,28,0,0,0,114,37,0,0, + 0,114,46,0,0,0,114,48,0,0,0,114,52,0,0,0, + 114,53,0,0,0,114,55,0,0,0,114,58,0,0,0,114, + 68,0,0,0,218,4,116,121,112,101,218,8,95,95,99,111, + 100,101,95,95,114,162,0,0,0,114,18,0,0,0,114,148, + 0,0,0,114,17,0,0,0,114,23,0,0,0,114,236,0, + 0,0,114,91,0,0,0,114,87,0,0,0,114,101,0,0, + 0,114,88,0,0,0,90,23,68,69,66,85,71,95,66,89, + 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,90, + 27,79,80,84,73,77,73,90,69,68,95,66,89,84,69,67, + 79,68,69,95,83,85,70,70,73,88,69,83,114,97,0,0, + 0,114,102,0,0,0,114,108,0,0,0,114,112,0,0,0, + 114,114,0,0,0,114,136,0,0,0,114,143,0,0,0,114, + 152,0,0,0,114,156,0,0,0,114,158,0,0,0,114,165, + 0,0,0,114,170,0,0,0,114,171,0,0,0,114,176,0, + 0,0,218,6,111,98,106,101,99,116,114,185,0,0,0,114, + 190,0,0,0,114,191,0,0,0,114,208,0,0,0,114,221, + 0,0,0,114,239,0,0,0,114,9,1,0,0,114,15,1, + 0,0,114,21,1,0,0,114,252,0,0,0,114,22,1,0, + 0,114,43,1,0,0,114,45,1,0,0,114,61,1,0,0, + 114,81,1,0,0,114,184,0,0,0,114,89,1,0,0,114, + 91,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,126,0,0,0,4,22,4,1,4, + 1,2,1,2,255,4,4,8,17,8,5,8,5,8,6,8, + 6,8,12,8,10,8,9,8,5,8,7,8,9,10,22,10, + 127,0,20,16,1,12,2,4,1,4,2,6,2,6,2,8, + 2,16,71,8,40,8,19,8,12,8,12,8,28,8,17,8, + 33,8,28,8,24,10,13,10,10,10,11,8,14,6,3,4, + 1,2,255,12,68,14,64,14,29,16,127,0,17,14,72,18, + 45,18,26,4,3,18,53,14,63,14,42,14,127,0,20,14, + 127,0,22,10,23,8,11,8,65, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index d413bab0de43a..538fdbe3e0b5a 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -149,8 +149,8 @@ static void *opcode_targets[256] = { &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, &&_unknown_opcode, - &&TARGET_BUILD_MAP_UNPACK, - &&TARGET_BUILD_MAP_UNPACK_WITH_CALL, + &&_unknown_opcode, + &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, &&TARGET_SETUP_ASYNC_WITH, @@ -163,8 +163,8 @@ static void *opcode_targets[256] = { &&TARGET_CALL_METHOD, &&TARGET_LIST_EXTEND, &&TARGET_SET_UPDATE, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_DICT_MERGE, + &&TARGET_DICT_UPDATE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, From webhook-mailer at python.org Mon Jan 27 07:08:59 2020 From: webhook-mailer at python.org (Cheryl Sabella) Date: Mon, 27 Jan 2020 12:08:59 -0000 Subject: [Python-checkins] Fix so that test.test_distutils can be executed by unittest and not just regrtest (GH-13480) Message-ID: https://github.com/python/cpython/commit/997443c14cc29e5616b9f3d7c337e89fda60de11 commit: 997443c14cc29e5616b9f3d7c337e89fda60de11 branch: master author: Toshio Kuratomi committer: Cheryl Sabella date: 2020-01-27T07:08:39-05:00 summary: Fix so that test.test_distutils can be executed by unittest and not just regrtest (GH-13480) files: M Lib/test/test_distutils.py diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py index d613abe453b56..a37f11791754d 100644 --- a/Lib/test/test_distutils.py +++ b/Lib/test/test_distutils.py @@ -10,9 +10,15 @@ def test_main(): + # used by regrtest test.support.run_unittest(distutils.tests.test_suite()) test.support.reap_children() +def load_tests(*_): + # used by unittest + return distutils.tests.test_suite() + + if __name__ == "__main__": test_main() From webhook-mailer at python.org Mon Jan 27 09:11:42 2020 From: webhook-mailer at python.org (Chris Withers) Date: Mon, 27 Jan 2020 14:11:42 -0000 Subject: [Python-checkins] Use relative imports in mock and its tests to help backporting (GH-18197) Message-ID: https://github.com/python/cpython/commit/c7dd3c7d87d6961756d99b57aa13db7c7a03e1f8 commit: c7dd3c7d87d6961756d99b57aa13db7c7a03e1f8 branch: master author: Chris Withers committer: GitHub date: 2020-01-27T14:11:19Z summary: Use relative imports in mock and its tests to help backporting (GH-18197) * asyncio.run only available in 3.8+ * iscoroutinefunction has important bungfixes in 3.8 * IsolatedAsyncioTestCase only available in 3.8+ files: M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py M Lib/unittest/test/testmock/testmagicmethods.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 1acafc51df1d6..a3d8b6eab41a9 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -30,6 +30,7 @@ import pprint import sys import builtins +from asyncio import iscoroutinefunction from types import CodeType, ModuleType, MethodType from unittest.util import safe_repr from functools import wraps, partial @@ -48,12 +49,12 @@ def _is_async_obj(obj): return False if hasattr(obj, '__func__'): obj = getattr(obj, '__func__') - return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) + return iscoroutinefunction(obj) or inspect.isawaitable(obj) def _is_async_func(func): if getattr(func, '__code__', None): - return asyncio.iscoroutinefunction(func) + return iscoroutinefunction(func) else: return False @@ -488,7 +489,7 @@ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, _spec_asyncs = [] for attr in dir(spec): - if asyncio.iscoroutinefunction(getattr(spec, attr, None)): + if iscoroutinefunction(getattr(spec, attr, None)): _spec_asyncs.append(attr) if spec is not None and not _is_list(spec): @@ -2152,7 +2153,7 @@ class AsyncMockMixin(Base): def __init__(self, /, *args, **kwargs): super().__init__(*args, **kwargs) - # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an + # iscoroutinefunction() checks _is_coroutine property to say if an # object is a coroutine. Without this check it looks to see if it is a # function/method, which in this case it is not (since it is an # AsyncMock). @@ -2188,7 +2189,7 @@ def __init__(self, /, *args, **kwargs): raise StopAsyncIteration if _is_exception(result): raise result - elif asyncio.iscoroutinefunction(effect): + elif iscoroutinefunction(effect): result = await effect(*args, **kwargs) else: result = effect(*args, **kwargs) @@ -2200,7 +2201,7 @@ def __init__(self, /, *args, **kwargs): return self.return_value if self._mock_wraps is not None: - if asyncio.iscoroutinefunction(self._mock_wraps): + if iscoroutinefunction(self._mock_wraps): return await self._mock_wraps(*args, **kwargs) return self._mock_wraps(*args, **kwargs) @@ -2337,7 +2338,7 @@ class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): recognized as an async function, and the result of a call is an awaitable: >>> mock = AsyncMock() - >>> asyncio.iscoroutinefunction(mock) + >>> iscoroutinefunction(mock) True >>> inspect.isawaitable(mock()) True @@ -2710,7 +2711,7 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, skipfirst = _must_skip(spec, entry, is_type) kwargs['_eat_self'] = skipfirst - if asyncio.iscoroutinefunction(original): + if iscoroutinefunction(original): child_klass = AsyncMock else: child_klass = MagicMock diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 43b87498ef373..6cba42727af8e 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -3,6 +3,8 @@ import re import unittest +from asyncio import run, iscoroutinefunction +from unittest import IsolatedAsyncioTestCase from unittest.mock import (ANY, call, AsyncMock, patch, MagicMock, Mock, create_autospec, sentinel, _CallList) @@ -54,7 +56,7 @@ class AsyncPatchDecoratorTest(unittest.TestCase): def test_is_coroutine_function_patch(self): @patch.object(AsyncClass, 'async_method') def test_async(mock_method): - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() def test_is_async_patch(self): @@ -62,13 +64,13 @@ def test_is_async_patch(self): def test_async(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) @patch(f'{async_foo_name}.async_method') def test_no_parent_attribute(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() test_no_parent_attribute() @@ -107,7 +109,7 @@ def test_async_def_patch(self): self.assertEqual(await async_func(), 1) self.assertEqual(await async_func_args(1, 2, c=3), 2) - asyncio.run(test_async()) + run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -115,7 +117,7 @@ class AsyncPatchCMTest(unittest.TestCase): def test_is_async_function_cm(self): def test_async(): with patch.object(AsyncClass, 'async_method') as mock_method: - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() @@ -124,7 +126,7 @@ def test_async(): with patch.object(AsyncClass, 'async_method') as mock_method: m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() @@ -141,31 +143,31 @@ def test_async_def_cm(self): self.assertIsInstance(async_func, AsyncMock) self.assertTrue(inspect.iscoroutinefunction(async_func)) - asyncio.run(test_async()) + run(test_async()) class AsyncMockTest(unittest.TestCase): def test_iscoroutinefunction_default(self): mock = AsyncMock() - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) def test_iscoroutinefunction_function(self): async def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_isawaitable(self): mock = AsyncMock() m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) self.assertIn('assert_awaited', dir(mock)) def test_iscoroutinefunction_normal_function(self): def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_future_isfuture(self): @@ -211,9 +213,9 @@ def test_create_autospec(self): self.assertEqual(spec.await_args_list, []) spec.assert_not_awaited() - asyncio.run(main()) + run(main()) - self.assertTrue(asyncio.iscoroutinefunction(spec)) + self.assertTrue(iscoroutinefunction(spec)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertEqual(spec.await_count, 1) self.assertEqual(spec.await_args, call(1, 2, c=3)) @@ -234,7 +236,7 @@ def test_patch_with_autospec(self): awaitable = mock_method(1, 2, c=3) self.assertIsInstance(mock_method.mock, AsyncMock) - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertTrue(inspect.isawaitable(awaitable)) @@ -259,7 +261,7 @@ def test_patch_with_autospec(self): self.assertIsNone(mock_method.await_args) self.assertEqual(mock_method.await_args_list, []) - asyncio.run(test_async()) + run(test_async()) class AsyncSpecTest(unittest.TestCase): @@ -313,14 +315,14 @@ def test_spec_as_normal_kw_AsyncMock(self): self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_as_normal_positional_AsyncMock(self): mock = AsyncMock(normal_func) self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_async_mock(self): @patch.object(AsyncClass, 'async_method', spec=True) @@ -370,13 +372,13 @@ def test_async(async_method): def test_is_async_AsyncMock(self): mock = AsyncMock(spec_set=AsyncClass.async_method) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertIsInstance(mock, AsyncMock) def test_is_child_AsyncMock(self): mock = MagicMock(spec_set=AsyncClass) - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) - self.assertFalse(asyncio.iscoroutinefunction(mock.normal_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) + self.assertFalse(iscoroutinefunction(mock.normal_method)) self.assertIsInstance(mock.async_method, AsyncMock) self.assertIsInstance(mock.normal_method, MagicMock) self.assertIsInstance(mock, MagicMock) @@ -389,7 +391,7 @@ def test_magicmock_lambda_spec(self): self.assertIsInstance(cm, MagicMock) -class AsyncArguments(unittest.IsolatedAsyncioTestCase): +class AsyncArguments(IsolatedAsyncioTestCase): async def test_add_return_value(self): async def addition(self, var): return var + 1 @@ -536,8 +538,8 @@ def test_magic_methods_are_async_functions(self): self.assertIsInstance(m_mock.__aenter__, AsyncMock) self.assertIsInstance(m_mock.__aexit__, AsyncMock) # AsyncMocks are also coroutine functions - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aenter__)) - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aexit__)) + self.assertTrue(iscoroutinefunction(m_mock.__aenter__)) + self.assertTrue(iscoroutinefunction(m_mock.__aexit__)) class AsyncContextManagerTest(unittest.TestCase): @@ -574,7 +576,7 @@ def inner_test(mock_type): response.json = AsyncMock(return_value={'json': 123}) cm.__aenter__.return_value = response pc.session.post.return_value = cm - result = asyncio.run(pc.main()) + result = run(pc.main()) self.assertEqual(result, {'json': 123}) for mock_type in [AsyncMock, MagicMock]: @@ -593,7 +595,7 @@ def inner_test(mock_type): called = True return result - cm_result = asyncio.run(use_context_manager()) + cm_result = run(use_context_manager()) self.assertTrue(called) self.assertTrue(cm_mock.__aenter__.called) self.assertTrue(cm_mock.__aexit__.called) @@ -618,7 +620,7 @@ def test_mock_customize_async_context_manager(self): async with mock_instance as result: return result - self.assertIs(asyncio.run(use_context_manager()), expected_result) + self.assertIs(run(use_context_manager()), expected_result) def test_mock_customize_async_context_manager_with_coroutine(self): enter_called = False @@ -642,7 +644,7 @@ def test_mock_customize_async_context_manager_with_coroutine(self): async with mock_instance: pass - asyncio.run(use_context_manager()) + run(use_context_manager()) self.assertTrue(enter_called) self.assertTrue(exit_called) @@ -654,7 +656,7 @@ def test_context_manager_raise_exception_by_default(self): instance = self.WithAsyncContextManager() mock_instance = MagicMock(instance) with self.assertRaises(TypeError): - asyncio.run(raise_in(mock_instance)) + run(raise_in(mock_instance)) class AsyncIteratorTest(unittest.TestCase): @@ -678,7 +680,7 @@ def test_aiter_set_return_value(self): mock_iter.__aiter__.return_value = [1, 2, 3] async def main(): return [i async for i in mock_iter] - result = asyncio.run(main()) + result = run(main()) self.assertEqual(result, [1, 2, 3]) def test_mock_aiter_and_anext_asyncmock(self): @@ -687,11 +689,11 @@ def inner_test(mock_type): mock_instance = mock_type(instance) # Check that the mock and the real thing bahave the same # __aiter__ is not actually async, so not a coroutinefunction - self.assertFalse(asyncio.iscoroutinefunction(instance.__aiter__)) - self.assertFalse(asyncio.iscoroutinefunction(mock_instance.__aiter__)) + self.assertFalse(iscoroutinefunction(instance.__aiter__)) + self.assertFalse(iscoroutinefunction(mock_instance.__aiter__)) # __anext__ is async - self.assertTrue(asyncio.iscoroutinefunction(instance.__anext__)) - self.assertTrue(asyncio.iscoroutinefunction(mock_instance.__anext__)) + self.assertTrue(iscoroutinefunction(instance.__anext__)) + self.assertTrue(iscoroutinefunction(mock_instance.__anext__)) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"test aiter and anext corourtine with {mock_type}"): @@ -709,18 +711,18 @@ def test_mock_async_for(self): expected = ["FOO", "BAR", "BAZ"] def test_default(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) - self.assertEqual(asyncio.run(iterate(mock_instance)), []) + self.assertEqual(run(iterate(mock_instance)), []) def test_set_return_value(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = expected[:] - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) def test_set_return_value_iter(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = iter(expected[:]) - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"default value with {mock_type}"): @@ -748,7 +750,7 @@ def test_assert_called_but_not_awaited(self): with self.assertWarns(RuntimeWarning): # Will raise a warning because never awaited mock.async_method() - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) mock.async_method.assert_called() mock.async_method.assert_called_once() mock.async_method.assert_called_once_with() @@ -766,7 +768,7 @@ def test_assert_called_then_awaited(self): with self.assertRaises(AssertionError): mock.async_method.assert_awaited() - asyncio.run(self._await_coroutine(mock_coroutine)) + run(self._await_coroutine(mock_coroutine)) # Assert we haven't re-called the function mock.async_method.assert_called_once() mock.async_method.assert_awaited() @@ -780,7 +782,7 @@ def test_assert_called_and_awaited_at_same_time(self): with self.assertRaises(AssertionError): self.mock.assert_called() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_called_once() self.mock.assert_awaited_once() @@ -794,7 +796,7 @@ def test_assert_called_twice_and_awaited_once(self): with self.assertRaises(AssertionError): mock.async_method.assert_awaited() mock.async_method.assert_called() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() mock.async_method.assert_awaited_once() @@ -802,10 +804,10 @@ def test_assert_called_once_and_awaited_twice(self): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() mock.async_method.assert_called_once() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) with self.assertRaises(RuntimeError): # Cannot reuse already awaited coroutine - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() def test_assert_awaited_but_not_called(self): @@ -815,7 +817,7 @@ def test_assert_awaited_but_not_called(self): self.mock.assert_called() with self.assertRaises(TypeError): # You cannot await an AsyncMock, it must be a coroutine - asyncio.run(self._await_coroutine(self.mock)) + run(self._await_coroutine(self.mock)) with self.assertRaises(AssertionError): self.mock.assert_awaited() @@ -909,17 +911,17 @@ def test_assert_awaited(self): with self.assertRaises(AssertionError): self.mock.assert_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited() def test_assert_awaited_once(self): with self.assertRaises(AssertionError): self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_awaited_once() @@ -928,15 +930,15 @@ def test_assert_awaited_with(self): with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test()) + run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) with self.assertRaises(AssertionError): self.mock.assert_awaited_with('foo') @@ -944,10 +946,10 @@ def test_assert_awaited_once_with(self): with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') @@ -955,14 +957,14 @@ def test_assert_any_wait(self): with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_any_await('foo') def test_assert_has_awaits_no_order(self): @@ -972,25 +974,25 @@ def test_assert_has_awaits_no_order(self): self.mock.assert_has_awaits(calls) self.assertEqual(len(cm.exception.args), 1) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_has_awaits(calls) def test_awaits_asserts_with_any(self): class Foo: def __eq__(self, other): pass - asyncio.run(self._runnable_test(Foo(), 1)) + run(self._runnable_test(Foo(), 1)) self.mock.assert_has_awaits([call(ANY, 1)]) self.mock.assert_awaited_with(ANY, 1) @@ -1005,7 +1007,7 @@ def __eq__(self, other): pass async def _custom_mock_runnable_test(*args): await mock_with_spec(*args) - asyncio.run(_custom_mock_runnable_test(Foo(), 1)) + run(_custom_mock_runnable_test(Foo(), 1)) mock_with_spec.assert_has_awaits([call(ANY, 1)]) mock_with_spec.assert_awaited_with(ANY, 1) mock_with_spec.assert_any_await(ANY, 1) @@ -1015,24 +1017,24 @@ def test_assert_has_awaits_ordered(self): with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('bamf')) + run(self._runnable_test('bamf')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('qux')) + run(self._runnable_test('qux')) self.mock.assert_has_awaits(calls, any_order=True) def test_assert_not_awaited(self): self.mock.assert_not_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_not_awaited() @@ -1040,7 +1042,7 @@ def test_assert_has_awaits_not_matching_spec_error(self): async def f(x=None): pass self.mock = AsyncMock(spec=f) - asyncio.run(self._runnable_test(1)) + run(self._runnable_test(1)) with self.assertRaisesRegex( AssertionError, diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 76b3a560de090..5690f7a6bbb57 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,8 +1,8 @@ -import asyncio import math import unittest import os import sys +from asyncio import iscoroutinefunction from unittest.mock import AsyncMock, Mock, MagicMock, _magics @@ -286,8 +286,8 @@ def test_asyncmock_defaults(self): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) @@ -312,8 +312,8 @@ def test_magicmock_defaults(self): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) From webhook-mailer at python.org Mon Jan 27 09:56:05 2020 From: webhook-mailer at python.org (Chris Withers) Date: Mon, 27 Jan 2020 14:56:05 -0000 Subject: [Python-checkins] Clarify and fix assertions that mocks have not been awaited (GH-18196) Message-ID: https://github.com/python/cpython/commit/a46575a8f2ded8b49e26c25bb67192e1500e76ca commit: a46575a8f2ded8b49e26c25bb67192e1500e76ca branch: master author: Chris Withers committer: GitHub date: 2020-01-27T14:55:56Z summary: Clarify and fix assertions that mocks have not been awaited (GH-18196) - The gc.collect is needed for other implementations, such as pypy - Using context managers over multiple lines will only catch the warning from the first line in the context! - remove a skip for a test that no longer fails on pypy files: M Lib/unittest/test/testmock/testasync.py M Lib/unittest/test/testmock/testmagicmethods.py diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 6cba42727af8e..992076db78706 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -1,7 +1,9 @@ import asyncio +import gc import inspect import re import unittest +from contextlib import contextmanager from asyncio import run, iscoroutinefunction from unittest import IsolatedAsyncioTestCase @@ -52,6 +54,15 @@ def a(self): normal_foo_name = f'{__name__}.NormalClass' + at contextmanager +def assertNeverAwaited(test): + with test.assertWarnsRegex(RuntimeWarning, "was never awaited$"): + yield + # In non-CPython implementations of Python, this is needed because timely + # deallocation is not guaranteed by the garbage collector. + gc.collect() + + class AsyncPatchDecoratorTest(unittest.TestCase): def test_is_coroutine_function_patch(self): @patch.object(AsyncClass, 'async_method') @@ -284,8 +295,7 @@ def test_spec_mock_type_kw(self): def inner_test(mock_type): async_mock = mock_type(spec=async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(spec=normal_func) @@ -299,8 +309,7 @@ def test_spec_mock_type_positional(self): def inner_test(mock_type): async_mock = mock_type(async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(normal_func) @@ -747,8 +756,7 @@ def setUp(self): def test_assert_called_but_not_awaited(self): mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): mock.async_method() self.assertTrue(iscoroutinefunction(mock.async_method)) mock.async_method.assert_called() @@ -789,9 +797,9 @@ def test_assert_called_and_awaited_at_same_time(self): def test_assert_called_twice_and_awaited_once(self): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() - with self.assertWarns(RuntimeWarning): - # The first call will be awaited so no warning there - # But this call will never get awaited, so it will warn here + # The first call will be awaited so no warning there + # But this call will never get awaited, so it will warn here + with assertNeverAwaited(self): mock.async_method() with self.assertRaises(AssertionError): mock.async_method.assert_awaited() @@ -826,38 +834,34 @@ def test_assert_awaited_but_not_called(self): def test_assert_has_calls_not_awaits(self): kalls = [call('foo')] - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') self.mock.assert_has_calls(kalls) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(kalls) def test_assert_has_mock_calls_on_async_mock_no_spec(self): - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock() kalls_empty = [('', (), {})] self.assertEqual(self.mock.mock_calls, kalls_empty) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') + with assertNeverAwaited(self): self.mock('baz') mock_kalls = ([call(), call('foo'), call('baz')]) self.assertEqual(self.mock.mock_calls, mock_kalls) def test_assert_has_mock_calls_on_async_mock_with_spec(self): a_class_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method() kalls_empty = [('', (), {})] self.assertEqual(a_class_mock.async_method.mock_calls, kalls_empty) self.assertEqual(a_class_mock.mock_calls, [call.async_method()]) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method(1, 2, 3, a=4, b=5) method_kalls = [call(), call(1, 2, 3, a=4, b=5)] mock_kalls = [call.async_method(), call.async_method(1, 2, 3, a=4, b=5)] @@ -865,9 +869,9 @@ def test_assert_has_mock_calls_on_async_mock_with_spec(self): self.assertEqual(a_class_mock.mock_calls, mock_kalls) def test_async_method_calls_recorded(self): - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock.something(3, fish=None) + with assertNeverAwaited(self): self.mock.something_else.something(6, cake=sentinel.Cake) self.assertEqual(self.mock.method_calls, [ @@ -889,19 +893,20 @@ def assert_attrs(mock): self.assertEqual(attr, []) assert_attrs(self.mock) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock() + with assertNeverAwaited(self): self.mock(1, 2) + with assertNeverAwaited(self): self.mock(a=3) self.mock.reset_mock() assert_attrs(self.mock) a_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): a_mock.async_method() + with assertNeverAwaited(self): a_mock.async_method(1, a=3) a_mock.reset_mock() diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 5690f7a6bbb57..a4feae7e9d3b7 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,7 +1,6 @@ import math import unittest import os -import sys from asyncio import iscoroutinefunction from unittest.mock import AsyncMock, Mock, MagicMock, _magics @@ -429,7 +428,6 @@ def _dir(self): self.assertEqual(dir(mock), ['foo']) - @unittest.skipIf('PyPy' in sys.version, "This fails differently on pypy") def test_bound_methods(self): m = Mock() From webhook-mailer at python.org Mon Jan 27 10:02:28 2020 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 27 Jan 2020 15:02:28 -0000 Subject: [Python-checkins] bpo-39453: Make list.__contains__ hold strong references to avoid crashes (GH-18181) Message-ID: https://github.com/python/cpython/commit/4dbf2d8c6789a9b7299b142033073213604b8fdc commit: 4dbf2d8c6789a9b7299b142033073213604b8fdc branch: master author: Dong-hee Na committer: Pablo Galindo date: 2020-01-27T15:02:23Z summary: bpo-39453: Make list.__contains__ hold strong references to avoid crashes (GH-18181) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst M Lib/test/test_list.py M Objects/listobject.c diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 6e3c4c109300e..33a55f76d9b2c 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -221,6 +221,11 @@ def __eq__(self, other): with self.assertRaises(ValueError): lst.remove(lst) + # bpo-39453: list.__contains__ was not holding strong references + # to list elements while calling PyObject_RichCompareBool(). + lst = [X(), X()] + 3 in lst + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst new file mode 100644 index 0000000000000..8c2e49f9474c4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst @@ -0,0 +1,2 @@ +Fixed a possible crash in :meth:`list.__contains__` when a list is changed +during comparing items. Patch by Dong-hee Na. diff --git a/Objects/listobject.c b/Objects/listobject.c index a4e90dbf90cf9..38055d5f5f341 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -445,11 +445,16 @@ list_length(PyListObject *a) static int list_contains(PyListObject *a, PyObject *el) { + PyObject *item; Py_ssize_t i; int cmp; - for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) + for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) { + item = PyList_GET_ITEM(a, i); + Py_INCREF(item); cmp = PyObject_RichCompareBool(PyList_GET_ITEM(a, i), el, Py_EQ); + Py_DECREF(item); + } return cmp; } From webhook-mailer at python.org Mon Jan 27 11:05:12 2020 From: webhook-mailer at python.org (Nick Coghlan) Date: Mon, 27 Jan 2020 16:05:12 -0000 Subject: [Python-checkins] Ignore NEWS snippets in code coverage stats (GH-18194) Message-ID: https://github.com/python/cpython/commit/7023288dc500008609e7a4d12ae710c2093c3fc6 commit: 7023288dc500008609e7a4d12ae710c2093c3fc6 branch: master author: Nick Coghlan committer: GitHub date: 2020-01-28T02:05:03+10:00 summary: Ignore NEWS snippets in code coverage stats (GH-18194) files: M .github/codecov.yml diff --git a/.github/codecov.yml b/.github/codecov.yml index 9d97dfbc43f8d..ea504f48672ea 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -5,7 +5,7 @@ codecov: comment: off ignore: - "Doc/**/*" - - "Misc/*" + - "Misc/**/*" - "Mac/**/*" - "PC/**/*" - "PCbuild/**/*" From webhook-mailer at python.org Mon Jan 27 11:28:07 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 16:28:07 -0000 Subject: [Python-checkins] Ignore NEWS snippets in code coverage stats (GH-18194) Message-ID: https://github.com/python/cpython/commit/414ab5de48cfc1d8be40e330bca0611a14e28ea5 commit: 414ab5de48cfc1d8be40e330bca0611a14e28ea5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-27T08:28:02-08:00 summary: Ignore NEWS snippets in code coverage stats (GH-18194) (cherry picked from commit 7023288dc500008609e7a4d12ae710c2093c3fc6) Co-authored-by: Nick Coghlan files: M .github/codecov.yml diff --git a/.github/codecov.yml b/.github/codecov.yml index 9d97dfbc43f8d..ea504f48672ea 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -5,7 +5,7 @@ codecov: comment: off ignore: - "Doc/**/*" - - "Misc/*" + - "Misc/**/*" - "Mac/**/*" - "PC/**/*" - "PCbuild/**/*" From webhook-mailer at python.org Mon Jan 27 11:28:08 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 16:28:08 -0000 Subject: [Python-checkins] Ignore NEWS snippets in code coverage stats (GH-18194) Message-ID: https://github.com/python/cpython/commit/57e7e5775e52926c983e71e517d900b5560ea2ff commit: 57e7e5775e52926c983e71e517d900b5560ea2ff branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-27T08:27:59-08:00 summary: Ignore NEWS snippets in code coverage stats (GH-18194) (cherry picked from commit 7023288dc500008609e7a4d12ae710c2093c3fc6) Co-authored-by: Nick Coghlan files: M .github/codecov.yml diff --git a/.github/codecov.yml b/.github/codecov.yml index 9d97dfbc43f8d..ea504f48672ea 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -5,7 +5,7 @@ codecov: comment: off ignore: - "Doc/**/*" - - "Misc/*" + - "Misc/**/*" - "Mac/**/*" - "PC/**/*" - "PCbuild/**/*" From webhook-mailer at python.org Mon Jan 27 12:04:33 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 17:04:33 -0000 Subject: [Python-checkins] bpo-39453: Add testcase for bpo-39453 (GH-18202) Message-ID: https://github.com/python/cpython/commit/9e1ed518a576897f914227bf538bac426a02a081 commit: 9e1ed518a576897f914227bf538bac426a02a081 branch: master author: Dong-hee Na committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2020-01-27T09:04:25-08:00 summary: bpo-39453: Add testcase for bpo-39453 (GH-18202) https://bugs.python.org/issue39453 Automerge-Triggered-By: @pablogsal Automerge-Triggered-By: @pablogsal files: M Lib/test/test_list.py M Objects/listobject.c diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 33a55f76d9b2c..3c8d82958fd7c 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -225,6 +225,8 @@ def __eq__(self, other): # to list elements while calling PyObject_RichCompareBool(). lst = [X(), X()] 3 in lst + lst = [X(), X()] + X() in lst if __name__ == "__main__": diff --git a/Objects/listobject.c b/Objects/listobject.c index 38055d5f5f341..2c07ceb0d412c 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -452,7 +452,7 @@ list_contains(PyListObject *a, PyObject *el) for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) { item = PyList_GET_ITEM(a, i); Py_INCREF(item); - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(a, i), el, Py_EQ); + cmp = PyObject_RichCompareBool(item, el, Py_EQ); Py_DECREF(item); } return cmp; From webhook-mailer at python.org Mon Jan 27 12:06:47 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 Jan 2020 17:06:47 -0000 Subject: [Python-checkins] bpo-39459: test.pythoninfo logs effective uid/gid (GH-18203) Message-ID: https://github.com/python/cpython/commit/4a46adc7746930c4589ee483cad88d3f8504c045 commit: 4a46adc7746930c4589ee483cad88d3f8504c045 branch: master author: Victor Stinner committer: GitHub date: 2020-01-27T18:06:42+01:00 summary: bpo-39459: test.pythoninfo logs effective uid/gid (GH-18203) Fix also umask formatting: use octal prefix. files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index eab82c3631fd2..cc230dd2297a0 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -199,11 +199,19 @@ def format_attr(attr, value): ) copy_attributes(info_add, os, 'os.%s', attributes, formatter=format_attr) - call_func(info_add, 'os.getcwd', os, 'getcwd') - - call_func(info_add, 'os.getuid', os, 'getuid') - call_func(info_add, 'os.getgid', os, 'getgid') - call_func(info_add, 'os.uname', os, 'uname') + for func in ( + 'cpu_count', + 'getcwd', + 'getegid', + 'geteuid', + 'getgid', + 'getloadavg', + 'getresgid', + 'getresuid', + 'getuid', + 'uname', + ): + call_func(info_add, 'os.%s' % func, os, func) def format_groups(groups): return ', '.join(map(str, groups)) @@ -220,9 +228,6 @@ def format_groups(groups): else: info_add("os.login", login) - call_func(info_add, 'os.cpu_count', os, 'cpu_count') - call_func(info_add, 'os.getloadavg', os, 'getloadavg') - # Environment variables used by the stdlib and tests. Don't log the full # environment: filter to list to not leak sensitive information. # @@ -303,7 +308,7 @@ def format_groups(groups): if hasattr(os, 'umask'): mask = os.umask(0) os.umask(mask) - info_add("os.umask", '%03o' % mask) + info_add("os.umask", '0o%03o' % mask) def collect_pwd(info_add): From webhook-mailer at python.org Mon Jan 27 16:37:10 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 Jan 2020 21:37:10 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in PyModule_Create2() (GH-18212) Message-ID: https://github.com/python/cpython/commit/a94c6b61aa5c09237b8105e5aee638cd54197b6f commit: a94c6b61aa5c09237b8105e5aee638cd54197b6f branch: master author: Victor Stinner committer: GitHub date: 2020-01-27T22:37:05+01:00 summary: bpo-38631: Avoid Py_FatalError() in PyModule_Create2() (GH-18212) If PyModule_Create2() is called when the Python import machinery is not initialized, it now raises a SystemError and returns NULL, instead of calling Py_FatalError() which aborts the process. The caller must be prepared to handle NULL anyway. files: M Objects/moduleobject.c diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 03c7381311aa1..912c258401586 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -173,8 +173,11 @@ _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) PyObject * PyModule_Create2(struct PyModuleDef* module, int module_api_version) { - if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) - Py_FatalError("Python import machinery not initialized"); + if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) { + PyErr_SetString(PyExc_SystemError, + "Python import machinery not initialized"); + return NULL; + } return _PyModule_CreateInitialized(module, module_api_version); } From webhook-mailer at python.org Mon Jan 27 16:37:49 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 Jan 2020 21:37:49 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in _memory_release() (GH-18214) Message-ID: https://github.com/python/cpython/commit/47ee8a6063c22ec272fe7a2d95d12f7811ebb48b commit: 47ee8a6063c22ec272fe7a2d95d12f7811ebb48b branch: master author: Victor Stinner committer: GitHub date: 2020-01-27T22:37:44+01:00 summary: bpo-38631: Avoid Py_FatalError() in _memory_release() (GH-18214) If the export count is negative, _memory_release() now raises a SystemError and returns -1, rather than calling Py_FatalError() which aborts the process. files: M Objects/memoryobject.c diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 66920eaf947ab..d9dd11733ef1a 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1048,7 +1048,8 @@ _memory_release(PyMemoryViewObject *self) return -1; } - Py_FatalError("_memory_release(): negative export count"); + PyErr_SetString(PyExc_SystemError, + "_memory_release(): negative export count"); return -1; } From webhook-mailer at python.org Mon Jan 27 17:05:01 2020 From: webhook-mailer at python.org (Dino Viehland) Date: Mon, 27 Jan 2020 22:05:01 -0000 Subject: [Python-checkins] Add test.test_import.data.unwritable package to makefile (#18211) Message-ID: https://github.com/python/cpython/commit/2528a6c3d0660c03ae43d796628462ccf8e58190 commit: 2528a6c3d0660c03ae43d796628462ccf8e58190 branch: master author: Dino Viehland committer: GitHub date: 2020-01-27T14:04:56-08:00 summary: Add test.test_import.data.unwritable package to makefile (#18211) files: M Makefile.pre.in diff --git a/Makefile.pre.in b/Makefile.pre.in index cfe42b4f21ecb..d430dc30bb6de 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1336,6 +1336,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_import/data/circular_imports/subpkg \ test/test_import/data/package \ test/test_import/data/package2 \ + test/test_import/data/unwritable \ importlib \ importlib/metadata \ test/test_importlib \ From webhook-mailer at python.org Mon Jan 27 17:16:03 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 27 Jan 2020 22:16:03 -0000 Subject: [Python-checkins] bpo-30780: Add IDLE configdialog tests (#3592) Message-ID: https://github.com/python/cpython/commit/dd023ad1619b6f1ab313986e8953eea32c18f50c commit: dd023ad1619b6f1ab313986e8953eea32c18f50c branch: master author: Cheryl Sabella committer: Terry Jan Reedy date: 2020-01-27T17:15:56-05:00 summary: bpo-30780: Add IDLE configdialog tests (#3592) Expose dialog buttons to test code and complete their test coverage. Complete test coverage for highlights and keys tabs. Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index eda7c2788764d..2b543985b3783 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-30780: Add remaining configdialog tests for buttons and +highlights and keys tabs. + bpo-39388: Settings dialog Cancel button cancels pending changes. bpo-39050: Settings dialog Help button again displays help text. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 2f95c9ccaa0c5..22359735874d1 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -149,17 +149,19 @@ def create_action_buttons(self): else: padding_args = {'padding': (6, 3)} outer = Frame(self, padding=2) - buttons = Frame(outer, padding=2) + buttons_frame = Frame(outer, padding=2) + self.buttons = {} for txt, cmd in ( ('Ok', self.ok), ('Apply', self.apply), ('Cancel', self.cancel), ('Help', self.help)): - Button(buttons, text=txt, command=cmd, takefocus=FALSE, - **padding_args).pack(side=LEFT, padx=5) + self.buttons[txt] = Button(buttons_frame, text=txt, command=cmd, + takefocus=FALSE, **padding_args) + self.buttons[txt].pack(side=LEFT, padx=5) # Add space above buttons. Frame(outer, height=2, borderwidth=0).pack(side=TOP) - buttons.pack(side=BOTTOM) + buttons_frame.pack(side=BOTTOM) return outer def ok(self): @@ -205,7 +207,6 @@ def help(self): Attributes accessed: note - Methods: view_text: Method from textview module. """ @@ -852,6 +853,7 @@ def create_page_highlight(self): text.configure( font=('courier', 12, ''), cursor='hand2', width=1, height=1, takefocus=FALSE, highlightthickness=0, wrap=NONE) + # Prevent perhaps invisible selection of word or slice. text.bind('', lambda e: 'break') text.bind('', lambda e: 'break') string_tags=( @@ -1284,8 +1286,7 @@ def save_new(self, theme_name, theme): theme_name - string, the name of the new theme theme - dictionary containing the new theme """ - if not idleConf.userCfg['highlight'].has_section(theme_name): - idleConf.userCfg['highlight'].add_section(theme_name) + idleConf.userCfg['highlight'].AddSection(theme_name) for element in theme: value = theme[element] idleConf.userCfg['highlight'].SetOption(theme_name, element, value) @@ -1730,8 +1731,7 @@ def save_new_key_set(keyset_name, keyset): keyset_name - string, the name of the new key set keyset - dictionary containing the new keybindings """ - if not idleConf.userCfg['keys'].has_section(keyset_name): - idleConf.userCfg['keys'].add_section(keyset_name) + idleConf.userCfg['keys'].AddSection(keyset_name) for event in keyset: value = keyset[event] idleConf.userCfg['keys'].SetOption(keyset_name, event, value) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 817a35217bf3c..1fea6d41df811 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -8,7 +8,7 @@ import unittest from unittest import mock from idlelib.idle_test.mock_idle import Func -from tkinter import Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL +from tkinter import (Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL) from idlelib import config from idlelib.configdialog import idleConf, changes, tracers @@ -30,6 +30,7 @@ keyspage = changes['keys'] extpage = changes['extensions'] + def setUpModule(): global root, dialog idleConf.userCfg = testcfg @@ -37,6 +38,7 @@ def setUpModule(): # root.withdraw() # Comment out, see issue 30870 dialog = configdialog.ConfigDialog(root, 'Test', _utest=True) + def tearDownModule(): global root, dialog idleConf.userCfg = usercfg @@ -48,22 +50,56 @@ def tearDownModule(): root = dialog = None -class DialogTest(unittest.TestCase): +class ConfigDialogTest(unittest.TestCase): + + def test_deactivate_current_config(self): + pass + + def activate_config_changes(self): + pass + - @mock.patch(__name__+'.dialog.destroy', new_callable=Func) - def test_cancel(self, destroy): +class ButtonTest(unittest.TestCase): + + def test_click_ok(self): + d = dialog + apply = d.apply = mock.Mock() + destroy = d.destroy = mock.Mock() + d.buttons['Ok'].invoke() + apply.assert_called_once() + destroy.assert_called_once() + del d.destroy, d.apply + + def test_click_apply(self): + d = dialog + deactivate = d.deactivate_current_config = mock.Mock() + save_ext = d.save_all_changed_extensions = mock.Mock() + activate = d.activate_config_changes = mock.Mock() + d.buttons['Apply'].invoke() + deactivate.assert_called_once() + save_ext.assert_called_once() + activate.assert_called_once() + del d.save_all_changed_extensions + del d.activate_config_changes, d.deactivate_current_config + + def test_click_cancel(self): + d = dialog + d.destroy = Func() changes['main']['something'] = 1 - dialog.cancel() + d.buttons['Cancel'].invoke() self.assertEqual(changes['main'], {}) - self.assertEqual(destroy.called, 1) + self.assertEqual(d.destroy.called, 1) + del d.destroy - @mock.patch('idlelib.configdialog.view_text', new_callable=Func) - def test_help(self, view): + def test_click_help(self): dialog.note.select(dialog.keyspage) - dialog.help() - s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click') and - s.endswith('a different name.\n')) + with mock.patch.object(configdialog, 'view_text', + new_callable=Func) as view: + dialog.buttons['Help'].invoke() + title, contents = view.kwds['title'], view.kwds['contents'] + self.assertEqual(title, 'Help for IDLE preferences') + self.assertTrue(contents.startswith('When you click') and + contents.endswith('a different name.\n')) class FontPageTest(unittest.TestCase): @@ -438,6 +474,48 @@ def click_it(start): eq(d.highlight_target.get(), elem[tag]) eq(d.set_highlight_target.called, count) + def test_highlight_sample_double_click(self): + # Test double click on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + # Test binding from configdialog. + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + # Double click is a sequence of two clicks in a row. + for _ in range(2): + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + + eq(hs.tag_ranges('sel'), ()) + + def test_highlight_sample_b1_motion(self): + # Test button motion on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + x, y, dx, dy, offset = hs.dlineinfo('1.0') + + # Test binding from configdialog. + hs.event_generate('') + hs.event_generate('') + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=dx, y=dy) + hs.event_generate('', x=dx, y=dy) + + eq(hs.tag_ranges('sel'), ()) + def test_set_theme_type(self): eq = self.assertEqual d = self.page @@ -666,8 +744,13 @@ def test_delete_custom(self): idleConf.userCfg['highlight'].SetOption(theme_name, 'name', 'value') highpage[theme_name] = {'option': 'True'} + theme_name2 = 'other theme' + idleConf.userCfg['highlight'].SetOption(theme_name2, 'name', 'value') + highpage[theme_name2] = {'option': 'False'} + # Force custom theme. - d.theme_source.set(False) + d.custom_theme_on.state(('!disabled',)) + d.custom_theme_on.invoke() d.custom_name.set(theme_name) # Cancel deletion. @@ -675,7 +758,7 @@ def test_delete_custom(self): d.button_delete_custom.invoke() eq(yesno.called, 1) eq(highpage[theme_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'highlight'), ['spam theme']) + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name, theme_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_theme_type.called, 0) @@ -685,13 +768,26 @@ def test_delete_custom(self): d.button_delete_custom.invoke() eq(yesno.called, 2) self.assertNotIn(theme_name, highpage) - eq(idleConf.GetSectionList('user', 'highlight'), []) - eq(d.custom_theme_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom themes -') + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name2]) + eq(d.custom_theme_on.state(), ()) + eq(d.custom_name.get(), theme_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_theme_type.called, 1) + # Confirm deletion of second theme - empties list. + d.custom_name.set(theme_name2) + yesno.result = True + d.button_delete_custom.invoke() + eq(yesno.called, 3) + self.assertNotIn(theme_name, highpage) + eq(idleConf.GetSectionList('user', 'highlight'), []) + eq(d.custom_theme_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom themes -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_theme_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno @@ -1059,8 +1155,13 @@ def test_delete_custom_keys(self): idleConf.userCfg['keys'].SetOption(keyset_name, 'name', 'value') keyspage[keyset_name] = {'option': 'True'} + keyset_name2 = 'other key set' + idleConf.userCfg['keys'].SetOption(keyset_name2, 'name', 'value') + keyspage[keyset_name2] = {'option': 'False'} + # Force custom keyset. - d.keyset_source.set(False) + d.custom_keyset_on.state(('!disabled',)) + d.custom_keyset_on.invoke() d.custom_name.set(keyset_name) # Cancel deletion. @@ -1068,7 +1169,7 @@ def test_delete_custom_keys(self): d.button_delete_custom_keys.invoke() eq(yesno.called, 1) eq(keyspage[keyset_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'keys'), ['spam key set']) + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name, keyset_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_keys_type.called, 0) @@ -1078,13 +1179,26 @@ def test_delete_custom_keys(self): d.button_delete_custom_keys.invoke() eq(yesno.called, 2) self.assertNotIn(keyset_name, keyspage) - eq(idleConf.GetSectionList('user', 'keys'), []) - eq(d.custom_keyset_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom keys -') + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name2]) + eq(d.custom_keyset_on.state(), ()) + eq(d.custom_name.get(), keyset_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_keys_type.called, 1) + # Confirm deletion of second keyset - empties list. + d.custom_name.set(keyset_name2) + yesno.result = True + d.button_delete_custom_keys.invoke() + eq(yesno.called, 3) + self.assertNotIn(keyset_name, keyspage) + eq(idleConf.GetSectionList('user', 'keys'), []) + eq(d.custom_keyset_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom keys -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_keys_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno diff --git a/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst new file mode 100644 index 0000000000000..2f65a00a5af3b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst @@ -0,0 +1 @@ +Add remaining configdialog tests for buttons and highlights and keys tabs. From webhook-mailer at python.org Mon Jan 27 17:23:19 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 Jan 2020 22:23:19 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217) Message-ID: https://github.com/python/cpython/commit/d3a1de22705cc79d7e8a0f44c4f00255e58c8b20 commit: d3a1de22705cc79d7e8a0f44c4f00255e58c8b20 branch: master author: Victor Stinner committer: GitHub date: 2020-01-27T23:23:12+01:00 summary: bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217) _PyCodecRegistry_Init() now reports exceptions to the caller, rather than calling Py_FatalError(). files: M Python/codecs.c diff --git a/Python/codecs.c b/Python/codecs.c index 08e9b916f201d..10d76969a519d 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -1494,32 +1494,37 @@ static int _PyCodecRegistry_Init(void) PyInterpreterState *interp = _PyInterpreterState_Get(); PyObject *mod; - unsigned i; if (interp->codec_search_path != NULL) return 0; interp->codec_search_path = PyList_New(0); + if (interp->codec_search_path == NULL) { + return -1; + } + interp->codec_search_cache = PyDict_New(); + if (interp->codec_search_cache == NULL) { + return -1; + } + interp->codec_error_registry = PyDict_New(); + if (interp->codec_error_registry == NULL) { + return -1; + } - if (interp->codec_error_registry) { - for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { - PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); - int res; - if (!func) - Py_FatalError("can't initialize codec error registry"); - res = PyCodec_RegisterError(methods[i].name, func); - Py_DECREF(func); - if (res) - Py_FatalError("can't initialize codec error registry"); + for (size_t i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { + PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); + if (!func) { + return -1; } - } - if (interp->codec_search_path == NULL || - interp->codec_search_cache == NULL || - interp->codec_error_registry == NULL) - Py_FatalError("can't initialize codec registry"); + int res = PyCodec_RegisterError(methods[i].name, func); + Py_DECREF(func); + if (res) { + return -1; + } + } mod = PyImport_ImportModuleNoBlock("encodings"); if (mod == NULL) { From webhook-mailer at python.org Mon Jan 27 17:24:18 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 27 Jan 2020 22:24:18 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in PyCode_New() (GH-18215) Message-ID: https://github.com/python/cpython/commit/a27831351873bd7eff10863353d475c29fb0d7bb commit: a27831351873bd7eff10863353d475c29fb0d7bb branch: master author: Victor Stinner committer: GitHub date: 2020-01-27T23:24:13+01:00 summary: bpo-38631: Avoid Py_FatalError() in PyCode_New() (GH-18215) intern_strings() now raises a SystemError, rather than calling Py_FatalError(). intern_string_constants() now reports exceptions to the caller, rather than ignoring silently exceptions. files: M Objects/codeobject.c diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 522e1a9f2a419..c6759c9be22f6 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -38,7 +38,7 @@ all_name_chars(PyObject *o) return 1; } -static void +static int intern_strings(PyObject *tuple) { Py_ssize_t i; @@ -46,60 +46,70 @@ intern_strings(PyObject *tuple) for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (v == NULL || !PyUnicode_CheckExact(v)) { - Py_FatalError("non-string found in code slot"); + PyErr_SetString(PyExc_SystemError, + "non-string found in code slot"); + return -1; } PyUnicode_InternInPlace(&_PyTuple_ITEMS(tuple)[i]); } + return 0; } /* Intern selected string constants */ static int -intern_string_constants(PyObject *tuple) +intern_string_constants(PyObject *tuple, int *modified) { - int modified = 0; - Py_ssize_t i; - - for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { + for (Py_ssize_t i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (PyUnicode_CheckExact(v)) { if (PyUnicode_READY(v) == -1) { - PyErr_Clear(); - continue; + return -1; } + if (all_name_chars(v)) { PyObject *w = v; PyUnicode_InternInPlace(&v); if (w != v) { PyTuple_SET_ITEM(tuple, i, v); - modified = 1; + if (modified) { + *modified = 1; + } } } } else if (PyTuple_CheckExact(v)) { - intern_string_constants(v); + if (intern_string_constants(v, NULL) < 0) { + return -1; + } } else if (PyFrozenSet_CheckExact(v)) { PyObject *w = v; PyObject *tmp = PySequence_Tuple(v); if (tmp == NULL) { - PyErr_Clear(); - continue; + return -1; } - if (intern_string_constants(tmp)) { + int tmp_modified = 0; + if (intern_string_constants(tmp, &tmp_modified) < 0) { + Py_DECREF(tmp); + return -1; + } + if (tmp_modified) { v = PyFrozenSet_New(tmp); if (v == NULL) { - PyErr_Clear(); + Py_DECREF(tmp); + return -1; } - else { - PyTuple_SET_ITEM(tuple, i, v); - Py_DECREF(w); - modified = 1; + + PyTuple_SET_ITEM(tuple, i, v); + Py_DECREF(w); + if (modified) { + *modified = 1; } } Py_DECREF(tmp); } } - return modified; + return 0; } PyCodeObject * @@ -139,11 +149,21 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, return NULL; } - intern_strings(names); - intern_strings(varnames); - intern_strings(freevars); - intern_strings(cellvars); - intern_string_constants(consts); + if (intern_strings(names) < 0) { + return NULL; + } + if (intern_strings(varnames) < 0) { + return NULL; + } + if (intern_strings(freevars) < 0) { + return NULL; + } + if (intern_strings(cellvars) < 0) { + return NULL; + } + if (intern_string_constants(consts, NULL) < 0) { + return NULL; + } /* Check for any inner or outer closure references */ n_cellvars = PyTuple_GET_SIZE(cellvars); @@ -513,7 +533,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) ourvarnames, ourfreevars, ourcellvars, filename, name, firstlineno, lnotab); - cleanup: + cleanup: Py_XDECREF(ournames); Py_XDECREF(ourvarnames); Py_XDECREF(ourfreevars); From webhook-mailer at python.org Mon Jan 27 17:31:41 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 22:31:41 -0000 Subject: [Python-checkins] bpo-30780: Add IDLE configdialog tests (GH-3592) Message-ID: https://github.com/python/cpython/commit/5aefee6f989821c5dc36d10a9cfd083d7aa737a5 commit: 5aefee6f989821c5dc36d10a9cfd083d7aa737a5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-27T14:31:33-08:00 summary: bpo-30780: Add IDLE configdialog tests (GH-3592) Expose dialog buttons to test code and complete their test coverage. Complete test coverage for highlights and keys tabs. Co-authored-by: Terry Jan Reedy (cherry picked from commit dd023ad1619b6f1ab313986e8953eea32c18f50c) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 23901f3aa5f1c..79534111bcd8e 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-12-16? ====================================== +bpo-30780: Add remaining configdialog tests for buttons and +highlights and keys tabs. + bpo-39388: Settings dialog Cancel button cancels pending changes. bpo-39050: Settings dialog Help button again displays help text. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 2f95c9ccaa0c5..22359735874d1 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -149,17 +149,19 @@ def create_action_buttons(self): else: padding_args = {'padding': (6, 3)} outer = Frame(self, padding=2) - buttons = Frame(outer, padding=2) + buttons_frame = Frame(outer, padding=2) + self.buttons = {} for txt, cmd in ( ('Ok', self.ok), ('Apply', self.apply), ('Cancel', self.cancel), ('Help', self.help)): - Button(buttons, text=txt, command=cmd, takefocus=FALSE, - **padding_args).pack(side=LEFT, padx=5) + self.buttons[txt] = Button(buttons_frame, text=txt, command=cmd, + takefocus=FALSE, **padding_args) + self.buttons[txt].pack(side=LEFT, padx=5) # Add space above buttons. Frame(outer, height=2, borderwidth=0).pack(side=TOP) - buttons.pack(side=BOTTOM) + buttons_frame.pack(side=BOTTOM) return outer def ok(self): @@ -205,7 +207,6 @@ def help(self): Attributes accessed: note - Methods: view_text: Method from textview module. """ @@ -852,6 +853,7 @@ def create_page_highlight(self): text.configure( font=('courier', 12, ''), cursor='hand2', width=1, height=1, takefocus=FALSE, highlightthickness=0, wrap=NONE) + # Prevent perhaps invisible selection of word or slice. text.bind('', lambda e: 'break') text.bind('', lambda e: 'break') string_tags=( @@ -1284,8 +1286,7 @@ def save_new(self, theme_name, theme): theme_name - string, the name of the new theme theme - dictionary containing the new theme """ - if not idleConf.userCfg['highlight'].has_section(theme_name): - idleConf.userCfg['highlight'].add_section(theme_name) + idleConf.userCfg['highlight'].AddSection(theme_name) for element in theme: value = theme[element] idleConf.userCfg['highlight'].SetOption(theme_name, element, value) @@ -1730,8 +1731,7 @@ def save_new_key_set(keyset_name, keyset): keyset_name - string, the name of the new key set keyset - dictionary containing the new keybindings """ - if not idleConf.userCfg['keys'].has_section(keyset_name): - idleConf.userCfg['keys'].add_section(keyset_name) + idleConf.userCfg['keys'].AddSection(keyset_name) for event in keyset: value = keyset[event] idleConf.userCfg['keys'].SetOption(keyset_name, event, value) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 817a35217bf3c..1fea6d41df811 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -8,7 +8,7 @@ import unittest from unittest import mock from idlelib.idle_test.mock_idle import Func -from tkinter import Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL +from tkinter import (Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL) from idlelib import config from idlelib.configdialog import idleConf, changes, tracers @@ -30,6 +30,7 @@ keyspage = changes['keys'] extpage = changes['extensions'] + def setUpModule(): global root, dialog idleConf.userCfg = testcfg @@ -37,6 +38,7 @@ def setUpModule(): # root.withdraw() # Comment out, see issue 30870 dialog = configdialog.ConfigDialog(root, 'Test', _utest=True) + def tearDownModule(): global root, dialog idleConf.userCfg = usercfg @@ -48,22 +50,56 @@ def tearDownModule(): root = dialog = None -class DialogTest(unittest.TestCase): +class ConfigDialogTest(unittest.TestCase): + + def test_deactivate_current_config(self): + pass + + def activate_config_changes(self): + pass + - @mock.patch(__name__+'.dialog.destroy', new_callable=Func) - def test_cancel(self, destroy): +class ButtonTest(unittest.TestCase): + + def test_click_ok(self): + d = dialog + apply = d.apply = mock.Mock() + destroy = d.destroy = mock.Mock() + d.buttons['Ok'].invoke() + apply.assert_called_once() + destroy.assert_called_once() + del d.destroy, d.apply + + def test_click_apply(self): + d = dialog + deactivate = d.deactivate_current_config = mock.Mock() + save_ext = d.save_all_changed_extensions = mock.Mock() + activate = d.activate_config_changes = mock.Mock() + d.buttons['Apply'].invoke() + deactivate.assert_called_once() + save_ext.assert_called_once() + activate.assert_called_once() + del d.save_all_changed_extensions + del d.activate_config_changes, d.deactivate_current_config + + def test_click_cancel(self): + d = dialog + d.destroy = Func() changes['main']['something'] = 1 - dialog.cancel() + d.buttons['Cancel'].invoke() self.assertEqual(changes['main'], {}) - self.assertEqual(destroy.called, 1) + self.assertEqual(d.destroy.called, 1) + del d.destroy - @mock.patch('idlelib.configdialog.view_text', new_callable=Func) - def test_help(self, view): + def test_click_help(self): dialog.note.select(dialog.keyspage) - dialog.help() - s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click') and - s.endswith('a different name.\n')) + with mock.patch.object(configdialog, 'view_text', + new_callable=Func) as view: + dialog.buttons['Help'].invoke() + title, contents = view.kwds['title'], view.kwds['contents'] + self.assertEqual(title, 'Help for IDLE preferences') + self.assertTrue(contents.startswith('When you click') and + contents.endswith('a different name.\n')) class FontPageTest(unittest.TestCase): @@ -438,6 +474,48 @@ def click_it(start): eq(d.highlight_target.get(), elem[tag]) eq(d.set_highlight_target.called, count) + def test_highlight_sample_double_click(self): + # Test double click on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + # Test binding from configdialog. + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + # Double click is a sequence of two clicks in a row. + for _ in range(2): + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + + eq(hs.tag_ranges('sel'), ()) + + def test_highlight_sample_b1_motion(self): + # Test button motion on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + x, y, dx, dy, offset = hs.dlineinfo('1.0') + + # Test binding from configdialog. + hs.event_generate('') + hs.event_generate('') + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=dx, y=dy) + hs.event_generate('', x=dx, y=dy) + + eq(hs.tag_ranges('sel'), ()) + def test_set_theme_type(self): eq = self.assertEqual d = self.page @@ -666,8 +744,13 @@ def test_delete_custom(self): idleConf.userCfg['highlight'].SetOption(theme_name, 'name', 'value') highpage[theme_name] = {'option': 'True'} + theme_name2 = 'other theme' + idleConf.userCfg['highlight'].SetOption(theme_name2, 'name', 'value') + highpage[theme_name2] = {'option': 'False'} + # Force custom theme. - d.theme_source.set(False) + d.custom_theme_on.state(('!disabled',)) + d.custom_theme_on.invoke() d.custom_name.set(theme_name) # Cancel deletion. @@ -675,7 +758,7 @@ def test_delete_custom(self): d.button_delete_custom.invoke() eq(yesno.called, 1) eq(highpage[theme_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'highlight'), ['spam theme']) + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name, theme_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_theme_type.called, 0) @@ -685,13 +768,26 @@ def test_delete_custom(self): d.button_delete_custom.invoke() eq(yesno.called, 2) self.assertNotIn(theme_name, highpage) - eq(idleConf.GetSectionList('user', 'highlight'), []) - eq(d.custom_theme_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom themes -') + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name2]) + eq(d.custom_theme_on.state(), ()) + eq(d.custom_name.get(), theme_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_theme_type.called, 1) + # Confirm deletion of second theme - empties list. + d.custom_name.set(theme_name2) + yesno.result = True + d.button_delete_custom.invoke() + eq(yesno.called, 3) + self.assertNotIn(theme_name, highpage) + eq(idleConf.GetSectionList('user', 'highlight'), []) + eq(d.custom_theme_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom themes -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_theme_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno @@ -1059,8 +1155,13 @@ def test_delete_custom_keys(self): idleConf.userCfg['keys'].SetOption(keyset_name, 'name', 'value') keyspage[keyset_name] = {'option': 'True'} + keyset_name2 = 'other key set' + idleConf.userCfg['keys'].SetOption(keyset_name2, 'name', 'value') + keyspage[keyset_name2] = {'option': 'False'} + # Force custom keyset. - d.keyset_source.set(False) + d.custom_keyset_on.state(('!disabled',)) + d.custom_keyset_on.invoke() d.custom_name.set(keyset_name) # Cancel deletion. @@ -1068,7 +1169,7 @@ def test_delete_custom_keys(self): d.button_delete_custom_keys.invoke() eq(yesno.called, 1) eq(keyspage[keyset_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'keys'), ['spam key set']) + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name, keyset_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_keys_type.called, 0) @@ -1078,13 +1179,26 @@ def test_delete_custom_keys(self): d.button_delete_custom_keys.invoke() eq(yesno.called, 2) self.assertNotIn(keyset_name, keyspage) - eq(idleConf.GetSectionList('user', 'keys'), []) - eq(d.custom_keyset_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom keys -') + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name2]) + eq(d.custom_keyset_on.state(), ()) + eq(d.custom_name.get(), keyset_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_keys_type.called, 1) + # Confirm deletion of second keyset - empties list. + d.custom_name.set(keyset_name2) + yesno.result = True + d.button_delete_custom_keys.invoke() + eq(yesno.called, 3) + self.assertNotIn(keyset_name, keyspage) + eq(idleConf.GetSectionList('user', 'keys'), []) + eq(d.custom_keyset_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom keys -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_keys_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno diff --git a/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst new file mode 100644 index 0000000000000..2f65a00a5af3b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst @@ -0,0 +1 @@ +Add remaining configdialog tests for buttons and highlights and keys tabs. From webhook-mailer at python.org Mon Jan 27 17:35:13 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 22:35:13 -0000 Subject: [Python-checkins] bpo-30780: Add IDLE configdialog tests (GH-3592) Message-ID: https://github.com/python/cpython/commit/7b57b15bd83879ee35f8758a84a7857a9968c145 commit: 7b57b15bd83879ee35f8758a84a7857a9968c145 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-27T14:35:08-08:00 summary: bpo-30780: Add IDLE configdialog tests (GH-3592) Expose dialog buttons to test code and complete their test coverage. Complete test coverage for highlights and keys tabs. Co-authored-by: Terry Jan Reedy (cherry picked from commit dd023ad1619b6f1ab313986e8953eea32c18f50c) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/configdialog.py M Lib/idlelib/idle_test/test_configdialog.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index b7217335fe281..4d2dd6d7ff2b9 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-12-16? ====================================== +bpo-30780: Add remaining configdialog tests for buttons and +highlights and keys tabs. + bpo-39388: Settings dialog Cancel button cancels pending changes. bpo-39050: Settings dialog Help button again displays help text. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 2f95c9ccaa0c5..22359735874d1 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -149,17 +149,19 @@ def create_action_buttons(self): else: padding_args = {'padding': (6, 3)} outer = Frame(self, padding=2) - buttons = Frame(outer, padding=2) + buttons_frame = Frame(outer, padding=2) + self.buttons = {} for txt, cmd in ( ('Ok', self.ok), ('Apply', self.apply), ('Cancel', self.cancel), ('Help', self.help)): - Button(buttons, text=txt, command=cmd, takefocus=FALSE, - **padding_args).pack(side=LEFT, padx=5) + self.buttons[txt] = Button(buttons_frame, text=txt, command=cmd, + takefocus=FALSE, **padding_args) + self.buttons[txt].pack(side=LEFT, padx=5) # Add space above buttons. Frame(outer, height=2, borderwidth=0).pack(side=TOP) - buttons.pack(side=BOTTOM) + buttons_frame.pack(side=BOTTOM) return outer def ok(self): @@ -205,7 +207,6 @@ def help(self): Attributes accessed: note - Methods: view_text: Method from textview module. """ @@ -852,6 +853,7 @@ def create_page_highlight(self): text.configure( font=('courier', 12, ''), cursor='hand2', width=1, height=1, takefocus=FALSE, highlightthickness=0, wrap=NONE) + # Prevent perhaps invisible selection of word or slice. text.bind('', lambda e: 'break') text.bind('', lambda e: 'break') string_tags=( @@ -1284,8 +1286,7 @@ def save_new(self, theme_name, theme): theme_name - string, the name of the new theme theme - dictionary containing the new theme """ - if not idleConf.userCfg['highlight'].has_section(theme_name): - idleConf.userCfg['highlight'].add_section(theme_name) + idleConf.userCfg['highlight'].AddSection(theme_name) for element in theme: value = theme[element] idleConf.userCfg['highlight'].SetOption(theme_name, element, value) @@ -1730,8 +1731,7 @@ def save_new_key_set(keyset_name, keyset): keyset_name - string, the name of the new key set keyset - dictionary containing the new keybindings """ - if not idleConf.userCfg['keys'].has_section(keyset_name): - idleConf.userCfg['keys'].add_section(keyset_name) + idleConf.userCfg['keys'].AddSection(keyset_name) for event in keyset: value = keyset[event] idleConf.userCfg['keys'].SetOption(keyset_name, event, value) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 817a35217bf3c..1fea6d41df811 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -8,7 +8,7 @@ import unittest from unittest import mock from idlelib.idle_test.mock_idle import Func -from tkinter import Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL +from tkinter import (Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL) from idlelib import config from idlelib.configdialog import idleConf, changes, tracers @@ -30,6 +30,7 @@ keyspage = changes['keys'] extpage = changes['extensions'] + def setUpModule(): global root, dialog idleConf.userCfg = testcfg @@ -37,6 +38,7 @@ def setUpModule(): # root.withdraw() # Comment out, see issue 30870 dialog = configdialog.ConfigDialog(root, 'Test', _utest=True) + def tearDownModule(): global root, dialog idleConf.userCfg = usercfg @@ -48,22 +50,56 @@ def tearDownModule(): root = dialog = None -class DialogTest(unittest.TestCase): +class ConfigDialogTest(unittest.TestCase): + + def test_deactivate_current_config(self): + pass + + def activate_config_changes(self): + pass + - @mock.patch(__name__+'.dialog.destroy', new_callable=Func) - def test_cancel(self, destroy): +class ButtonTest(unittest.TestCase): + + def test_click_ok(self): + d = dialog + apply = d.apply = mock.Mock() + destroy = d.destroy = mock.Mock() + d.buttons['Ok'].invoke() + apply.assert_called_once() + destroy.assert_called_once() + del d.destroy, d.apply + + def test_click_apply(self): + d = dialog + deactivate = d.deactivate_current_config = mock.Mock() + save_ext = d.save_all_changed_extensions = mock.Mock() + activate = d.activate_config_changes = mock.Mock() + d.buttons['Apply'].invoke() + deactivate.assert_called_once() + save_ext.assert_called_once() + activate.assert_called_once() + del d.save_all_changed_extensions + del d.activate_config_changes, d.deactivate_current_config + + def test_click_cancel(self): + d = dialog + d.destroy = Func() changes['main']['something'] = 1 - dialog.cancel() + d.buttons['Cancel'].invoke() self.assertEqual(changes['main'], {}) - self.assertEqual(destroy.called, 1) + self.assertEqual(d.destroy.called, 1) + del d.destroy - @mock.patch('idlelib.configdialog.view_text', new_callable=Func) - def test_help(self, view): + def test_click_help(self): dialog.note.select(dialog.keyspage) - dialog.help() - s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click') and - s.endswith('a different name.\n')) + with mock.patch.object(configdialog, 'view_text', + new_callable=Func) as view: + dialog.buttons['Help'].invoke() + title, contents = view.kwds['title'], view.kwds['contents'] + self.assertEqual(title, 'Help for IDLE preferences') + self.assertTrue(contents.startswith('When you click') and + contents.endswith('a different name.\n')) class FontPageTest(unittest.TestCase): @@ -438,6 +474,48 @@ def click_it(start): eq(d.highlight_target.get(), elem[tag]) eq(d.set_highlight_target.called, count) + def test_highlight_sample_double_click(self): + # Test double click on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + # Test binding from configdialog. + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + # Double click is a sequence of two clicks in a row. + for _ in range(2): + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + + eq(hs.tag_ranges('sel'), ()) + + def test_highlight_sample_b1_motion(self): + # Test button motion on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + x, y, dx, dy, offset = hs.dlineinfo('1.0') + + # Test binding from configdialog. + hs.event_generate('') + hs.event_generate('') + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=dx, y=dy) + hs.event_generate('', x=dx, y=dy) + + eq(hs.tag_ranges('sel'), ()) + def test_set_theme_type(self): eq = self.assertEqual d = self.page @@ -666,8 +744,13 @@ def test_delete_custom(self): idleConf.userCfg['highlight'].SetOption(theme_name, 'name', 'value') highpage[theme_name] = {'option': 'True'} + theme_name2 = 'other theme' + idleConf.userCfg['highlight'].SetOption(theme_name2, 'name', 'value') + highpage[theme_name2] = {'option': 'False'} + # Force custom theme. - d.theme_source.set(False) + d.custom_theme_on.state(('!disabled',)) + d.custom_theme_on.invoke() d.custom_name.set(theme_name) # Cancel deletion. @@ -675,7 +758,7 @@ def test_delete_custom(self): d.button_delete_custom.invoke() eq(yesno.called, 1) eq(highpage[theme_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'highlight'), ['spam theme']) + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name, theme_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_theme_type.called, 0) @@ -685,13 +768,26 @@ def test_delete_custom(self): d.button_delete_custom.invoke() eq(yesno.called, 2) self.assertNotIn(theme_name, highpage) - eq(idleConf.GetSectionList('user', 'highlight'), []) - eq(d.custom_theme_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom themes -') + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name2]) + eq(d.custom_theme_on.state(), ()) + eq(d.custom_name.get(), theme_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_theme_type.called, 1) + # Confirm deletion of second theme - empties list. + d.custom_name.set(theme_name2) + yesno.result = True + d.button_delete_custom.invoke() + eq(yesno.called, 3) + self.assertNotIn(theme_name, highpage) + eq(idleConf.GetSectionList('user', 'highlight'), []) + eq(d.custom_theme_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom themes -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_theme_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno @@ -1059,8 +1155,13 @@ def test_delete_custom_keys(self): idleConf.userCfg['keys'].SetOption(keyset_name, 'name', 'value') keyspage[keyset_name] = {'option': 'True'} + keyset_name2 = 'other key set' + idleConf.userCfg['keys'].SetOption(keyset_name2, 'name', 'value') + keyspage[keyset_name2] = {'option': 'False'} + # Force custom keyset. - d.keyset_source.set(False) + d.custom_keyset_on.state(('!disabled',)) + d.custom_keyset_on.invoke() d.custom_name.set(keyset_name) # Cancel deletion. @@ -1068,7 +1169,7 @@ def test_delete_custom_keys(self): d.button_delete_custom_keys.invoke() eq(yesno.called, 1) eq(keyspage[keyset_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'keys'), ['spam key set']) + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name, keyset_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_keys_type.called, 0) @@ -1078,13 +1179,26 @@ def test_delete_custom_keys(self): d.button_delete_custom_keys.invoke() eq(yesno.called, 2) self.assertNotIn(keyset_name, keyspage) - eq(idleConf.GetSectionList('user', 'keys'), []) - eq(d.custom_keyset_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom keys -') + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name2]) + eq(d.custom_keyset_on.state(), ()) + eq(d.custom_name.get(), keyset_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_keys_type.called, 1) + # Confirm deletion of second keyset - empties list. + d.custom_name.set(keyset_name2) + yesno.result = True + d.button_delete_custom_keys.invoke() + eq(yesno.called, 3) + self.assertNotIn(keyset_name, keyspage) + eq(idleConf.GetSectionList('user', 'keys'), []) + eq(d.custom_keyset_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom keys -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_keys_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno diff --git a/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst new file mode 100644 index 0000000000000..2f65a00a5af3b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst @@ -0,0 +1 @@ +Add remaining configdialog tests for buttons and highlights and keys tabs. From webhook-mailer at python.org Mon Jan 27 18:41:25 2020 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 27 Jan 2020 23:41:25 -0000 Subject: [Python-checkins] bpo-39392: Turtle overlap fill depends on OS (#18223) Message-ID: https://github.com/python/cpython/commit/2824c45a0a020f12f27da7e7162e8636c21bf869 commit: 2824c45a0a020f12f27da7e7162e8636c21bf869 branch: master author: Terry Jan Reedy committer: GitHub date: 2020-01-27T18:41:18-05:00 summary: bpo-39392: Turtle overlap fill depends on OS (#18223) Whether or not overlap regions for self-intersecting polygons or multiple shapes are filled depends on the operating system graphics, typeof overlap, and number of overlaps. files: A Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst M Doc/library/turtle.rst diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 7f9f0c3438679..fed85045435b1 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1051,6 +1051,11 @@ Filling Fill the shape drawn after the last call to :func:`begin_fill`. + Whether or not overlap regions for self-intersecting polygons + or multiple shapes are filled depends on the operating system graphics, + type of overlap, and number of overlaps. For example, the Turtle star + above may be either all yellow or have some white regions. + .. doctest:: :skipif: _tkinter is None diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst new file mode 100644 index 0000000000000..715874981f735 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst @@ -0,0 +1 @@ +Explain that when filling with turtle, overlap regions may be left unfilled. From webhook-mailer at python.org Mon Jan 27 18:46:32 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 23:46:32 -0000 Subject: [Python-checkins] bpo-39392: Turtle overlap fill depends on OS (GH-18223) Message-ID: https://github.com/python/cpython/commit/005b0596326cf1b4f17e8d38bfc3887d4486e564 commit: 005b0596326cf1b4f17e8d38bfc3887d4486e564 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-27T15:46:25-08:00 summary: bpo-39392: Turtle overlap fill depends on OS (GH-18223) Whether or not overlap regions for self-intersecting polygons or multiple shapes are filled depends on the operating system graphics, typeof overlap, and number of overlaps. (cherry picked from commit 2824c45a0a020f12f27da7e7162e8636c21bf869) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst M Doc/library/turtle.rst diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 5d7f0608aebb7..82be362005d75 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1013,6 +1013,11 @@ Filling Fill the shape drawn after the last call to :func:`begin_fill`. + Whether or not overlap regions for self-intersecting polygons + or multiple shapes are filled depends on the operating system graphics, + type of overlap, and number of overlaps. For example, the Turtle star + above may be either all yellow or have some white regions. + .. doctest:: >>> turtle.color("black", "red") diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst new file mode 100644 index 0000000000000..715874981f735 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst @@ -0,0 +1 @@ +Explain that when filling with turtle, overlap regions may be left unfilled. From webhook-mailer at python.org Mon Jan 27 18:46:34 2020 From: webhook-mailer at python.org (Giampaolo Rodola) Date: Mon, 27 Jan 2020 23:46:34 -0000 Subject: [Python-checkins] [3.8] bpo-39390 shutil: fix argument types for ignore callback (GH-18122) Message-ID: https://github.com/python/cpython/commit/cf9d00554715febf21cf94950da4f42723b80498 commit: cf9d00554715febf21cf94950da4f42723b80498 branch: 3.8 author: mbarkhau committer: Giampaolo Rodola date: 2020-01-28T00:46:29+01:00 summary: [3.8] bpo-39390 shutil: fix argument types for ignore callback (GH-18122) files: A Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst M Doc/whatsnew/3.8.rst M Lib/shutil.py M Lib/test/test_shutil.py diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7bc91a9fc19bf..007e3228f9ae6 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2216,3 +2216,10 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) + +Notable changes in Python 3.8.2 +=============================== + +Fixed a regression with the ``ignore`` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. +(Contributed by Manuel Barkhau and Giampaolo Rodola in :issue:`39390`.) diff --git a/Lib/shutil.py b/Lib/shutil.py index 755ce392e6d9a..cde7b860050a2 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -442,7 +442,7 @@ def _ignore_patterns(path, names): def _copytree(entries, src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks, dirs_exist_ok=False): if ignore is not None: - ignored_names = ignore(src, {x.name for x in entries}) + ignored_names = ignore(os.fspath(src), [x.name for x in entries]) else: ignored_names = set() diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 286e333a8aa9c..bcb7e498e198e 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -880,6 +880,48 @@ def _filter(src, names): shutil.rmtree(src_dir) shutil.rmtree(os.path.dirname(dst_dir)) + def test_copytree_arg_types_of_ignore(self): + join = os.path.join + exists = os.path.exists + + tmp_dir = self.mkdtemp() + src_dir = join(tmp_dir, "source") + + os.mkdir(join(src_dir)) + os.mkdir(join(src_dir, 'test_dir')) + os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) + write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + + invokations = [] + + def _ignore(src, names): + invokations.append(src) + self.assertIsInstance(src, str) + self.assertIsInstance(names, list) + self.assertEqual(len(names), len(set(names))) + for name in names: + self.assertIsInstance(name, str) + return [] + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(src_dir, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + src_dir_entry = list(os.scandir(tmp_dir))[0] + self.assertIsInstance(src_dir_entry, os.DirEntry) + shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + self.assertEqual(len(invokations), 9) + def test_copytree_retains_permissions(self): tmp_dir = tempfile.mkdtemp() src_dir = os.path.join(tmp_dir, 'source') diff --git a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst new file mode 100644 index 0000000000000..ffa961ea4cd22 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst @@ -0,0 +1,2 @@ +Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. From webhook-mailer at python.org Mon Jan 27 18:47:13 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 27 Jan 2020 23:47:13 -0000 Subject: [Python-checkins] bpo-39392: Turtle overlap fill depends on OS (GH-18223) Message-ID: https://github.com/python/cpython/commit/b487a8ed5bd267d62a05c3cab7def6b1f36999ea commit: b487a8ed5bd267d62a05c3cab7def6b1f36999ea branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-27T15:47:08-08:00 summary: bpo-39392: Turtle overlap fill depends on OS (GH-18223) Whether or not overlap regions for self-intersecting polygons or multiple shapes are filled depends on the operating system graphics, typeof overlap, and number of overlaps. (cherry picked from commit 2824c45a0a020f12f27da7e7162e8636c21bf869) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst M Doc/library/turtle.rst diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 7f9f0c3438679..fed85045435b1 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1051,6 +1051,11 @@ Filling Fill the shape drawn after the last call to :func:`begin_fill`. + Whether or not overlap regions for self-intersecting polygons + or multiple shapes are filled depends on the operating system graphics, + type of overlap, and number of overlaps. For example, the Turtle star + above may be either all yellow or have some white regions. + .. doctest:: :skipif: _tkinter is None diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst new file mode 100644 index 0000000000000..715874981f735 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst @@ -0,0 +1 @@ +Explain that when filling with turtle, overlap regions may be left unfilled. From webhook-mailer at python.org Mon Jan 27 19:50:41 2020 From: webhook-mailer at python.org (Brian Quinlan) Date: Tue, 28 Jan 2020 00:50:41 -0000 Subject: [Python-checkins] bpo-39205: Tests that highlight a hang on ProcessPoolExecutor shutdown (#18221) Message-ID: https://github.com/python/cpython/commit/884eb89d4a5cc8e023deaa65001dfa74a436694c commit: 884eb89d4a5cc8e023deaa65001dfa74a436694c branch: master author: Brian Quinlan committer: GitHub date: 2020-01-27T16:50:37-08:00 summary: bpo-39205: Tests that highlight a hang on ProcessPoolExecutor shutdown (#18221) files: M Lib/test/test_concurrent_futures.py diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index c97351636e869..c8fa35e9eeafa 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -342,6 +342,26 @@ def test_hang_issue12364(self): for f in fs: f.result() + def test_hang_issue39205(self): + """shutdown(wait=False) doesn't hang at exit with running futures. + + See https://bugs.python.org/issue39205. + """ + if self.executor_type == futures.ProcessPoolExecutor: + raise unittest.SkipTest( + "Hangs due to https://bugs.python.org/issue39205") + + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import {executor_type} + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = {executor_type}(max_workers=3) + t.submit(sleep_and_print, 1.0, "apple") + t.shutdown(wait=False) + """.format(executor_type=self.executor_type.__name__)) + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase): def _prime_executor(self): From webhook-mailer at python.org Mon Jan 27 21:31:55 2020 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 28 Jan 2020 02:31:55 -0000 Subject: [Python-checkins] bpo-36018: Minor fixes to the NormalDist() examples and recipes. (GH-18226) Message-ID: https://github.com/python/cpython/commit/01bf2196d842fc20667c5336e0a7a77eb4fdc25c commit: 01bf2196d842fc20667c5336e0a7a77eb4fdc25c branch: master author: Raymond Hettinger committer: GitHub date: 2020-01-27T18:31:46-08:00 summary: bpo-36018: Minor fixes to the NormalDist() examples and recipes. (GH-18226) * Change the source for the SAT data to a primary source. * Fix typo in the standard deviation * Clarify that the binomial probabalities are just for the Python room. files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 09b02cabf21f8..026f4aa462d3d 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -734,10 +734,10 @@ of applications in statistics. :class:`NormalDist` readily solves classic probability problems. For example, given `historical data for SAT exams -`_ showing that scores -are normally distributed with a mean of 1060 and a standard deviation of 192, -determine the percentage of students with test scores between 1100 and -1200, after rounding to the nearest whole number: +`_ showing +that scores are normally distributed with a mean of 1060 and a standard +deviation of 195, determine the percentage of students with test scores +between 1100 and 1200, after rounding to the nearest whole number: .. doctest:: @@ -781,7 +781,7 @@ For example, an open source conference has 750 attendees and two rooms with a 500 person capacity. There is a talk about Python and another about Ruby. In previous conferences, 65% of the attendees preferred to listen to Python talks. Assuming the population preferences haven't changed, what is the -probability that the rooms will stay within their capacity limits? +probability that the Python room will stay within its capacity limits? .. doctest:: From webhook-mailer at python.org Mon Jan 27 21:37:50 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 28 Jan 2020 02:37:50 -0000 Subject: [Python-checkins] bpo-38644: Pass tstate in ceval.c (GH-18222) Message-ID: https://github.com/python/cpython/commit/61f4db8c56ca4b7e60050d96ecc255cfb03d92a0 commit: 61f4db8c56ca4b7e60050d96ecc255cfb03d92a0 branch: master author: Victor Stinner committer: GitHub date: 2020-01-28T03:37:45+01:00 summary: bpo-38644: Pass tstate in ceval.c (GH-18222) Pass explicitly the Python thread state (tstate) in ceval.c. files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index 673b401e6aba3..2c0a23dfdd291 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2138,7 +2138,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *val = POP(); PyObject *tb = POP(); assert(PyExceptionClass_Check(exc)); - PyErr_Restore(exc, val, tb); + _PyErr_Restore(tstate, exc, val, tb); goto exception_unwind; } @@ -2640,7 +2640,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && (iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable))) { - PyErr_Clear(); + _PyErr_Clear(tstate); _PyErr_Format(tstate, PyExc_TypeError, "Value after * must be an iterable, not %.200s", Py_TYPE(iterable)->tp_name); @@ -4340,7 +4340,7 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) } _PyErr_SetObject(tstate, type, value); - /* PyErr_SetObject incref's its arguments */ + /* _PyErr_SetObject incref's its arguments */ Py_DECREF(value); Py_DECREF(type); return 0; @@ -5208,7 +5208,7 @@ check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args) /* check_args_iterable() may be called with a live exception: * clear it to prevent calling _PyObject_FunctionStr() with an * exception set. */ - PyErr_Clear(); + _PyErr_Clear(tstate); PyObject *funcstr = _PyObject_FunctionStr(func); if (funcstr != NULL) { _PyErr_Format(tstate, PyExc_TypeError, @@ -5231,7 +5231,7 @@ format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) * is not a mapping. */ if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - PyErr_Clear(); + _PyErr_Clear(tstate); PyObject *funcstr = _PyObject_FunctionStr(func); if (funcstr != NULL) { _PyErr_Format( @@ -5245,7 +5245,7 @@ format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) { - PyErr_Clear(); + _PyErr_Clear(tstate); PyObject *funcstr = _PyObject_FunctionStr(func); if (funcstr != NULL) { PyObject *key = PyTuple_GET_ITEM(val, 0); From webhook-mailer at python.org Mon Jan 27 22:40:19 2020 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 28 Jan 2020 03:40:19 -0000 Subject: [Python-checkins] bpo-36018: Minor fixes to the NormalDist() examples and recipes. (GH-18226) (GH-18227) Message-ID: https://github.com/python/cpython/commit/41f4dc3bcf30cb8362a062a26818311c704ea89f commit: 41f4dc3bcf30cb8362a062a26818311c704ea89f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2020-01-27T19:40:14-08:00 summary: bpo-36018: Minor fixes to the NormalDist() examples and recipes. (GH-18226) (GH-18227) * Change the source for the SAT data to a primary source. * Fix typo in the standard deviation * Clarify that the binomial probabalities are just for the Python room. (cherry picked from commit 01bf2196d842fc20667c5336e0a7a77eb4fdc25c) Co-authored-by: Raymond Hettinger Co-authored-by: Raymond Hettinger files: M Doc/library/statistics.rst diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 09b02cabf21f8..026f4aa462d3d 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -734,10 +734,10 @@ of applications in statistics. :class:`NormalDist` readily solves classic probability problems. For example, given `historical data for SAT exams -`_ showing that scores -are normally distributed with a mean of 1060 and a standard deviation of 192, -determine the percentage of students with test scores between 1100 and -1200, after rounding to the nearest whole number: +`_ showing +that scores are normally distributed with a mean of 1060 and a standard +deviation of 195, determine the percentage of students with test scores +between 1100 and 1200, after rounding to the nearest whole number: .. doctest:: @@ -781,7 +781,7 @@ For example, an open source conference has 750 attendees and two rooms with a 500 person capacity. There is a talk about Python and another about Ruby. In previous conferences, 65% of the attendees preferred to listen to Python talks. Assuming the population preferences haven't changed, what is the -probability that the rooms will stay within their capacity limits? +probability that the Python room will stay within its capacity limits? .. doctest:: From webhook-mailer at python.org Tue Jan 28 04:42:12 2020 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 28 Jan 2020 09:42:12 -0000 Subject: [Python-checkins] bpo-38883: Don't use POSIX `$HOME` in `pathlib.Path.home/expanduser` on Windows (GH-17961) Message-ID: https://github.com/python/cpython/commit/c45a2aa9e255b5c7c211faa79f6b23895b64ab27 commit: c45a2aa9e255b5c7c211faa79f6b23895b64ab27 branch: master author: Christoph Reiter committer: Steve Dower date: 2020-01-28T20:41:50+11:00 summary: bpo-38883: Don't use POSIX `$HOME` in `pathlib.Path.home/expanduser` on Windows (GH-17961) In bpo-36264 os.path.expanduser was changed to ignore HOME on Windows. Path.expanduser/home still honored HOME despite being documented as behaving the same as os.path.expanduser. This makes them also ignore HOME so that both implementations behave the same way again. files: A Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 7d1d1150b0da8..a5f3313902e1b 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -253,9 +253,7 @@ def make_uri(self, path): return 'file:' + urlquote_from_bytes(path.as_posix().encode('utf-8')) def gethomedir(self, username): - if 'HOME' in os.environ: - userhome = os.environ['HOME'] - elif 'USERPROFILE' in os.environ: + if 'USERPROFILE' in os.environ: userhome = os.environ['USERPROFILE'] elif 'HOMEPATH' in os.environ: try: diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3232649f55477..a50dce0171808 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1383,8 +1383,16 @@ def _test_home(self, p): self.assertTrue(p.is_absolute()) def test_home(self): - p = self.cls.home() - self._test_home(p) + with support.EnvironmentVarGuard() as env: + self._test_home(self.cls.home()) + + env.clear() + env['USERPROFILE'] = os.path.join(BASE, 'userprofile') + self._test_home(self.cls.home()) + + # bpo-38883: ignore `HOME` when set on windows + env['HOME'] = os.path.join(BASE, 'home') + self._test_home(self.cls.home()) def test_samefile(self): fileA_path = os.path.join(BASE, 'fileA') @@ -2448,12 +2456,6 @@ def check(): self.assertEqual(p5.expanduser(), p5) self.assertEqual(p6.expanduser(), p6) - # Test the first lookup key in the env vars. - env['HOME'] = 'C:\\Users\\alice' - check() - - # Test that HOMEPATH is available instead. - env.pop('HOME', None) env['HOMEPATH'] = 'C:\\Users\\alice' check() @@ -2466,6 +2468,10 @@ def check(): env['USERPROFILE'] = 'C:\\Users\\alice' check() + # bpo-38883: ignore `HOME` when set on windows + env['HOME'] = 'C:\\Users\\eve' + check() + class CompatiblePathTest(unittest.TestCase): """ diff --git a/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst b/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst new file mode 100644 index 0000000000000..c552e850a3684 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst @@ -0,0 +1,5 @@ +:meth:`~pathlib.Path.home()` and :meth:`~pathlib.Path.expanduser()` on Windows +now prefer :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not +normally set for regular user accounts. This makes them again behave like +:func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in 3.8, +see :issue:`36264`. From webhook-mailer at python.org Tue Jan 28 04:42:47 2020 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 28 Jan 2020 09:42:47 -0000 Subject: [Python-checkins] bpo-39393: Misleading error message on dependent DLL resolution failure (GH-18093) Message-ID: https://github.com/python/cpython/commit/13c1c3556f2c12d0be2af890fabfbf44280b845c commit: 13c1c3556f2c12d0be2af890fabfbf44280b845c branch: master author: Zackery Spytz committer: Steve Dower date: 2020-01-28T20:42:43+11:00 summary: bpo-39393: Misleading error message on dependent DLL resolution failure (GH-18093) files: A Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst M Modules/_ctypes/callproc.c diff --git a/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst b/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst new file mode 100644 index 0000000000000..025b7e96a6e74 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst @@ -0,0 +1,2 @@ +Improve the error message when attempting to load a DLL with unresolved +dependencies. diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 7b13fa041a205..65c6eb15a298b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1311,8 +1311,9 @@ static PyObject *load_library(PyObject *self, PyObject *args) if (err == ERROR_MOD_NOT_FOUND) { PyErr_Format(PyExc_FileNotFoundError, - ("Could not find module '%.500S'. Try using " - "the full path with constructor syntax."), + ("Could not find module '%.500S' (or one of its " + "dependencies). Try using the full path with " + "constructor syntax."), nameobj); return NULL; } else if (err) { From webhook-mailer at python.org Tue Jan 28 04:59:48 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 Jan 2020 09:59:48 -0000 Subject: [Python-checkins] bpo-38883: Don't use POSIX `$HOME` in `pathlib.Path.home/expanduser` on Windows (GH-17961) Message-ID: https://github.com/python/cpython/commit/595b516965ee88b817dc1b3d7713e1f3f263634d commit: 595b516965ee88b817dc1b3d7713e1f3f263634d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-28T01:59:43-08:00 summary: bpo-38883: Don't use POSIX `$HOME` in `pathlib.Path.home/expanduser` on Windows (GH-17961) In bpo-36264 os.path.expanduser was changed to ignore HOME on Windows. Path.expanduser/home still honored HOME despite being documented as behaving the same as os.path.expanduser. This makes them also ignore HOME so that both implementations behave the same way again. (cherry picked from commit c45a2aa9e255b5c7c211faa79f6b23895b64ab27) Co-authored-by: Christoph Reiter files: A Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 8ed3c883c6006..015370a860e65 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -253,9 +253,7 @@ def make_uri(self, path): return 'file:' + urlquote_from_bytes(path.as_posix().encode('utf-8')) def gethomedir(self, username): - if 'HOME' in os.environ: - userhome = os.environ['HOME'] - elif 'USERPROFILE' in os.environ: + if 'USERPROFILE' in os.environ: userhome = os.environ['USERPROFILE'] elif 'HOMEPATH' in os.environ: try: diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index b127343982ca9..97fc5d8ad7838 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1296,8 +1296,16 @@ def _test_home(self, p): self.assertTrue(p.is_absolute()) def test_home(self): - p = self.cls.home() - self._test_home(p) + with support.EnvironmentVarGuard() as env: + self._test_home(self.cls.home()) + + env.clear() + env['USERPROFILE'] = os.path.join(BASE, 'userprofile') + self._test_home(self.cls.home()) + + # bpo-38883: ignore `HOME` when set on windows + env['HOME'] = os.path.join(BASE, 'home') + self._test_home(self.cls.home()) def test_samefile(self): fileA_path = os.path.join(BASE, 'fileA') @@ -2348,12 +2356,6 @@ def check(): self.assertEqual(p5.expanduser(), p5) self.assertEqual(p6.expanduser(), p6) - # Test the first lookup key in the env vars. - env['HOME'] = 'C:\\Users\\alice' - check() - - # Test that HOMEPATH is available instead. - env.pop('HOME', None) env['HOMEPATH'] = 'C:\\Users\\alice' check() @@ -2366,6 +2368,10 @@ def check(): env['USERPROFILE'] = 'C:\\Users\\alice' check() + # bpo-38883: ignore `HOME` when set on windows + env['HOME'] = 'C:\\Users\\eve' + check() + class CompatiblePathTest(unittest.TestCase): """ diff --git a/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst b/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst new file mode 100644 index 0000000000000..c552e850a3684 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst @@ -0,0 +1,5 @@ +:meth:`~pathlib.Path.home()` and :meth:`~pathlib.Path.expanduser()` on Windows +now prefer :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not +normally set for regular user accounts. This makes them again behave like +:func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in 3.8, +see :issue:`36264`. From webhook-mailer at python.org Tue Jan 28 05:00:21 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 Jan 2020 10:00:21 -0000 Subject: [Python-checkins] bpo-39393: Misleading error message on dependent DLL resolution failure (GH-18093) Message-ID: https://github.com/python/cpython/commit/46735c7e101753769e31c69a36d0030bb056a162 commit: 46735c7e101753769e31c69a36d0030bb056a162 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-28T02:00:16-08:00 summary: bpo-39393: Misleading error message on dependent DLL resolution failure (GH-18093) (cherry picked from commit 13c1c3556f2c12d0be2af890fabfbf44280b845c) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst M Modules/_ctypes/callproc.c diff --git a/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst b/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst new file mode 100644 index 0000000000000..025b7e96a6e74 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst @@ -0,0 +1,2 @@ +Improve the error message when attempting to load a DLL with unresolved +dependencies. diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 77492e650ea48..4027bdb622750 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1311,8 +1311,9 @@ static PyObject *load_library(PyObject *self, PyObject *args) if (err == ERROR_MOD_NOT_FOUND) { PyErr_Format(PyExc_FileNotFoundError, - ("Could not find module '%.500S'. Try using " - "the full path with constructor syntax."), + ("Could not find module '%.500S' (or one of its " + "dependencies). Try using the full path with " + "constructor syntax."), nameobj); return NULL; } else if (err) { From webhook-mailer at python.org Tue Jan 28 05:12:35 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 28 Jan 2020 10:12:35 -0000 Subject: [Python-checkins] bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Message-ID: https://github.com/python/cpython/commit/148610d88a2785751ed435a4e60f07a9f1bc50a6 commit: 148610d88a2785751ed435a4e60f07a9f1bc50a6 branch: master author: Inada Naoki committer: GitHub date: 2020-01-28T19:12:31+09:00 summary: bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Co-Authored-By: Kyle Stanley files: M Doc/using/cmdline.rst M Doc/using/windows.rst diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 146003b147131..fb88673d30b1b 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -929,8 +929,6 @@ conflict. Also available as the :option:`-X` ``utf8`` option. - .. availability:: \*nix. - .. versionadded:: 3.7 See :pep:`540` for more details. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 4912048a1ab55..97e9cdfeb0939 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -602,6 +602,50 @@ existed):: C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9 +.. _win-utf8-mode: + +UTF-8 mode +========== + +.. versionadded:: 3.7 + +Windows still uses legacy encodings for the system encoding (the ANSI Code +Page). Python uses it for the default encoding of text files (e.g. +:func:`locale.getpreferredencoding`). + +This may cause issues because UTF-8 is widely used on the internet +and most Unix systems, including WSL (Windows Subsystem for Linux). + +You can use UTF-8 mode to change the default text encoding to UTF-8. +You can enable UTF-8 mode via the ``-X utf8`` command line option, or +the ``PYTHONUTF8=1`` environment variable. See :envvar:`PYTHONUTF8` for +enabling UTF-8 mode, and :ref:`setting-envvars` for how to modify +environment variables. + +When UTF-8 mode is enabled: + +* :func:`locale.getpreferredencoding` returns ``'UTF-8'`` instead of + the system encoding. This function is used for the default text + encoding in many places, including :func:`open`, :class:`Popen`, + :meth:`Path.read_text`, etc. +* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` + all use UTF-8 as their text encoding. +* You can still use the system encoding via the "mbcs" codec. + +Note that adding ``PYTHONUTF8=1`` to the default environment variables +will affect all Python 3.7+ applications on your system. +If you have any Python 3.7+ applications which rely on the legacy +system encoding, it is recommended to set the environment variable +temporarily or use the ``-X utf8`` command line option. + +.. note:: + Even when UTF-8 mode is disabled, Python uses UTF-8 by default + on Windows for: + + * Console I/O including standard I/O (see :pep:`528` for details). + * The filesystem encoding (see :pep:`529` for details). + + .. _launcher: Python Launcher for Windows From webhook-mailer at python.org Tue Jan 28 05:17:31 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 Jan 2020 10:17:31 -0000 Subject: [Python-checkins] bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Message-ID: https://github.com/python/cpython/commit/5a49ccac443ae84b8e142473a659c73032e9fe53 commit: 5a49ccac443ae84b8e142473a659c73032e9fe53 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-28T02:17:20-08:00 summary: bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Co-Authored-By: Kyle Stanley (cherry picked from commit 148610d88a2785751ed435a4e60f07a9f1bc50a6) Co-authored-by: Inada Naoki files: M Doc/using/cmdline.rst M Doc/using/windows.rst diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 2c34ac29b68f2..6a1d7aa00d082 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -908,8 +908,6 @@ conflict. Also available as the :option:`-X` ``utf8`` option. - .. availability:: \*nix. - .. versionadded:: 3.7 See :pep:`540` for more details. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index bcc618ca143b3..f5dddb5a37af8 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -605,6 +605,50 @@ existed):: C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.7 +.. _win-utf8-mode: + +UTF-8 mode +========== + +.. versionadded:: 3.7 + +Windows still uses legacy encodings for the system encoding (the ANSI Code +Page). Python uses it for the default encoding of text files (e.g. +:func:`locale.getpreferredencoding`). + +This may cause issues because UTF-8 is widely used on the internet +and most Unix systems, including WSL (Windows Subsystem for Linux). + +You can use UTF-8 mode to change the default text encoding to UTF-8. +You can enable UTF-8 mode via the ``-X utf8`` command line option, or +the ``PYTHONUTF8=1`` environment variable. See :envvar:`PYTHONUTF8` for +enabling UTF-8 mode, and :ref:`setting-envvars` for how to modify +environment variables. + +When UTF-8 mode is enabled: + +* :func:`locale.getpreferredencoding` returns ``'UTF-8'`` instead of + the system encoding. This function is used for the default text + encoding in many places, including :func:`open`, :class:`Popen`, + :meth:`Path.read_text`, etc. +* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` + all use UTF-8 as their text encoding. +* You can still use the system encoding via the "mbcs" codec. + +Note that adding ``PYTHONUTF8=1`` to the default environment variables +will affect all Python 3.7+ applications on your system. +If you have any Python 3.7+ applications which rely on the legacy +system encoding, it is recommended to set the environment variable +temporarily or use the ``-X utf8`` command line option. + +.. note:: + Even when UTF-8 mode is disabled, Python uses UTF-8 by default + on Windows for: + + * Console I/O including standard I/O (see :pep:`528` for details). + * The filesystem encoding (see :pep:`529` for details). + + .. _launcher: Python Launcher for Windows From webhook-mailer at python.org Tue Jan 28 05:18:14 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 Jan 2020 10:18:14 -0000 Subject: [Python-checkins] bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Message-ID: https://github.com/python/cpython/commit/cee5da861091cdaca99f0636af7ab8c4b0274e5f commit: cee5da861091cdaca99f0636af7ab8c4b0274e5f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-28T02:18:09-08:00 summary: bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Co-Authored-By: Kyle Stanley (cherry picked from commit 148610d88a2785751ed435a4e60f07a9f1bc50a6) Co-authored-by: Inada Naoki files: M Doc/using/cmdline.rst M Doc/using/windows.rst diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index c30f6fc7cfd87..53206c7b54649 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -936,8 +936,6 @@ conflict. Also available as the :option:`-X` ``utf8`` option. - .. availability:: \*nix. - .. versionadded:: 3.7 See :pep:`540` for more details. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 9dc3e796cc211..636f48dfb012b 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -602,6 +602,50 @@ existed):: C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.8 +.. _win-utf8-mode: + +UTF-8 mode +========== + +.. versionadded:: 3.7 + +Windows still uses legacy encodings for the system encoding (the ANSI Code +Page). Python uses it for the default encoding of text files (e.g. +:func:`locale.getpreferredencoding`). + +This may cause issues because UTF-8 is widely used on the internet +and most Unix systems, including WSL (Windows Subsystem for Linux). + +You can use UTF-8 mode to change the default text encoding to UTF-8. +You can enable UTF-8 mode via the ``-X utf8`` command line option, or +the ``PYTHONUTF8=1`` environment variable. See :envvar:`PYTHONUTF8` for +enabling UTF-8 mode, and :ref:`setting-envvars` for how to modify +environment variables. + +When UTF-8 mode is enabled: + +* :func:`locale.getpreferredencoding` returns ``'UTF-8'`` instead of + the system encoding. This function is used for the default text + encoding in many places, including :func:`open`, :class:`Popen`, + :meth:`Path.read_text`, etc. +* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` + all use UTF-8 as their text encoding. +* You can still use the system encoding via the "mbcs" codec. + +Note that adding ``PYTHONUTF8=1`` to the default environment variables +will affect all Python 3.7+ applications on your system. +If you have any Python 3.7+ applications which rely on the legacy +system encoding, it is recommended to set the environment variable +temporarily or use the ``-X utf8`` command line option. + +.. note:: + Even when UTF-8 mode is disabled, Python uses UTF-8 by default + on Windows for: + + * Console I/O including standard I/O (see :pep:`528` for details). + * The filesystem encoding (see :pep:`529` for details). + + .. _launcher: Python Launcher for Windows From webhook-mailer at python.org Tue Jan 28 05:29:21 2020 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 28 Jan 2020 10:29:21 -0000 Subject: [Python-checkins] bpo-38092: Reduce overhead when using multiprocessing in a Windows virtual environment (GH-16098) Message-ID: https://github.com/python/cpython/commit/6990d1b6131873c7f0913908162e4c723d00ea19 commit: 6990d1b6131873c7f0913908162e4c723d00ea19 branch: 3.7 author: Adam Meily committer: Steve Dower date: 2020-01-28T21:29:16+11:00 summary: bpo-38092: Reduce overhead when using multiprocessing in a Windows virtual environment (GH-16098) files: A Misc/NEWS.d/next/Windows/2020-01-24-03-07-14.bpo-39439.rwMWDR.rst M Lib/multiprocessing/popen_spawn_win32.py diff --git a/Lib/multiprocessing/popen_spawn_win32.py b/Lib/multiprocessing/popen_spawn_win32.py index e01953d32b7a4..d9442094909bd 100644 --- a/Lib/multiprocessing/popen_spawn_win32.py +++ b/Lib/multiprocessing/popen_spawn_win32.py @@ -69,7 +69,7 @@ def __init__(self, process_obj): try: hp, ht, pid, tid = _winapi.CreateProcess( python_exe, cmd, - env, None, False, 0, None, None, None) + None, None, False, 0, env, None, None) _winapi.CloseHandle(ht) except: _winapi.CloseHandle(rhandle) diff --git a/Misc/NEWS.d/next/Windows/2020-01-24-03-07-14.bpo-39439.rwMWDR.rst b/Misc/NEWS.d/next/Windows/2020-01-24-03-07-14.bpo-39439.rwMWDR.rst new file mode 100644 index 0000000000000..d64e63757728a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-24-03-07-14.bpo-39439.rwMWDR.rst @@ -0,0 +1 @@ +Reduce overhead when using multiprocessing in a Windows virtual environment \ No newline at end of file From webhook-mailer at python.org Tue Jan 28 05:34:27 2020 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 28 Jan 2020 10:34:27 -0000 Subject: [Python-checkins] bpo-39439: Fix multiprocessing spawn path in a venv on Windows (GH-18158) Message-ID: https://github.com/python/cpython/commit/0be3246d4f9c8eddcd55491901d95b09fe163f15 commit: 0be3246d4f9c8eddcd55491901d95b09fe163f15 branch: master author: Adam Meily committer: Steve Dower date: 2020-01-28T21:34:23+11:00 summary: bpo-39439: Fix multiprocessing spawn path in a venv on Windows (GH-18158) files: A Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst M Lib/multiprocessing/spawn.py diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index 075f3455478b5..7cc129e261076 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -36,7 +36,7 @@ if WINSERVICE: _python_exe = os.path.join(sys.exec_prefix, 'python.exe') else: - _python_exe = sys._base_executable + _python_exe = sys.executable def set_executable(exe): global _python_exe diff --git a/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst b/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst new file mode 100644 index 0000000000000..d677c4c3e02d5 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst @@ -0,0 +1 @@ +Honor the Python path when a virtualenv is active on Windows. \ No newline at end of file From webhook-mailer at python.org Tue Jan 28 05:52:51 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 28 Jan 2020 10:52:51 -0000 Subject: [Python-checkins] bpo-39439: Fix multiprocessing spawn path in a venv on Windows (GH-18158) Message-ID: https://github.com/python/cpython/commit/dbb37aac1428ddcba784d9ddc77c1708c391aa80 commit: dbb37aac1428ddcba784d9ddc77c1708c391aa80 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-28T02:52:47-08:00 summary: bpo-39439: Fix multiprocessing spawn path in a venv on Windows (GH-18158) (cherry picked from commit 0be3246d4f9c8eddcd55491901d95b09fe163f15) Co-authored-by: Adam Meily files: A Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst M Lib/multiprocessing/spawn.py diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index 075f3455478b5..7cc129e261076 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -36,7 +36,7 @@ if WINSERVICE: _python_exe = os.path.join(sys.exec_prefix, 'python.exe') else: - _python_exe = sys._base_executable + _python_exe = sys.executable def set_executable(exe): global _python_exe diff --git a/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst b/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst new file mode 100644 index 0000000000000..d677c4c3e02d5 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst @@ -0,0 +1 @@ +Honor the Python path when a virtualenv is active on Windows. \ No newline at end of file From webhook-mailer at python.org Tue Jan 28 07:47:23 2020 From: webhook-mailer at python.org (Inada Naoki) Date: Tue, 28 Jan 2020 12:47:23 -0000 Subject: [Python-checkins] bpo-36350: inspect: Replace OrderedDict with dict. (GH-12412) Message-ID: https://github.com/python/cpython/commit/2cca8efe46935c39c445f585bce54954fad2485b commit: 2cca8efe46935c39c445f585bce54954fad2485b branch: master author: R?mi Lapeyre committer: Inada Naoki date: 2020-01-28T21:47:03+09:00 summary: bpo-36350: inspect: Replace OrderedDict with dict. (GH-12412) files: A Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst M Doc/library/inspect.rst M Lib/inspect.py M Lib/test/test_inspect.py diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index bab2c41e4e224..9b9bc99f43d48 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -624,15 +624,18 @@ function. .. attribute:: Signature.parameters - An ordered mapping of parameters' names to the corresponding - :class:`Parameter` objects. Parameters appear in strict definition - order, including keyword-only parameters. + An dictionary of :class:`Parameter` objects. Parameters appear in strict + definition order, including keyword-only parameters. .. versionchanged:: 3.7 Python only explicitly guaranteed that it preserved the declaration order of keyword-only parameters as of version 3.7, although in practice this order had always been preserved in Python 3. + .. versionchanged:: 3.9 + :attr:`parameters` is now of type :class:`dict`. Formerly, it was of + type :class:`collections.OrderedDict`. + .. attribute:: Signature.return_annotation The "return" annotation for the callable. If the callable has no "return" @@ -821,10 +824,9 @@ function. .. attribute:: BoundArguments.arguments - An ordered, mutable mapping (:class:`collections.OrderedDict`) of - parameters' names to arguments' values. Contains only explicitly bound - arguments. Changes in :attr:`arguments` will reflect in :attr:`args` and - :attr:`kwargs`. + An ordered, mutable mapping of parameters' names to arguments' values. + Contains only explicitly bound arguments. Changes in :attr:`arguments` + will reflect in :attr:`args` and :attr:`kwargs`. Should be used in conjunction with :attr:`Signature.parameters` for any argument processing purposes. @@ -836,6 +838,10 @@ function. However, if needed, use :meth:`BoundArguments.apply_defaults` to add them. + .. versionchanged:: 3.9 + :attr:`arguments` is now of type :class:`dict`. Formerly, it was of + type :class:`collections.OrderedDict`. + .. attribute:: BoundArguments.args A tuple of positional arguments values. Dynamically computed from the @@ -866,7 +872,7 @@ function. >>> ba = inspect.signature(foo).bind('spam') >>> ba.apply_defaults() >>> ba.arguments - OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())]) + {'a': 'spam', 'b': 'ham', 'args': ()} .. versionadded:: 3.5 diff --git a/Lib/inspect.py b/Lib/inspect.py index 608ca9551160e..950bdb221798d 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -48,7 +48,7 @@ import functools import builtins from operator import attrgetter -from collections import namedtuple, OrderedDict +from collections import namedtuple # Create constants for the compiler flags in Include/code.h # We try to get them from dis to avoid duplication @@ -1727,7 +1727,7 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): """ old_params = wrapped_sig.parameters - new_params = OrderedDict(old_params.items()) + new_params = {} partial_args = partial.args or () partial_keywords = partial.keywords or {} @@ -1743,6 +1743,7 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): transform_to_kwonly = False + kwonly_params = {} # Keyword only parameters are moved to end. for param_name, param in old_params.items(): try: arg_value = ba.arguments[param_name] @@ -1752,7 +1753,6 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): if param.kind is _POSITIONAL_ONLY: # If positional-only parameter is bound by partial, # it effectively disappears from the signature - new_params.pop(param_name) continue if param.kind is _POSITIONAL_OR_KEYWORD: @@ -1771,28 +1771,26 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): # multiple values. transform_to_kwonly = True # Set the new default value - new_params[param_name] = param.replace(default=arg_value) + param = param.replace(default=arg_value) else: # was passed as a positional argument - new_params.pop(param.name) continue if param.kind is _KEYWORD_ONLY: # Set the new default value - new_params[param_name] = param.replace(default=arg_value) + param = param.replace(default=arg_value) if transform_to_kwonly: assert param.kind is not _POSITIONAL_ONLY if param.kind is _POSITIONAL_OR_KEYWORD: - new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY) - new_params[param_name] = new_param - new_params.move_to_end(param_name) + kwonly_params[param_name] = param.replace(kind=_KEYWORD_ONLY) elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD): - new_params.move_to_end(param_name) - elif param.kind is _VAR_POSITIONAL: - new_params.pop(param.name) + kwonly_params[param_name] = param + else: + new_params[param_name] = param + new_params.update(kwonly_params) return wrapped_sig.replace(parameters=new_params.values()) @@ -2602,7 +2600,7 @@ class BoundArguments: Has the following public attributes: - * arguments : OrderedDict + * arguments : dict An ordered mutable mapping of parameters' names to arguments' values. Does not contain arguments' default values. * signature : Signature @@ -2702,7 +2700,7 @@ def apply_defaults(self): # Signature.bind_partial(). continue new_arguments.append((name, val)) - self.arguments = OrderedDict(new_arguments) + self.arguments = dict(new_arguments) def __eq__(self, other): if self is other: @@ -2733,7 +2731,7 @@ class Signature: A Signature object has the following public attributes and methods: - * parameters : OrderedDict + * parameters : dict An ordered mapping of parameters' names to the corresponding Parameter objects (keyword-only arguments are in the same order as listed in `code.co_varnames`). @@ -2763,14 +2761,14 @@ def __init__(self, parameters=None, *, return_annotation=_empty, """ if parameters is None: - params = OrderedDict() + params = {} else: if __validate_parameters__: - params = OrderedDict() + params = {} top_kind = _POSITIONAL_ONLY kind_defaults = False - for idx, param in enumerate(parameters): + for param in parameters: kind = param.kind name = param.name @@ -2805,8 +2803,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, params[name] = param else: - params = OrderedDict(((param.name, param) - for param in parameters)) + params = {param.name: param for param in parameters} self._parameters = types.MappingProxyType(params) self._return_annotation = return_annotation @@ -2888,7 +2885,7 @@ def __eq__(self, other): def _bind(self, args, kwargs, *, partial=False): """Private method. Don't use directly.""" - arguments = OrderedDict() + arguments = {} parameters = iter(self.parameters.values()) parameters_ex = () diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index d95e742c8dd64..8a2efc879323f 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2077,6 +2077,7 @@ def test_signature_object(self): P = inspect.Parameter self.assertEqual(str(S()), '()') + self.assertEqual(repr(S().parameters), 'mappingproxy({})') def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): pass @@ -3681,6 +3682,10 @@ def foo(a='spam'): pass ba.apply_defaults() self.assertEqual(list(ba.arguments.items()), [('a', 'spam')]) + def test_signature_bound_arguments_arguments_type(self): + def foo(a): pass + ba = inspect.signature(foo).bind(1) + self.assertIs(type(ba.arguments), dict) class TestSignaturePrivateHelpers(unittest.TestCase): def test_signature_get_bound_param(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst b/Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst new file mode 100644 index 0000000000000..43363fce1652c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst @@ -0,0 +1,2 @@ +`inspect.Signature.parameters` and `inspect.BoundArguments.arguments` are +now dicts instead of OrderedDicts. Patch contributed by R?mi Lapeyre. From webhook-mailer at python.org Tue Jan 28 07:53:37 2020 From: webhook-mailer at python.org (Petr Viktorin) Date: Tue, 28 Jan 2020 12:53:37 -0000 Subject: [Python-checkins] bpo-38960: DTrace build fix for FreeBSD. (GH-17451) Message-ID: https://github.com/python/cpython/commit/aabdeb766b7fa581e7de01f3c953b12792f0736d commit: aabdeb766b7fa581e7de01f3c953b12792f0736d branch: master author: David Carlier committer: Petr Viktorin date: 2020-01-28T13:53:32+01:00 summary: bpo-38960: DTrace build fix for FreeBSD. (GH-17451) DTrace build fix for FreeBSD. - allowing passing an extra flag as it need to define the arch size. - casting some probe's arguments. files: A Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst M Python/ceval.c M Python/import.c M Python/sysmodule.c M configure M configure.ac diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst new file mode 100644 index 0000000000000..50d4b6c286843 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst @@ -0,0 +1 @@ +Fix DTrace build issues on FreeBSD. Patch by David Carlier. diff --git a/Python/ceval.c b/Python/ceval.c index 2c0a23dfdd291..2770dc6d08dd2 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5447,7 +5447,7 @@ dtrace_function_entry(PyFrameObject *f) funcname = PyUnicode_AsUTF8(f->f_code->co_name); lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); - PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); + PyDTrace_FUNCTION_ENTRY((char *)filename, (char *)funcname, lineno); } static void @@ -5461,7 +5461,7 @@ dtrace_function_return(PyFrameObject *f) funcname = PyUnicode_AsUTF8(f->f_code->co_name); lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); - PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); + PyDTrace_FUNCTION_RETURN((char *)filename, (char *)funcname, lineno); } /* DTrace equivalent of maybe_call_line_trace. */ @@ -5493,7 +5493,7 @@ maybe_dtrace_line(PyFrameObject *frame, co_name = PyUnicode_AsUTF8(frame->f_code->co_name); if (!co_name) co_name = "?"; - PyDTrace_LINE(co_filename, co_name, line); + PyDTrace_LINE((char *)co_filename, (char *)co_name, line); } *instr_prev = frame->f_lasti; } diff --git a/Python/import.c b/Python/import.c index 045b6d0a9bf6f..2e5f78382ed44 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1762,14 +1762,14 @@ import_find_and_load(PyThreadState *tstate, PyObject *abs_name) } if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED()) - PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name)); + PyDTrace_IMPORT_FIND_LOAD_START((char *)PyUnicode_AsUTF8(abs_name)); mod = _PyObject_CallMethodIdObjArgs(interp->importlib, &PyId__find_and_load, abs_name, interp->import_func, NULL); if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED()) - PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name), + PyDTrace_IMPORT_FIND_LOAD_DONE((char *)PyUnicode_AsUTF8(abs_name), mod != NULL); if (import_time) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 9f866a2a3d2fa..17e79603c29f4 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -204,7 +204,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) /* Dtrace USDT point */ if (dtrace) { - PyDTrace_AUDIT(event, (void *)eventArgs); + PyDTrace_AUDIT((char *)event, (void *)eventArgs); } /* Call interpreter hooks */ diff --git a/configure b/configure index 85120e498d1fa..595c129814d29 100755 --- a/configure +++ b/configure @@ -11386,7 +11386,6 @@ $as_echo "$with_dtrace" >&6; } DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -11452,7 +11451,7 @@ if ${ac_cv_dtrace_link+:} false; then : else ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" "$DFLAGS" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes fi diff --git a/configure.ac b/configure.ac index ab8e1b7d27ac2..fee605eec2aa5 100644 --- a/configure.ac +++ b/configure.ac @@ -3500,7 +3500,6 @@ AC_SUBST(DFLAGS) AC_SUBST(DTRACE_HEADERS) AC_SUBST(DTRACE_OBJS) DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -3521,7 +3520,7 @@ then [ac_cv_dtrace_link], [dnl ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" "$DFLAGS" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes ]) if test "$ac_cv_dtrace_link" = "yes"; then From webhook-mailer at python.org Tue Jan 28 16:24:38 2020 From: webhook-mailer at python.org (Dino Viehland) Date: Tue, 28 Jan 2020 21:24:38 -0000 Subject: [Python-checkins] bpo-39459: include missing test files in windows installer Message-ID: https://github.com/python/cpython/commit/0cd5bff6b7da3118d0c5a88fc2b80f80eb7c3059 commit: 0cd5bff6b7da3118d0c5a88fc2b80f80eb7c3059 branch: master author: Dino Viehland committer: GitHub date: 2020-01-28T13:24:12-08:00 summary: bpo-39459: include missing test files in windows installer Adds missing test files to Windows installer to wrap up bpo-39459 files: M PCbuild/lib.pyproj diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index 401e207ae57e8..d4351dec3bee2 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -1125,6 +1125,8 @@ + + From webhook-mailer at python.org Tue Jan 28 21:46:40 2020 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 29 Jan 2020 02:46:40 -0000 Subject: [Python-checkins] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) Message-ID: https://github.com/python/cpython/commit/6a65eba44bfd82ccc8bed4b5c6dd6637549955d5 commit: 6a65eba44bfd82ccc8bed4b5c6dd6637549955d5 branch: master author: Steve Dower committer: GitHub date: 2020-01-29T13:46:33+11:00 summary: bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) As Windows 7 is not supported by Python 3.9, we just replace the dynamic load with a static import. Backports will have a different fix to ensure they continue to behave the same. files: A Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst M PC/getpathp.c M PCbuild/pythoncore.vcxproj diff --git a/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst new file mode 100644 index 0000000000000..78274acfcb743 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst @@ -0,0 +1 @@ +Avoid unsafe DLL load at startup on Windows 7 and earlier. diff --git a/PC/getpathp.c b/PC/getpathp.c index 085caf195a992..3b65b35ce6146 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -91,6 +91,7 @@ #endif #include +#include #include #ifdef HAVE_SYS_TYPES_H @@ -242,42 +243,14 @@ ismodule(wchar_t *filename, int update_filename) stuff as fits will be appended. */ -static int _PathCchCombineEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCombineEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, PCWSTR pszMore, - unsigned long dwFlags); -static PPathCchCombineEx _PathCchCombineEx; - static void join(wchar_t *buffer, const wchar_t *stuff) { - if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); - if (pathapi) { - _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); - } - else { - _PathCchCombineEx = NULL; - } - _PathCchCombineEx_Initialized = 1; - } - - if (_PathCchCombineEx) { - if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } - } else { - if (!PathCombineW(buffer, buffer, stuff)) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } + if (FAILED(PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { + Py_FatalError("buffer overflow in getpathp.c's join()"); } } -static int _PathCchCanonicalizeEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, unsigned long dwFlags); -static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; - /* Call PathCchCanonicalizeEx(path): remove navigation elements such as "." and ".." to produce a direct, well-formed path. */ static PyStatus @@ -287,26 +260,8 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_NO_MEMORY(); } - if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); - if (pathapi) { - _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); - } - else { - _PathCchCanonicalizeEx = NULL; - } - _PathCchCanonicalizeEx_Initialized = 1; - } - - if (_PathCchCanonicalizeEx) { - if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - return INIT_ERR_BUFFER_OVERFLOW(); - } - } - else { - if (!PathCanonicalizeW(buffer, path)) { - return INIT_ERR_BUFFER_OVERFLOW(); - } + if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + return INIT_ERR_BUFFER_OVERFLOW(); } return _PyStatus_OK(); } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index f5be8aa4051e8..cfab2fa4e189c 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -106,7 +106,7 @@ _Py_HAVE_ZLIB;%(PreprocessorDefinitions) - version.lib;shlwapi.lib;ws2_32.lib;%(AdditionalDependencies) + version.lib;shlwapi.lib;ws2_32.lib;pathcch.lib;%(AdditionalDependencies) From webhook-mailer at python.org Wed Jan 29 02:09:34 2020 From: webhook-mailer at python.org (Bruce Merry) Date: Wed, 29 Jan 2020 07:09:34 -0000 Subject: [Python-checkins] bpo-36051: Drop GIL during large bytes.join() (GH-17757) Message-ID: https://github.com/python/cpython/commit/d07d9f4c43bc85a77021bcc7d77643f8ebb605cf commit: d07d9f4c43bc85a77021bcc7d77643f8ebb605cf branch: master author: Bruce Merry committer: GitHub date: 2020-01-29T16:09:24+09:00 summary: bpo-36051: Drop GIL during large bytes.join() (GH-17757) Improve multi-threaded performance by dropping the GIL in the fast path of bytes.join. To avoid increasing overhead for small joins, it is only done if the output size exceeds a threshold. files: A Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst M Lib/test/test_bytes.py M Misc/ACKS M Objects/stringlib/join.h diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index ddcf367f38fc8..770e2c5592cc6 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -547,9 +547,13 @@ def test_join(self): self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd") self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd") # Stress it with many items - seq = [b"abc"] * 1000 - expected = b"abc" + b".:abc" * 999 + seq = [b"abc"] * 100000 + expected = b"abc" + b".:abc" * 99999 self.assertEqual(dot_join(seq), expected) + # Stress test with empty separator + seq = [b"abc"] * 100000 + expected = b"abc" * 100000 + self.assertEqual(self.type2test(b"").join(seq), expected) self.assertRaises(TypeError, self.type2test(b" ").join, None) # Error handling and cleanup when some item in the middle of the # sequence has the wrong type. diff --git a/Misc/ACKS b/Misc/ACKS index 7e4b81bfdee62..f3e368078124d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1106,6 +1106,7 @@ Ezio Melotti Doug Mennella Dimitri Merejkowsky Brian Merrell +Bruce Merry Alexis M?taireau Luke Mewburn Carl Meyer diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst new file mode 100644 index 0000000000000..f9d449216ebed --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst @@ -0,0 +1 @@ +Drop the GIL during large ``bytes.join`` operations. Patch by Bruce Merry. diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h index 6f314e1524eb5..4d023ed1a851e 100644 --- a/Objects/stringlib/join.h +++ b/Objects/stringlib/join.h @@ -18,6 +18,9 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) Py_buffer *buffers = NULL; #define NB_STATIC_BUFFERS 10 Py_buffer static_buffers[NB_STATIC_BUFFERS]; +#define GIL_THRESHOLD 1048576 + int drop_gil = 1; + PyThreadState *save; seq = PySequence_Fast(iterable, "can only join an iterable"); if (seq == NULL) { @@ -65,12 +68,21 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) buffers[i].buf = PyBytes_AS_STRING(item); buffers[i].len = PyBytes_GET_SIZE(item); } - else if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { - PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected a bytes-like object, " - "%.80s found", - i, Py_TYPE(item)->tp_name); - goto error; + else { + if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { + PyErr_Format(PyExc_TypeError, + "sequence item %zd: expected a bytes-like object, " + "%.80s found", + i, Py_TYPE(item)->tp_name); + goto error; + } + /* If the backing objects are mutable, then dropping the GIL + * opens up race conditions where another thread tries to modify + * the object which we hold a buffer on it. Such code has data + * races anyway, but this is a conservative approach that avoids + * changing the behaviour of that data race. + */ + drop_gil = 0; } nbufs = i + 1; /* for error cleanup */ itemlen = buffers[i].len; @@ -102,6 +114,12 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) /* Catenate everything. */ p = STRINGLIB_STR(res); + if (sz < GIL_THRESHOLD) { + drop_gil = 0; /* Benefits are likely outweighed by the overheads */ + } + if (drop_gil) { + save = PyEval_SaveThread(); + } if (!seplen) { /* fast path */ for (i = 0; i < nbufs; i++) { @@ -110,19 +128,23 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) memcpy(p, q, n); p += n; } - goto done; } - for (i = 0; i < nbufs; i++) { - Py_ssize_t n; - char *q; - if (i) { - memcpy(p, sepstr, seplen); - p += seplen; + else { + for (i = 0; i < nbufs; i++) { + Py_ssize_t n; + char *q; + if (i) { + memcpy(p, sepstr, seplen); + p += seplen; + } + n = buffers[i].len; + q = buffers[i].buf; + memcpy(p, q, n); + p += n; } - n = buffers[i].len; - q = buffers[i].buf; - memcpy(p, q, n); - p += n; + } + if (drop_gil) { + PyEval_RestoreThread(save); } goto done; @@ -138,3 +160,4 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) } #undef NB_STATIC_BUFFERS +#undef GIL_THRESHOLD From webhook-mailer at python.org Wed Jan 29 06:21:19 2020 From: webhook-mailer at python.org (Joannah Nanjekye) Date: Wed, 29 Jan 2020 11:21:19 -0000 Subject: [Python-checkins] bpo-39153: Clarify C API *SetItem refcounting semantics (GH-18220) Message-ID: https://github.com/python/cpython/commit/e1e80002e28e1055f399a20918c49d50d093709e commit: e1e80002e28e1055f399a20918c49d50d093709e branch: master author: Joannah Nanjekye <33177550+nanjekyejoannah at users.noreply.github.com> committer: GitHub date: 2020-01-29T21:20:53+10:00 summary: bpo-39153: Clarify C API *SetItem refcounting semantics (GH-18220) Some of the *SetItem methods in the C API steal a reference to the given value. This annotates the better behaved ones to assure the reader that these are not the ones with the inconsistent behaviour. * ?? Added by blurb_it. * make docs consistent with signature Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst M Doc/c-api/dict.rst M Doc/c-api/mapping.rst M Doc/c-api/object.rst diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index e7922dc0c73f2..e48c11d336b8c 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -62,19 +62,20 @@ Dictionary Objects .. c:function:: int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val) - Insert *value* into the dictionary *p* with a key of *key*. *key* must be + Insert *val* into the dictionary *p* with a key of *key*. *key* must be :term:`hashable`; if it isn't, :exc:`TypeError` will be raised. Return - ``0`` on success or ``-1`` on failure. + ``0`` on success or ``-1`` on failure. This function *does not* steal a + reference to *val*. .. c:function:: int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val) .. index:: single: PyUnicode_FromString() - Insert *value* into the dictionary *p* using *key* as a key. *key* should + 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 ``PyUnicode_FromString(key)``. Return ``0`` on success or ``-1`` on - failure. + failure. This function *does not* steal a reference to *val*. .. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key) diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 6a80b033b651e..682160d1475c1 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -37,7 +37,8 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Map the string *key* to the value *v* in object *o*. Returns ``-1`` on failure. This is the equivalent of the Python statement ``o[key] = v``. - See also :c:func:`PyObject_SetItem`. + See also :c:func:`PyObject_SetItem`. This function *does not* steal a + reference to *v*. .. c:function:: int PyMapping_DelItem(PyObject *o, PyObject *key) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index ca9db1aee2f87..2905fbbd0f70c 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -331,7 +331,8 @@ Object Protocol Map the object *key* to the value *v*. Raise an exception and return ``-1`` on failure; return ``0`` on success. This is the - equivalent of the Python statement ``o[key] = v``. + equivalent of the Python statement ``o[key] = v``. This function *does + not* steal a reference to *v*. .. c:function:: int PyObject_DelItem(PyObject *o, PyObject *key) diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst new file mode 100644 index 0000000000000..95be00b4b777f --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst @@ -0,0 +1,5 @@ +Clarify refcounting semantics for the following functions: +- PyObject_SetItem +- PyMapping_SetItemString +- PyDict_SetItem +- PyDict_SetItemString \ No newline at end of file From webhook-mailer at python.org Wed Jan 29 06:29:43 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 Jan 2020 11:29:43 -0000 Subject: [Python-checkins] bpo-39153: Clarify C API *SetItem refcounting semantics (GH-18220) Message-ID: https://github.com/python/cpython/commit/526523c19322169a7f7507d9da291053df979412 commit: 526523c19322169a7f7507d9da291053df979412 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T03:29:35-08:00 summary: bpo-39153: Clarify C API *SetItem refcounting semantics (GH-18220) Some of the *SetItem methods in the C API steal a reference to the given value. This annotates the better behaved ones to assure the reader that these are not the ones with the inconsistent behaviour. * ?? Added by blurb_it. * make docs consistent with signature Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> (cherry picked from commit e1e80002e28e1055f399a20918c49d50d093709e) Co-authored-by: Joannah Nanjekye <33177550+nanjekyejoannah at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst M Doc/c-api/dict.rst M Doc/c-api/mapping.rst M Doc/c-api/object.rst diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index e7922dc0c73f2..e48c11d336b8c 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -62,19 +62,20 @@ Dictionary Objects .. c:function:: int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val) - Insert *value* into the dictionary *p* with a key of *key*. *key* must be + Insert *val* into the dictionary *p* with a key of *key*. *key* must be :term:`hashable`; if it isn't, :exc:`TypeError` will be raised. Return - ``0`` on success or ``-1`` on failure. + ``0`` on success or ``-1`` on failure. This function *does not* steal a + reference to *val*. .. c:function:: int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val) .. index:: single: PyUnicode_FromString() - Insert *value* into the dictionary *p* using *key* as a key. *key* should + 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 ``PyUnicode_FromString(key)``. Return ``0`` on success or ``-1`` on - failure. + failure. This function *does not* steal a reference to *val*. .. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key) diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 6a80b033b651e..682160d1475c1 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -37,7 +37,8 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Map the string *key* to the value *v* in object *o*. Returns ``-1`` on failure. This is the equivalent of the Python statement ``o[key] = v``. - See also :c:func:`PyObject_SetItem`. + See also :c:func:`PyObject_SetItem`. This function *does not* steal a + reference to *v*. .. c:function:: int PyMapping_DelItem(PyObject *o, PyObject *key) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 404a98fb417bb..db815ae288b86 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -503,7 +503,8 @@ Object Protocol Map the object *key* to the value *v*. Raise an exception and return ``-1`` on failure; return ``0`` on success. This is the - equivalent of the Python statement ``o[key] = v``. + equivalent of the Python statement ``o[key] = v``. This function *does + not* steal a reference to *v*. .. c:function:: int PyObject_DelItem(PyObject *o, PyObject *key) diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst new file mode 100644 index 0000000000000..95be00b4b777f --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst @@ -0,0 +1,5 @@ +Clarify refcounting semantics for the following functions: +- PyObject_SetItem +- PyMapping_SetItemString +- PyDict_SetItem +- PyDict_SetItemString \ No newline at end of file From webhook-mailer at python.org Wed Jan 29 08:11:01 2020 From: webhook-mailer at python.org (Julien Palard) Date: Wed, 29 Jan 2020 13:11:01 -0000 Subject: [Python-checkins] Doc: Fix external links to functional programming tutorial. (GH-18249) Message-ID: https://github.com/python/cpython/commit/35eac4500a8bd89b087407f59ba337343b22d403 commit: 35eac4500a8bd89b087407f59ba337343b22d403 branch: master author: Julien Palard committer: GitHub date: 2020-01-29T14:10:54+01:00 summary: Doc: Fix external links to functional programming tutorial. (GH-18249) files: M Doc/howto/functional.rst diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index f8f2aac70f9b0..74e861480d2ff 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1229,9 +1229,9 @@ Text Processing". Mertz also wrote a 3-part series of articles on functional programming for IBM's DeveloperWorks site; see -`part 1 `__, -`part 2 `__, and -`part 3 `__, +`part 1 `__, +`part 2 `__, and +`part 3 `__, Python documentation From webhook-mailer at python.org Wed Jan 29 08:17:05 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 Jan 2020 13:17:05 -0000 Subject: [Python-checkins] Doc: Fix external links to functional programming tutorial. (GH-18249) Message-ID: https://github.com/python/cpython/commit/a6559b436dc5663828eca055be62683e0b0cf5bb commit: a6559b436dc5663828eca055be62683e0b0cf5bb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T05:16:57-08:00 summary: Doc: Fix external links to functional programming tutorial. (GH-18249) (cherry picked from commit 35eac4500a8bd89b087407f59ba337343b22d403) Co-authored-by: Julien Palard files: M Doc/howto/functional.rst diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index f8f2aac70f9b0..74e861480d2ff 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1229,9 +1229,9 @@ Text Processing". Mertz also wrote a 3-part series of articles on functional programming for IBM's DeveloperWorks site; see -`part 1 `__, -`part 2 `__, and -`part 3 `__, +`part 1 `__, +`part 2 `__, and +`part 3 `__, Python documentation From webhook-mailer at python.org Wed Jan 29 08:17:44 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 Jan 2020 13:17:44 -0000 Subject: [Python-checkins] Doc: Fix external links to functional programming tutorial. (GH-18249) Message-ID: https://github.com/python/cpython/commit/d1fa90584f5f4bb0c47743d88a6520ba40e846a0 commit: d1fa90584f5f4bb0c47743d88a6520ba40e846a0 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T05:17:40-08:00 summary: Doc: Fix external links to functional programming tutorial. (GH-18249) (cherry picked from commit 35eac4500a8bd89b087407f59ba337343b22d403) Co-authored-by: Julien Palard files: M Doc/howto/functional.rst diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index f8f2aac70f9b0..74e861480d2ff 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1229,9 +1229,9 @@ Text Processing". Mertz also wrote a 3-part series of articles on functional programming for IBM's DeveloperWorks site; see -`part 1 `__, -`part 2 `__, and -`part 3 `__, +`part 1 `__, +`part 2 `__, and +`part 3 `__, Python documentation From webhook-mailer at python.org Wed Jan 29 09:23:37 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 29 Jan 2020 14:23:37 -0000 Subject: [Python-checkins] bpo-39460: Fix test_zipfile.test_add_file_after_2107() (GH-18247) Message-ID: https://github.com/python/cpython/commit/3cb49b62e61208efcefbc04414e769fc173f205d commit: 3cb49b62e61208efcefbc04414e769fc173f205d branch: master author: Victor Stinner committer: GitHub date: 2020-01-29T15:23:29+01:00 summary: bpo-39460: Fix test_zipfile.test_add_file_after_2107() (GH-18247) XFS filesystem is limited to 32-bit timestamp, but the utimensat() syscall doesn't fail. Moreover, there is a VFS bug which returns a cached timestamp which is different than the value on disk. https://bugzilla.redhat.com/show_bug.cgi?id=1795576 https://bugs.python.org/issue39460#msg360952 files: M Lib/test/test_zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 66f05ac1f3aef..4c20bfd7e2cd7 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -616,6 +616,18 @@ def test_add_file_after_2107(self): except OverflowError: self.skipTest('Host fs cannot set timestamp to required value.') + mtime_ns = os.stat(TESTFN).st_mtime_ns + if mtime_ns != (4386268800 * 10**9): + # XFS filesystem is limited to 32-bit timestamp, but the syscall + # didn't fail. Moreover, there is a VFS bug which returns + # a cached timestamp which is different than the value on disk. + # + # Test st_mtime_ns rather than st_mtime to avoid rounding issues. + # + # https://bugzilla.redhat.com/show_bug.cgi?id=1795576 + # https://bugs.python.org/issue39460#msg360952 + self.skipTest(f"Linux VFS/XFS kernel bug detected: {mtime_ns=}") + with zipfile.ZipFile(TESTFN2, "w") as zipfp: self.assertRaises(struct.error, zipfp.write, TESTFN) From webhook-mailer at python.org Wed Jan 29 09:41:55 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 Jan 2020 14:41:55 -0000 Subject: [Python-checkins] bpo-39460: Fix test_zipfile.test_add_file_after_2107() (GH-18247) Message-ID: https://github.com/python/cpython/commit/2b675f0c8fd96f61977f6dc636f44fbd5587b6b3 commit: 2b675f0c8fd96f61977f6dc636f44fbd5587b6b3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T06:41:49-08:00 summary: bpo-39460: Fix test_zipfile.test_add_file_after_2107() (GH-18247) XFS filesystem is limited to 32-bit timestamp, but the utimensat() syscall doesn't fail. Moreover, there is a VFS bug which returns a cached timestamp which is different than the value on disk. https://bugzilla.redhat.com/show_bug.cgi?id=1795576 https://bugs.python.org/issue39460GH-msg360952 (cherry picked from commit 3cb49b62e61208efcefbc04414e769fc173f205d) Co-authored-by: Victor Stinner files: M Lib/test/test_zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index f03c044eae3a6..0737c343cbf5f 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -602,6 +602,18 @@ def test_add_file_after_2107(self): except OverflowError: self.skipTest('Host fs cannot set timestamp to required value.') + mtime_ns = os.stat(TESTFN).st_mtime_ns + if mtime_ns != (4386268800 * 10**9): + # XFS filesystem is limited to 32-bit timestamp, but the syscall + # didn't fail. Moreover, there is a VFS bug which returns + # a cached timestamp which is different than the value on disk. + # + # Test st_mtime_ns rather than st_mtime to avoid rounding issues. + # + # https://bugzilla.redhat.com/show_bug.cgi?id=1795576 + # https://bugs.python.org/issue39460#msg360952 + self.skipTest(f"Linux VFS/XFS kernel bug detected: {mtime_ns=}") + with zipfile.ZipFile(TESTFN2, "w") as zipfp: self.assertRaises(struct.error, zipfp.write, TESTFN) From webhook-mailer at python.org Wed Jan 29 10:43:55 2020 From: webhook-mailer at python.org (Carl Friedrich Bolz-Tereick) Date: Wed, 29 Jan 2020 15:43:55 -0000 Subject: [Python-checkins] bpo-39485: fix corner-case in method-detection of mock (GH-18252) Message-ID: https://github.com/python/cpython/commit/a327677905956ae0b239ff430a1346dfe265709e commit: a327677905956ae0b239ff430a1346dfe265709e branch: master author: Carl Friedrich Bolz-Tereick committer: GitHub date: 2020-01-29T15:43:37Z summary: bpo-39485: fix corner-case in method-detection of mock (GH-18252) Replace check for whether something is a method in the mock module. The previous version fails on PyPy, because there no method wrappers exist (everything looks like a regular Python-defined function). Thus the isinstance(getattr(result, '__get__', None), MethodWrapperTypes) check returns True for any descriptor, not just methods. This condition could also return erroneously True in CPython for C-defined descriptors. Instead to decide whether something is a method, just check directly whether it's a function defined on the class. This passes all tests on CPython and fixes the bug on PyPy. files: A Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst M Lib/unittest/mock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index a3d8b6eab41a9..37ea5c7e45c8b 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2748,7 +2748,7 @@ def _must_skip(spec, entry, is_type): continue if isinstance(result, (staticmethod, classmethod)): return False - elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes): + elif isinstance(result, FunctionTypes): # Normal method => skip if looked up on type # (if looked up on instance, self is already skipped) return is_type @@ -2778,10 +2778,6 @@ def __init__(self, spec, spec_set=False, parent=None, type(ANY.__eq__), ) -MethodWrapperTypes = ( - type(ANY.__eq__.__get__), -) - file_spec = None diff --git a/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst new file mode 100644 index 0000000000000..f62c31fc686ad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst @@ -0,0 +1,3 @@ +Fix a bug in :func:`unittest.mock.create_autospec` that would complain about +the wrong number of arguments for custom descriptors defined in an extension +module returning functions. From webhook-mailer at python.org Wed Jan 29 11:10:32 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 Jan 2020 16:10:32 -0000 Subject: [Python-checkins] bpo-39485: fix corner-case in method-detection of mock (GH-18256) Message-ID: https://github.com/python/cpython/commit/cf0645a17acbc0c4dbbf82434e37637965748bbb commit: cf0645a17acbc0c4dbbf82434e37637965748bbb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T16:10:24Z summary: bpo-39485: fix corner-case in method-detection of mock (GH-18256) Replace check for whether something is a method in the mock module. The previous version fails on PyPy, because there no method wrappers exist (everything looks like a regular Python-defined function). Thus the isinstance(getattr(result, '__get__', None), MethodWrapperTypes) check returns True for any descriptor, not just methods. This condition could also return erroneously True in CPython for C-defined descriptors. Instead to decide whether something is a method, just check directly whether it's a function defined on the class. This passes all tests on CPython and fixes the bug on PyPy. (cherry picked from commit a327677905956ae0b239ff430a1346dfe265709e) Co-authored-by: Carl Friedrich Bolz-Tereick Co-authored-by: Carl Friedrich Bolz-Tereick files: A Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst M Lib/unittest/mock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 372a6719be9fa..87e8735e958d5 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2342,7 +2342,7 @@ def _must_skip(spec, entry, is_type): continue if isinstance(result, (staticmethod, classmethod)): return False - elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes): + elif isinstance(result, FunctionTypes): # Normal method => skip if looked up on type # (if looked up on instance, self is already skipped) return is_type @@ -2381,10 +2381,6 @@ def __init__(self, spec, spec_set=False, parent=None, type(ANY.__eq__), ) -MethodWrapperTypes = ( - type(ANY.__eq__.__get__), -) - file_spec = None diff --git a/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst new file mode 100644 index 0000000000000..f62c31fc686ad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst @@ -0,0 +1,3 @@ +Fix a bug in :func:`unittest.mock.create_autospec` that would complain about +the wrong number of arguments for custom descriptors defined in an extension +module returning functions. From webhook-mailer at python.org Wed Jan 29 11:15:40 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 29 Jan 2020 16:15:40 -0000 Subject: [Python-checkins] bpo-39485: fix corner-case in method-detection of mock (GH-18255) Message-ID: https://github.com/python/cpython/commit/696d2324cf2a54e20e8d6a6739fa97ba815a8be9 commit: 696d2324cf2a54e20e8d6a6739fa97ba815a8be9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T16:15:36Z summary: bpo-39485: fix corner-case in method-detection of mock (GH-18255) Replace check for whether something is a method in the mock module. The previous version fails on PyPy, because there no method wrappers exist (everything looks like a regular Python-defined function). Thus the isinstance(getattr(result, '__get__', None), MethodWrapperTypes) check returns True for any descriptor, not just methods. This condition could also return erroneously True in CPython for C-defined descriptors. Instead to decide whether something is a method, just check directly whether it's a function defined on the class. This passes all tests on CPython and fixes the bug on PyPy. (cherry picked from commit a327677905956ae0b239ff430a1346dfe265709e) Co-authored-by: Carl Friedrich Bolz-Tereick Co-authored-by: Carl Friedrich Bolz-Tereick files: A Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst M Lib/unittest/mock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 66ace80cb5f9c..204b3e7789b33 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2715,7 +2715,7 @@ def _must_skip(spec, entry, is_type): continue if isinstance(result, (staticmethod, classmethod)): return False - elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes): + elif isinstance(result, FunctionTypes): # Normal method => skip if looked up on type # (if looked up on instance, self is already skipped) return is_type @@ -2745,10 +2745,6 @@ def __init__(self, spec, spec_set=False, parent=None, type(ANY.__eq__), ) -MethodWrapperTypes = ( - type(ANY.__eq__.__get__), -) - file_spec = None diff --git a/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst new file mode 100644 index 0000000000000..f62c31fc686ad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst @@ -0,0 +1,3 @@ +Fix a bug in :func:`unittest.mock.create_autospec` that would complain about +the wrong number of arguments for custom descriptors defined in an extension +module returning functions. From webhook-mailer at python.org Wed Jan 29 11:25:02 2020 From: webhook-mailer at python.org (Chris Withers) Date: Wed, 29 Jan 2020 16:25:02 -0000 Subject: [Python-checkins] Get mock coverage back to 100% (GH-18228) Message-ID: https://github.com/python/cpython/commit/db5e86adbce12350c26e7ffc2c6673369971a2dc commit: db5e86adbce12350c26e7ffc2c6673369971a2dc branch: master author: Chris Withers committer: GitHub date: 2020-01-29T16:24:54Z summary: Get mock coverage back to 100% (GH-18228) * use the `: pass` and `: yield` patterns for code that isn't expected to ever be executed. * The _Call items passed to _AnyComparer are only ever of length two, so assert instead of if/else * fix typo * Fix bug, where stop-without-start patching dict blows up with `TypeError: 'NoneType' object is not iterable`, highlighted by lack of coverage of an except branch. * The fix for bpo-37972 means _Call.count and _Call.index are no longer needed. * add coverage for calling next() on a mock_open with readline.return_value set. * __aiter__ is defined on the Mock so the one on _AsyncIterator is never called. files: M Lib/unittest/mock.py M Lib/unittest/test/testmock/testasync.py M Lib/unittest/test/testmock/testmock.py M Lib/unittest/test/testmock/testpatch.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 37ea5c7e45c8b..9e692981a229b 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1042,8 +1042,7 @@ class _AnyComparer(list): the left.""" def __contains__(self, item): for _call in self: - if len(item) != len(_call): - continue + assert len(item) == len(_call) if all([ expected == actual for expected, actual in zip(item, _call) @@ -1856,7 +1855,8 @@ def _unpatch_dict(self): def __exit__(self, *args): """Unpatch the dict.""" - self._unpatch_dict() + if self._original is not None: + self._unpatch_dict() return False @@ -2168,7 +2168,7 @@ def __init__(self, /, *args, **kwargs): self.__dict__['__code__'] = code_mock async def _execute_mock_call(self, /, *args, **kwargs): - # This is nearly just like super(), except for sepcial handling + # This is nearly just like super(), except for special handling # of coroutines _call = self.call_args @@ -2541,12 +2541,6 @@ def __getattribute__(self, attr): return tuple.__getattribute__(self, attr) - def count(self, /, *args, **kwargs): - return self.__getattr__('count')(*args, **kwargs) - - def index(self, /, *args, **kwargs): - return self.__getattr__('index')(*args, **kwargs) - def _get_call_arguments(self): if len(self) == 2: args, kwargs = self @@ -2917,9 +2911,6 @@ def __init__(self, iterator): code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE self.__dict__['__code__'] = code_mock - def __aiter__(self): - return self - async def __anext__(self): try: return next(self.iterator) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 992076db78706..bf936220ccaf2 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -16,38 +16,28 @@ def tearDownModule(): class AsyncClass: - def __init__(self): - pass - async def async_method(self): - pass - def normal_method(self): - pass + def __init__(self): pass + async def async_method(self): pass + def normal_method(self): pass @classmethod - async def async_class_method(cls): - pass + async def async_class_method(cls): pass @staticmethod - async def async_static_method(): - pass + async def async_static_method(): pass class AwaitableClass: - def __await__(self): - yield + def __await__(self): yield -async def async_func(): - pass +async def async_func(): pass -async def async_func_args(a, b, *, c): - pass +async def async_func_args(a, b, *, c): pass -def normal_func(): - pass +def normal_func(): pass class NormalClass(object): - def a(self): - pass + def a(self): pass async_foo_name = f'{__name__}.AsyncClass' @@ -402,8 +392,7 @@ def test_magicmock_lambda_spec(self): class AsyncArguments(IsolatedAsyncioTestCase): async def test_add_return_value(self): - async def addition(self, var): - return var + 1 + async def addition(self, var): pass mock = AsyncMock(addition, return_value=10) output = await mock(5) @@ -411,8 +400,7 @@ class AsyncArguments(IsolatedAsyncioTestCase): self.assertEqual(output, 10) async def test_add_side_effect_exception(self): - async def addition(var): - return var + 1 + async def addition(var): pass mock = AsyncMock(addition, side_effect=Exception('err')) with self.assertRaises(Exception): await mock(5) @@ -553,18 +541,14 @@ def test_magic_methods_are_async_functions(self): class AsyncContextManagerTest(unittest.TestCase): class WithAsyncContextManager: - async def __aenter__(self, *args, **kwargs): - return self + async def __aenter__(self, *args, **kwargs): pass - async def __aexit__(self, *args, **kwargs): - pass + async def __aexit__(self, *args, **kwargs): pass class WithSyncContextManager: - def __enter__(self, *args, **kwargs): - return self + def __enter__(self, *args, **kwargs): pass - def __exit__(self, *args, **kwargs): - pass + def __exit__(self, *args, **kwargs): pass class ProductionCode: # Example real-world(ish) code @@ -673,16 +657,9 @@ class WithAsyncIterator(object): def __init__(self): self.items = ["foo", "NormalFoo", "baz"] - def __aiter__(self): - return self - - async def __anext__(self): - try: - return self.items.pop() - except IndexError: - pass + def __aiter__(self): pass - raise StopAsyncIteration + async def __anext__(self): pass def test_aiter_set_return_value(self): mock_iter = AsyncMock(name="tester") diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 677346725bdd2..9b9e066cc545d 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1868,6 +1868,11 @@ def test_mock_open_using_next(self): with self.assertRaises(StopIteration): next(f1) + def test_mock_open_next_with_readline_with_return_value(self): + mopen = mock.mock_open(read_data='foo\nbarn') + mopen.return_value.readline.return_value = 'abc' + self.assertEqual('abc', next(mopen())) + def test_mock_open_write(self): # Test exception in file writing write() mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV')) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index 438dfd8cfbcc0..f1bc0e1cd40a2 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -770,6 +770,14 @@ def test_patch_dict_start_stop(self): self.assertEqual(d, original) + def test_patch_dict_stop_without_start(self): + d = {'foo': 'bar'} + original = d.copy() + patcher = patch.dict(d, [('spam', 'eggs')], clear=True) + self.assertEqual(patcher.stop(), False) + self.assertEqual(d, original) + + def test_patch_dict_class_decorator(self): this = self d = {'spam': 'eggs'} From webhook-mailer at python.org Wed Jan 29 13:22:19 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 29 Jan 2020 18:22:19 -0000 Subject: [Python-checkins] Remove deadcode in _Py_inc_count() (GH-18257) Message-ID: https://github.com/python/cpython/commit/5428f48b6308c7fd71636077f2ebc307c9a53d03 commit: 5428f48b6308c7fd71636077f2ebc307c9a53d03 branch: master author: Victor Stinner committer: GitHub date: 2020-01-29T19:22:11+01:00 summary: Remove deadcode in _Py_inc_count() (GH-18257) (tp->tp_next != NULL) check became redundant with commit 45294a9562e5c360ee8ef8498d8792e05a6eb25e (merged in 2006). files: M Objects/object.c diff --git a/Objects/object.c b/Objects/object.c index 6fc114621c1d1..14533dba16d64 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -182,8 +182,6 @@ _Py_inc_count(PyTypeObject *tp) { if (tp->tp_next == NULL && tp->tp_prev == NULL) { /* first time; insert in linked list */ - if (tp->tp_next != NULL) /* sanity check */ - Py_FatalError("XXX _Py_inc_count sanity check"); if (type_list) type_list->tp_prev = tp; tp->tp_next = type_list; From webhook-mailer at python.org Wed Jan 29 21:23:58 2020 From: webhook-mailer at python.org (Bonifacio de Oliveira) Date: Thu, 30 Jan 2020 02:23:58 -0000 Subject: [Python-checkins] Improve grammar in the import system reference documentation (GH-18209) Message-ID: https://github.com/python/cpython/commit/d47d0c8e9f2ca0f9f5d1bf0b35006a9a4d5ca684 commit: d47d0c8e9f2ca0f9f5d1bf0b35006a9a4d5ca684 branch: master author: Bonifacio de Oliveira committer: GitHub date: 2020-01-29T18:23:50-08:00 summary: Improve grammar in the import system reference documentation (GH-18209) Replaced the period with a comma. Automerge-Triggered-By: @Mariatta files: M Doc/reference/import.rst diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 20a2ea69e2d27..4c36e15dc0606 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -857,7 +857,7 @@ module. ``find_spec()`` returns a fully populated spec for the module. This spec will always have "loader" set (with one exception). To indicate to the import machinery that the spec represents a namespace -:term:`portion`. the path entry finder sets "loader" on the spec to +:term:`portion`, the path entry finder sets "loader" on the spec to ``None`` and "submodule_search_locations" to a list containing the portion. From webhook-mailer at python.org Wed Jan 29 21:52:41 2020 From: webhook-mailer at python.org (Shantanu) Date: Thu, 30 Jan 2020 02:52:41 -0000 Subject: [Python-checkins] bpo-39493: Fix definition of IO.closed in typing.py (#18265) Message-ID: https://github.com/python/cpython/commit/2e6569b6692298fcc9aae0df3eb3181adb2a5099 commit: 2e6569b6692298fcc9aae0df3eb3181adb2a5099 branch: master author: Shantanu committer: GitHub date: 2020-01-29T18:52:36-08:00 summary: bpo-39493: Fix definition of IO.closed in typing.py (#18265) files: A Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst M Lib/typing.py diff --git a/Lib/typing.py b/Lib/typing.py index 7de3e346eaa79..28c887ed35e0b 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1831,6 +1831,7 @@ def name(self) -> str: def close(self) -> None: pass + @property @abstractmethod def closed(self) -> bool: pass diff --git a/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst new file mode 100644 index 0000000000000..b676629a4414a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst @@ -0,0 +1 @@ +Mark ``typing.IO.closed`` as a property \ No newline at end of file From webhook-mailer at python.org Wed Jan 29 23:12:57 2020 From: webhook-mailer at python.org (Alex Henrie) Date: Thu, 30 Jan 2020 04:12:57 -0000 Subject: [Python-checkins] bpo-39494: Remove extra null terminators from kwlist vars (GH-18267) Message-ID: https://github.com/python/cpython/commit/188bb5b1e868eecf2342195dc45caa332ac3b6c7 commit: 188bb5b1e868eecf2342195dc45caa332ac3b6c7 branch: master author: Alex Henrie committer: GitHub date: 2020-01-30T07:12:53+03:00 summary: bpo-39494: Remove extra null terminators from kwlist vars (GH-18267) files: M Modules/_sqlite/cursor.c M Modules/_sqlite/module.c diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 45f5865590d69..47dbc77474120 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -773,7 +773,7 @@ PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"size", NULL, NULL}; + static char *kwlist[] = {"size", NULL}; PyObject* row; PyObject* list; diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index d5c353ea7bee8..4d9d3d41c7b71 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -105,7 +105,7 @@ RAM instead of on disk."); static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"statement", NULL, NULL}; + static char *kwlist[] = {"statement", NULL}; char* statement; PyObject* result; @@ -135,7 +135,7 @@ Checks if a string contains a complete SQL statement. Non-standard."); static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"do_enable", NULL, NULL}; + static char *kwlist[] = {"do_enable", NULL}; int do_enable; int rc; From webhook-mailer at python.org Thu Jan 30 00:42:43 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 Jan 2020 05:42:43 -0000 Subject: [Python-checkins] bpo-39493: Fix definition of IO.closed in typing.py (GH-18265) Message-ID: https://github.com/python/cpython/commit/58076df0c59677111dc77b72852cb2a313a2ef91 commit: 58076df0c59677111dc77b72852cb2a313a2ef91 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T21:42:38-08:00 summary: bpo-39493: Fix definition of IO.closed in typing.py (GH-18265) (cherry picked from commit 2e6569b6692298fcc9aae0df3eb3181adb2a5099) Co-authored-by: Shantanu files: A Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst M Lib/typing.py diff --git a/Lib/typing.py b/Lib/typing.py index 69f6d9873490a..83d310f3c0dd3 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1848,6 +1848,7 @@ def name(self) -> str: def close(self) -> None: pass + @property @abstractmethod def closed(self) -> bool: pass diff --git a/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst new file mode 100644 index 0000000000000..b676629a4414a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst @@ -0,0 +1 @@ +Mark ``typing.IO.closed`` as a property \ No newline at end of file From webhook-mailer at python.org Thu Jan 30 01:00:16 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 Jan 2020 06:00:16 -0000 Subject: [Python-checkins] [3.7] bpo-39493: Fix definition of IO.closed in typing.py (GH-18273) Message-ID: https://github.com/python/cpython/commit/194c7aeb6f3d6c2b0015457d22b38253652f4f38 commit: 194c7aeb6f3d6c2b0015457d22b38253652f4f38 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-29T22:00:12-08:00 summary: [3.7] bpo-39493: Fix definition of IO.closed in typing.py (GH-18273) * bpo-39493: Fix definition of IO.closed in typing.py (GH-18265) (cherry picked from commit 2e6569b6692298fcc9aae0df3eb3181adb2a5099) Co-authored-by: Shantanu * Use @absractproperty Co-authored-by: Shantanu Co-authored-by: Guido van Rossum files: A Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst M Lib/typing.py diff --git a/Lib/typing.py b/Lib/typing.py index 607eb1f8fc31a..3b2e3720fff57 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1509,7 +1509,7 @@ def name(self) -> str: def close(self) -> None: pass - @abstractmethod + @abstractproperty def closed(self) -> bool: pass diff --git a/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst new file mode 100644 index 0000000000000..b676629a4414a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst @@ -0,0 +1 @@ +Mark ``typing.IO.closed`` as a property \ No newline at end of file From webhook-mailer at python.org Thu Jan 30 01:07:22 2020 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 30 Jan 2020 06:07:22 -0000 Subject: [Python-checkins] [3.7] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) (GH-18232) Message-ID: https://github.com/python/cpython/commit/561c59777c8426fde0ef48b57cf02eddaeb2a5b8 commit: 561c59777c8426fde0ef48b57cf02eddaeb2a5b8 branch: 3.7 author: Steve Dower committer: GitHub date: 2020-01-29T22:07:17-08:00 summary: [3.7] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) (GH-18232) https://bugs.python.org/issue39401 Automerge-Triggered-By: @zooba files: A Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst M PC/getpathp.c M Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp diff --git a/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst new file mode 100644 index 0000000000000..5071e126b70d0 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst @@ -0,0 +1 @@ +Avoid unsafe load of ``api-ms-win-core-path-l1-1-0.dll`` at startup on Windows 7. diff --git a/PC/getpathp.c b/PC/getpathp.c index 04764c9e5a0df..e3cd3ae1e9a60 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -245,7 +245,8 @@ static void join(wchar_t *buffer, const wchar_t *stuff) { if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); if (pathapi) { _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); } @@ -278,7 +279,8 @@ static _PyInitError canonicalize(wchar_t *buffer, const wchar_t *path) } if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); if (pathapi) { _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); } diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index cd4a1f8feb1d4..af6cf0ca5849d 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -3028,8 +3028,16 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { } } else { if (IsWindows7SP1OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); - return; + HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); + if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533623"); + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue."); + /* The "MissingSP1" error also specifies updates are required */ + LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString); + } else { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); + return; + } } else if (IsWindows7OrGreater()) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 RTM"); BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); From webhook-mailer at python.org Thu Jan 30 01:18:34 2020 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 30 Jan 2020 06:18:34 -0000 Subject: [Python-checkins] [3.8] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) (GH-18234) Message-ID: https://github.com/python/cpython/commit/ad4a20b87d79a619ffbdea3f26848780899494e5 commit: ad4a20b87d79a619ffbdea3f26848780899494e5 branch: 3.8 author: Steve Dower committer: GitHub date: 2020-01-29T22:18:25-08:00 summary: [3.8] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) (GH-18234) https://bugs.python.org/issue39401 Automerge-Triggered-By: @zooba files: A Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst M PC/getpathp.c diff --git a/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst new file mode 100644 index 0000000000000..5071e126b70d0 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst @@ -0,0 +1 @@ +Avoid unsafe load of ``api-ms-win-core-path-l1-1-0.dll`` at startup on Windows 7. diff --git a/PC/getpathp.c b/PC/getpathp.c index 04f24d986f667..3747ffb2d89f0 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -251,7 +251,8 @@ static void join(wchar_t *buffer, const wchar_t *stuff) { if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); if (pathapi) { _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); } @@ -287,7 +288,8 @@ canonicalize(wchar_t *buffer, const wchar_t *path) } if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); if (pathapi) { _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); } From webhook-mailer at python.org Thu Jan 30 03:01:23 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 08:01:23 -0000 Subject: [Python-checkins] bpo-38631: Replace Py_FatalError() with _PyObject_ASSERT_FAILED_MSG() (GH-18258) Message-ID: https://github.com/python/cpython/commit/5eb8bff7e4aa7e4d8580a30323641388c8ff59a5 commit: 5eb8bff7e4aa7e4d8580a30323641388c8ff59a5 branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T09:01:07+01:00 summary: bpo-38631: Replace Py_FatalError() with _PyObject_ASSERT_FAILED_MSG() (GH-18258) Replace Py_FatalError() with _PyObject_ASSERT_FAILED_MSG() in object.c and typeobject.c to also dump the involved Python object on a fatal error. It should ease debug when such fatal error occurs. If the double linked list is inconsistent, _Py_ForgetReference() no longer dumps previous and next objects in the fatal error, it now only dumps the current object. It ensures that the error message is displayed even if dumping the object does crash Python. Enhance _Py_ForgetReference() error messages; _PyObject_ASSERT_FAILED_MSG() logs the "_Py_ForgetReference" function name. files: M Objects/object.c M Objects/typeobject.c diff --git a/Objects/object.c b/Objects/object.c index 14533dba16d64..aa84114c55471 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -315,30 +315,30 @@ PyObject_CallFinalizer(PyObject *self) int PyObject_CallFinalizerFromDealloc(PyObject *self) { - Py_ssize_t refcnt; - - /* Temporarily resurrect the object. */ if (self->ob_refcnt != 0) { - Py_FatalError("PyObject_CallFinalizerFromDealloc called on " - "object with a non-zero refcount"); + _PyObject_ASSERT_FAILED_MSG(self, + "PyObject_CallFinalizerFromDealloc called " + "on object with a non-zero refcount"); } + + /* Temporarily resurrect the object. */ self->ob_refcnt = 1; PyObject_CallFinalizer(self); - /* Undo the temporary resurrection; can't use DECREF here, it would - * cause a recursive call. - */ _PyObject_ASSERT_WITH_MSG(self, self->ob_refcnt > 0, "refcount is too small"); - if (--self->ob_refcnt == 0) + + /* Undo the temporary resurrection; can't use DECREF here, it would + * cause a recursive call. */ + if (--self->ob_refcnt == 0) { return 0; /* this is the normal path out */ + } /* tp_finalize resurrected it! Make it look like the original Py_DECREF - * never happened. - */ - refcnt = self->ob_refcnt; + * never happened. */ + Py_ssize_t refcnt = self->ob_refcnt; _Py_NewReference(self); self->ob_refcnt = refcnt; @@ -352,8 +352,7 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) * chain, so no more to do there. * If COUNT_ALLOCS, the original decref bumped tp_frees, and * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ + * undone. */ #ifdef COUNT_ALLOCS --Py_TYPE(self)->tp_frees; --Py_TYPE(self)->tp_allocs; @@ -1938,29 +1937,30 @@ _Py_NewReference(PyObject *op) void _Py_ForgetReference(PyObject *op) { -#ifdef SLOW_UNREF_CHECK - PyObject *p; -#endif - if (op->ob_refcnt < 0) - Py_FatalError("UNREF negative refcnt"); + if (op->ob_refcnt < 0) { + _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt"); + } + if (op == &refchain || - op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) { - fprintf(stderr, "* ob\n"); - _PyObject_Dump(op); - fprintf(stderr, "* op->_ob_prev->_ob_next\n"); - _PyObject_Dump(op->_ob_prev->_ob_next); - fprintf(stderr, "* op->_ob_next->_ob_prev\n"); - _PyObject_Dump(op->_ob_next->_ob_prev); - Py_FatalError("UNREF invalid object"); + op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) + { + _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain"); } + #ifdef SLOW_UNREF_CHECK + PyObject *p; for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) { - if (p == op) + if (p == op) { break; + } + } + if (p == &refchain) { + /* Not found */ + _PyObject_ASSERT_FAILED_MSG(op, + "object not found in the objects list"); } - if (p == &refchain) /* Not found */ - Py_FatalError("UNREF unknown object"); #endif + op->_ob_next->_ob_prev = op->_ob_prev; op->_ob_prev->_ob_next = op->_ob_next; op->_ob_next = op->_ob_prev = NULL; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 720363410ceb1..5773eb7096e0c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3570,9 +3570,9 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) for heaptypes. */ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { char msg[200]; - sprintf(msg, "type_traverse() called for non-heap type '%.100s'", + sprintf(msg, "type_traverse() called on non-heap type '%.100s'", type->tp_name); - Py_FatalError(msg); + _PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg); } Py_VISIT(type->tp_dict); From webhook-mailer at python.org Thu Jan 30 03:02:21 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 08:02:21 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in init_slotdefs() (GH-18263) Message-ID: https://github.com/python/cpython/commit/7a1f6c2da46a04d0ff0acc01542f30bfeaf0e0c7 commit: 7a1f6c2da46a04d0ff0acc01542f30bfeaf0e0c7 branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T09:02:14+01:00 summary: bpo-38631: Avoid Py_FatalError() in init_slotdefs() (GH-18263) Rename init_slotdefs() to _PyTypes_InitSlotDefs() and add a return value of type PyStatus. The function is now called exactly once from _PyTypes_Init(). Replace calls to init_slotdefs() with an assertion checking that slotdefs is initialized. files: M Include/internal/pycore_pylifecycle.h M Objects/object.c M Objects/typeobject.c diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 72923498decd0..2dd6149a6b3d3 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -51,6 +51,7 @@ extern int _PyFloat_Init(void); extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyTypes_Init(void); +extern PyStatus _PyTypes_InitSlotDefs(void); extern PyStatus _PyImportZip_Init(PyThreadState *tstate); extern PyStatus _PyGC_Init(PyThreadState *tstate); diff --git a/Objects/object.c b/Objects/object.c index aa84114c55471..c5d28e5f8d758 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -6,6 +6,7 @@ #include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "frameobject.h" #include "interpreteridobject.h" @@ -1841,6 +1842,11 @@ PyObject _Py_NotImplementedStruct = { PyStatus _PyTypes_Init(void) { + PyStatus status = _PyTypes_InitSlotDefs(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + #define INIT_TYPE(TYPE, NAME) \ do { \ if (PyType_Ready(TYPE) < 0) { \ diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 5773eb7096e0c..b095e2921dcf2 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2,6 +2,7 @@ #include "Python.h" #include "pycore_call.h" +#include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" @@ -6932,7 +6933,8 @@ which incorporates the additional structures used for numbers, sequences and mappings. Note that multiple names may map to the same slot (e.g. __eq__, __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with -an all-zero entry. (This table is further initialized in init_slotdefs().) +an all-zero entry. (This table is further initialized in +_PyTypes_InitSlotDefs().) */ typedef struct wrapperbase slotdef; @@ -7423,28 +7425,29 @@ update_slots_callback(PyTypeObject *type, void *data) static int slotdefs_initialized = 0; /* Initialize the slotdefs table by adding interned string objects for the names. */ -static void -init_slotdefs(void) +PyStatus +_PyTypes_InitSlotDefs(void) { - slotdef *p; + if (slotdefs_initialized) { + return _PyStatus_OK(); + } - if (slotdefs_initialized) - return; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); p->name_strobj = PyUnicode_InternFromString(p->name); - if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) - Py_FatalError("Out of memory interning slotdef names"); + if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { + return _PyStatus_NO_MEMORY(); + } } slotdefs_initialized = 1; + return _PyStatus_OK(); } -/* Undo init_slotdefs, releasing the interned strings. */ +/* Undo _PyTypes_InitSlotDefs(), releasing the interned strings. */ static void clear_slotdefs(void) { - slotdef *p; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { Py_CLEAR(p->name_strobj); } slotdefs_initialized = 0; @@ -7462,7 +7465,7 @@ update_slot(PyTypeObject *type, PyObject *name) assert(PyUnicode_CheckExact(name)); assert(PyUnicode_CHECK_INTERNED(name)); - init_slotdefs(); + assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { if (p->name_strobj == name) @@ -7490,7 +7493,7 @@ fixup_slot_dispatchers(PyTypeObject *type) { slotdef *p; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; ) p = update_one_slot(type, p); } @@ -7503,7 +7506,7 @@ update_all_slots(PyTypeObject* type) /* Clear the VALID_VERSION flag of 'type' and all its subclasses. */ PyType_Modified(type); - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { /* update_slot returns int but can't actually fail */ update_slot(type, p->name_strobj); @@ -7663,7 +7666,7 @@ add_operators(PyTypeObject *type) PyObject *descr; void **ptr; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { if (p->wrapper == NULL) continue; From webhook-mailer at python.org Thu Jan 30 03:02:56 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 08:02:56 -0000 Subject: [Python-checkins] bpo-38631: Replace tp_new_wrapper() fatal error with SystemError (GH-18262) Message-ID: https://github.com/python/cpython/commit/2bf127d97bd1d60ead7c20d429b0c61ef61fc554 commit: 2bf127d97bd1d60ead7c20d429b0c61ef61fc554 branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T09:02:49+01:00 summary: bpo-38631: Replace tp_new_wrapper() fatal error with SystemError (GH-18262) tp_new_wrapper() now raises a SystemError if called with non-type self, rather than calling Py_FatalError() which cannot be catched. files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b095e2921dcf2..8422a3c5a38c4 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6042,8 +6042,12 @@ tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) PyTypeObject *type, *subtype, *staticbase; PyObject *arg0, *res; - if (self == NULL || !PyType_Check(self)) - Py_FatalError("__new__() called with non-type 'self'"); + if (self == NULL || !PyType_Check(self)) { + PyErr_Format(PyExc_SystemError, + "__new__() called with non-type 'self'"); + return NULL; + } + type = (PyTypeObject *)self; if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) { PyErr_Format(PyExc_TypeError, From webhook-mailer at python.org Thu Jan 30 03:56:45 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 08:56:45 -0000 Subject: [Python-checkins] bpo-39353: binascii.crc_hqx() is no longer deprecated (GH-18276) Message-ID: https://github.com/python/cpython/commit/c38fd0df2b4cbc1cc906d8dfe23f63b67cd6965f commit: c38fd0df2b4cbc1cc906d8dfe23f63b67cd6965f branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T09:56:40+01:00 summary: bpo-39353: binascii.crc_hqx() is no longer deprecated (GH-18276) The binascii.crc_hqx() function is no longer deprecated. files: A Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst M Doc/library/binascii.rst M Doc/whatsnew/3.9.rst M Lib/binhex.py M Lib/test/test_binascii.py M Modules/binascii.c diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index aa2a27084c34c..2c0c1bce5d7f8 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -132,8 +132,6 @@ The :mod:`binascii` module defines the following functions: *x*:sup:`16` + *x*:sup:`12` + *x*:sup:`5` + 1, often represented as 0x1021. This CRC is used in the binhex4 format. - .. deprecated:: 3.9 - .. function:: crc32(data[, value]) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a4c4266bfc35d..c8f407751ec5e 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -379,7 +379,6 @@ Deprecated * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` - * :func:`~binascii.crc_hqx` (Contributed by Victor Stinner in :issue:`39353`.) diff --git a/Lib/binhex.py b/Lib/binhex.py index 6ff38dd8229c8..9559f46d5a288 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -200,8 +200,7 @@ def _writeinfo(self, name, finfo): self._writecrc() def _write(self, data): - with _ignore_deprecation_warning(): - self.crc = binascii.crc_hqx(data, self.crc) + self.crc = binascii.crc_hqx(data, self.crc) self.ofp.write(data) def _writecrc(self): @@ -396,8 +395,7 @@ def __init__(self, ifp): def _read(self, len): data = self.ifp.read(len) - with _ignore_deprecation_warning(): - self.crc = binascii.crc_hqx(data, self.crc) + self.crc = binascii.crc_hqx(data, self.crc) return data def _checkcrc(self): diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 649edbe295413..45327953a7701 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -435,9 +435,6 @@ def test_deprecated_warnings(self): with self.assertWarns(DeprecationWarning): self.assertEqual(binascii.rledecode_hqx(b'a\x90\n'), b'a' * 10) - with self.assertWarns(DeprecationWarning): - self.assertEqual(binascii.crc_hqx(b'abc', 0), 40406) - class ArrayBinASCIITest(BinASCIITest): def type2test(self, s): diff --git a/Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst b/Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst new file mode 100644 index 0000000000000..b6db7c5c58842 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst @@ -0,0 +1 @@ +The :func:`binascii.crc_hqx` function is no longer deprecated. diff --git a/Modules/binascii.c b/Modules/binascii.c index c6da3e0a635bc..e428b0d6f963f 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -965,11 +965,6 @@ static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) /*[clinic end generated code: output=2fde213d0f547a98 input=56237755370a951c]*/ { - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "binascii.crc_hqx() is deprecated", 1) < 0) { - return NULL; - } - const unsigned char *bin_data; Py_ssize_t len; From webhook-mailer at python.org Thu Jan 30 04:39:33 2020 From: webhook-mailer at python.org (Alex Henrie) Date: Thu, 30 Jan 2020 09:39:33 -0000 Subject: [Python-checkins] bpo-39497: Remove unused variable from pysqlite_cursor_executescript (GH-18271) Message-ID: https://github.com/python/cpython/commit/1f44e775df8e7ec3ca60a1135cb3279f8b9dca3e commit: 1f44e775df8e7ec3ca60a1135cb3279f8b9dca3e branch: master author: Alex Henrie committer: GitHub date: 2020-01-30T12:39:25+03:00 summary: bpo-39497: Remove unused variable from pysqlite_cursor_executescript (GH-18271) files: M Modules/_sqlite/cursor.c diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 47dbc77474120..2302ca9edac2d 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -611,7 +611,6 @@ static PyObject * pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) { PyObject* script_obj; - PyObject* script_str = NULL; const char* script_cstr; sqlite3_stmt* statement; int rc; @@ -685,8 +684,6 @@ pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) } error: - Py_XDECREF(script_str); - if (PyErr_Occurred()) { return NULL; } else { From webhook-mailer at python.org Thu Jan 30 05:26:30 2020 From: webhook-mailer at python.org (damani42) Date: Thu, 30 Jan 2020 10:26:30 -0000 Subject: [Python-checkins] bpo-39424: Use assertRaisesRegex instead of assertRaisesRegexp. (GH-18277) Message-ID: https://github.com/python/cpython/commit/38c878b56cff997de8fb04a586c963039b69b414 commit: 38c878b56cff997de8fb04a586c963039b69b414 branch: master author: damani42 <56308939+damani42 at users.noreply.github.com> committer: GitHub date: 2020-01-30T12:26:22+02:00 summary: bpo-39424: Use assertRaisesRegex instead of assertRaisesRegexp. (GH-18277) files: M Lib/test/test_signal.py diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 5b072b0c60ee3..45553a6a42de7 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -1289,7 +1289,7 @@ def test_pidfd_send_signal(self): self.assertEqual(cm.exception.errno, errno.EBADF) my_pidfd = os.open(f'/proc/{os.getpid()}', os.O_DIRECTORY) self.addCleanup(os.close, my_pidfd) - with self.assertRaisesRegexp(TypeError, "^siginfo must be None$"): + with self.assertRaisesRegex(TypeError, "^siginfo must be None$"): signal.pidfd_send_signal(my_pidfd, signal.SIGINT, object(), 0) with self.assertRaises(KeyboardInterrupt): signal.pidfd_send_signal(my_pidfd, signal.SIGINT) From webhook-mailer at python.org Thu Jan 30 06:18:39 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 11:18:39 -0000 Subject: [Python-checkins] bpo-38631: Avoid Py_FatalError() in unicodeobject.c (GH-18281) Message-ID: https://github.com/python/cpython/commit/ec3c99c8a73650d7833189bd973ec492564aa479 commit: ec3c99c8a73650d7833189bd973ec492564aa479 branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T12:18:32+01:00 summary: bpo-38631: Avoid Py_FatalError() in unicodeobject.c (GH-18281) Replace Py_FatalError() calls with _PyErr_WriteUnraisableMsg(), _PyObject_ASSERT_FAILED_MSG() or Py_UNREACHABLE() in unicode_dealloc() and unicode_release_interned(). files: M Objects/unicodeobject.c diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1ec2accdb09f2..8e1161e5387b4 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1900,25 +1900,29 @@ unicode_dealloc(PyObject *unicode) case SSTATE_INTERNED_MORTAL: /* revive dead object temporarily for DelItem */ Py_REFCNT(unicode) = 3; - if (PyDict_DelItem(interned, unicode) != 0) - Py_FatalError( - "deletion of interned string failed"); + if (PyDict_DelItem(interned, unicode) != 0) { + _PyErr_WriteUnraisableMsg("deletion of interned string failed", + NULL); + } break; case SSTATE_INTERNED_IMMORTAL: - Py_FatalError("Immortal interned string died."); - /* fall through */ + _PyObject_ASSERT_FAILED_MSG(unicode, "Immortal interned string died"); + break; default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } - if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) + if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_WSTR(unicode)); - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) + } + if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_UTF8(unicode)); - if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) + } + if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) { PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); + } Py_TYPE(unicode)->tp_free(unicode); } @@ -15401,14 +15405,10 @@ PyUnicode_InternFromString(const char *cp) static void unicode_release_interned(void) { - PyObject *keys; - PyObject *s; - Py_ssize_t i, n; - Py_ssize_t immortal_size = 0, mortal_size = 0; - - if (interned == NULL || !PyDict_Check(interned)) + if (interned == NULL || !PyDict_Check(interned)) { return; - keys = PyDict_Keys(interned); + } + PyObject *keys = PyDict_Keys(interned); if (keys == NULL || !PyList_Check(keys)) { PyErr_Clear(); return; @@ -15419,30 +15419,35 @@ unicode_release_interned(void) rather, we give them their stolen references back, and then clear and DECREF the interned dict. */ - n = PyList_GET_SIZE(keys); + Py_ssize_t n = PyList_GET_SIZE(keys); #ifdef INTERNED_STATS fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", n); + + Py_ssize_t immortal_size = 0, mortal_size = 0; #endif - for (i = 0; i < n; i++) { - s = PyList_GET_ITEM(keys, i); + for (Py_ssize_t i = 0; i < n; i++) { + PyObject *s = PyList_GET_ITEM(keys, i); if (PyUnicode_READY(s) == -1) { Py_UNREACHABLE(); } switch (PyUnicode_CHECK_INTERNED(s)) { - case SSTATE_NOT_INTERNED: - /* XXX Shouldn't happen */ - break; case SSTATE_INTERNED_IMMORTAL: Py_REFCNT(s) += 1; +#ifdef INTERNED_STATS immortal_size += PyUnicode_GET_LENGTH(s); +#endif break; case SSTATE_INTERNED_MORTAL: Py_REFCNT(s) += 2; +#ifdef INTERNED_STATS mortal_size += PyUnicode_GET_LENGTH(s); +#endif break; + case SSTATE_NOT_INTERNED: + /* fall through */ default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } From webhook-mailer at python.org Thu Jan 30 06:20:55 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 11:20:55 -0000 Subject: [Python-checkins] bpo-38631: Replace Py_FatalError() with assert() in ceval.c (GH-18279) Message-ID: https://github.com/python/cpython/commit/17c68b8107e348aeaaa05f7ac5072cacff916022 commit: 17c68b8107e348aeaaa05f7ac5072cacff916022 branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T12:20:48+01:00 summary: bpo-38631: Replace Py_FatalError() with assert() in ceval.c (GH-18279) Replace a few Py_FatalError() calls if tstate is NULL with assert(tstate != NULL) in ceval.c. PyEval_AcquireThread(), PyEval_ReleaseThread() and PyEval_RestoreThread() must never be called with a NULL tstate. files: M Doc/c-api/init.rst M Python/ceval.c diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 8913dbfe249dc..7ea48aec009c9 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1110,7 +1110,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate) Acquire the global interpreter lock and set the current thread state to - *tstate*, which should not be ``NULL``. The lock must have been created earlier. + *tstate*, which must not be ``NULL``. The lock must have been created earlier. If this thread already has the lock, deadlock ensues. .. note:: diff --git a/Python/ceval.c b/Python/ceval.c index 2770dc6d08dd2..2bf64eda4224a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -302,9 +302,7 @@ PyEval_ReleaseLock(void) void PyEval_AcquireThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL new thread state"); - } + assert(tstate != NULL); _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; @@ -321,9 +319,7 @@ PyEval_AcquireThread(PyThreadState *tstate) void PyEval_ReleaseThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL thread state"); - } + assert(tstate != NULL); _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); @@ -385,12 +381,10 @@ PyEval_SaveThread(void) void PyEval_RestoreThread(PyThreadState *tstate) { + assert(tstate != NULL); + _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; - - if (tstate == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL tstate"); - } assert(gil_created(&ceval->gil)); int err = errno; From webhook-mailer at python.org Thu Jan 30 07:09:19 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 12:09:19 -0000 Subject: [Python-checkins] bpo-38631: Add _Py_NO_RETURN to functions calling Py_FatalError() (GH-18278) Message-ID: https://github.com/python/cpython/commit/2a4903fcce54c25807d362dbbbcfb32d0b494f9f commit: 2a4903fcce54c25807d362dbbbcfb32d0b494f9f branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T13:09:11+01:00 summary: bpo-38631: Add _Py_NO_RETURN to functions calling Py_FatalError() (GH-18278) Add _Py_NO_RETURN to functions calling Py_FatalError(): * _PyObject_AssertFailed() * dummy_dealloc() * faulthandler_fatal_error_thread() * none_dealloc() * notimplemented_dealloc() files: M Include/cpython/object.h M Modules/faulthandler.c M Objects/object.c M Objects/setobject.c diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 75e55995b5741..dc8fd6fa8987d 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -443,7 +443,7 @@ _PyObject_DebugTypeStats(FILE *out); NDEBUG against a Python built with NDEBUG defined. msg, expr and function can be NULL. */ -PyAPI_FUNC(void) _PyObject_AssertFailed( +PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed( PyObject *obj, const char *expr, const char *msg, diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index b19401e94d85a..555e1afc9f82a 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1065,24 +1065,10 @@ faulthandler_sigsegv(PyObject *self, PyObject *args) Py_RETURN_NONE; } -static void +static void _Py_NO_RETURN faulthandler_fatal_error_thread(void *plock) { -#ifndef __clang__ - PyThread_type_lock *lock = (PyThread_type_lock *)plock; -#endif - Py_FatalError("in new thread"); - -#ifndef __clang__ - /* Issue #28152: Py_FatalError() is declared with - __attribute__((__noreturn__)). GCC emits a warning without - "PyThread_release_lock()" (compiler bug?), but Clang is smarter and - emits a warning on the return. */ - - /* notify the caller that we are done */ - PyThread_release_lock(lock); -#endif } static PyObject * diff --git a/Objects/object.c b/Objects/object.c index c5d28e5f8d758..67a6386e2a51d 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1646,7 +1646,7 @@ none_repr(PyObject *op) } /* ARGUSED */ -static void +static void _Py_NO_RETURN none_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -1784,7 +1784,7 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_RETURN_NOTIMPLEMENTED; } -static void +static void _Py_NO_RETURN notimplemented_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -2225,7 +2225,7 @@ _PyTrash_thread_destroy_chain(void) } -void +void _Py_NO_RETURN _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, const char *file, int line, const char *function) { diff --git a/Objects/setobject.c b/Objects/setobject.c index 924885d7505a0..bb7c0b8f0456b 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2529,7 +2529,7 @@ dummy_repr(PyObject *op) return PyUnicode_FromString(""); } -static void +static void _Py_NO_RETURN dummy_dealloc(PyObject* ignore) { Py_FatalError("deallocating "); From webhook-mailer at python.org Thu Jan 30 08:23:45 2020 From: webhook-mailer at python.org (Dong-hee Na) Date: Thu, 30 Jan 2020 13:23:45 -0000 Subject: [Python-checkins] bpo-39434: Improve float __floordiv__ performance and error message (GH-18147) Message-ID: https://github.com/python/cpython/commit/8d49f7ceb4f961770ae61fe6a4033c4e61cc3288 commit: 8d49f7ceb4f961770ae61fe6a4033c4e61cc3288 branch: master author: Dong-hee Na committer: GitHub date: 2020-01-30T13:23:15Z summary: bpo-39434: Improve float __floordiv__ performance and error message (GH-18147) files: A Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst M Objects/floatobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst new file mode 100644 index 0000000000000..e5a413323ac43 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst @@ -0,0 +1,3 @@ +:term:`floor division` of float operation now has a better performance. Also +the message of :exc:`ZeroDivisionError` for this operation is updated. +Patch by Dong-hee Na. diff --git a/Objects/floatobject.c b/Objects/floatobject.c index d67f17abb5c27..89f60b65cd55c 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -611,29 +611,22 @@ float_rem(PyObject *v, PyObject *w) return PyFloat_FromDouble(mod); } -static PyObject * -float_divmod(PyObject *v, PyObject *w) +static void +_float_div_mod(double vx, double wx, double *floordiv, double *mod) { - double vx, wx; - double div, mod, floordiv; - CONVERT_TO_DOUBLE(v, vx); - CONVERT_TO_DOUBLE(w, wx); - if (wx == 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); - return NULL; - } - mod = fmod(vx, wx); + double div; + *mod = fmod(vx, wx); /* fmod is typically exact, so vx-mod is *mathematically* an exact multiple of wx. But this is fp arithmetic, and fp vx - mod is an approximation; the result is that div may not be an exact integral value after the division, although it will always be very close to one. */ - div = (vx - mod) / wx; - if (mod) { + div = (vx - *mod) / wx; + if (*mod) { /* ensure the remainder has the same sign as the denominator */ - if ((wx < 0) != (mod < 0)) { - mod += wx; + if ((wx < 0) != (*mod < 0)) { + *mod += wx; div -= 1.0; } } @@ -641,34 +634,49 @@ float_divmod(PyObject *v, PyObject *w) /* the remainder is zero, and in the presence of signed zeroes fmod returns different results across platforms; ensure it has the same sign as the denominator. */ - mod = copysign(0.0, wx); + *mod = copysign(0.0, wx); } /* snap quotient to nearest integral value */ if (div) { - floordiv = floor(div); - if (div - floordiv > 0.5) - floordiv += 1.0; + *floordiv = floor(div); + if (div - *floordiv > 0.5) { + *floordiv += 1.0; + } } else { /* div is zero - get the same sign as the true quotient */ - floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ + *floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ } - return Py_BuildValue("(dd)", floordiv, mod); +} + +static PyObject * +float_divmod(PyObject *v, PyObject *w) +{ + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return Py_BuildValue("(dd)", floordiv, mod); } static PyObject * float_floor_div(PyObject *v, PyObject *w) { - PyObject *t, *r; - - t = float_divmod(v, w); - if (t == NULL || t == Py_NotImplemented) - return t; - assert(PyTuple_CheckExact(t)); - r = PyTuple_GET_ITEM(t, 0); - Py_INCREF(r); - Py_DECREF(t); - return r; + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return PyFloat_FromDouble(floordiv); } /* determine whether x is an odd integer or not; assumes that From webhook-mailer at python.org Thu Jan 30 09:47:58 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 30 Jan 2020 14:47:58 -0000 Subject: [Python-checkins] bpo-39502: Skip test_zipfile.test_add_file_after_2107() on AIX (GH-18282) Message-ID: https://github.com/python/cpython/commit/c232c9110cfefa0935cbf158e35e91746a8a9361 commit: c232c9110cfefa0935cbf158e35e91746a8a9361 branch: master author: Victor Stinner committer: GitHub date: 2020-01-30T15:47:53+01:00 summary: bpo-39502: Skip test_zipfile.test_add_file_after_2107() on AIX (GH-18282) Skip test_zipfile.test_add_file_after_2107() if time.localtime() fails with OverflowError. It is the case on AIX 6.1 for example. files: A Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst M Lib/test/test_zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 4c20bfd7e2cd7..c334715f3d81b 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -611,8 +611,13 @@ def test_add_file_before_1980(self): def test_add_file_after_2107(self): # Set atime and mtime to 2108-12-30 + ts = 4386268800 try: - os.utime(TESTFN, (4386268800, 4386268800)) + time.localtime(ts) + except OverflowError: + self.skipTest(f'time.localtime({ts}) raises OverflowError') + try: + os.utime(TESTFN, (ts, ts)) except OverflowError: self.skipTest('Host fs cannot set timestamp to required value.') diff --git a/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst b/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst new file mode 100644 index 0000000000000..0a13746e34759 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst @@ -0,0 +1,2 @@ +Skip test_zipfile.test_add_file_after_2107() if :func:`time.localtime` fails +with :exc:`OverflowError`. It is the case on AIX 6.1 for example. From webhook-mailer at python.org Thu Jan 30 10:05:15 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 30 Jan 2020 15:05:15 -0000 Subject: [Python-checkins] bpo-39502: Skip test_zipfile.test_add_file_after_2107() on AIX (GH-18282) Message-ID: https://github.com/python/cpython/commit/b841633cc2d7619cf4a7db108d91b14926450a6e commit: b841633cc2d7619cf4a7db108d91b14926450a6e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-30T07:05:08-08:00 summary: bpo-39502: Skip test_zipfile.test_add_file_after_2107() on AIX (GH-18282) Skip test_zipfile.test_add_file_after_2107() if time.localtime() fails with OverflowError. It is the case on AIX 6.1 for example. (cherry picked from commit c232c9110cfefa0935cbf158e35e91746a8a9361) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst M Lib/test/test_zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 0737c343cbf5f..c65de9202c0c4 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -597,8 +597,13 @@ def test_add_file_before_1980(self): def test_add_file_after_2107(self): # Set atime and mtime to 2108-12-30 + ts = 4386268800 try: - os.utime(TESTFN, (4386268800, 4386268800)) + time.localtime(ts) + except OverflowError: + self.skipTest(f'time.localtime({ts}) raises OverflowError') + try: + os.utime(TESTFN, (ts, ts)) except OverflowError: self.skipTest('Host fs cannot set timestamp to required value.') diff --git a/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst b/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst new file mode 100644 index 0000000000000..0a13746e34759 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst @@ -0,0 +1,2 @@ +Skip test_zipfile.test_add_file_after_2107() if :func:`time.localtime` fails +with :exc:`OverflowError`. It is the case on AIX 6.1 for example. From webhook-mailer at python.org Thu Jan 30 18:20:56 2020 From: webhook-mailer at python.org (Hai Shi) Date: Thu, 30 Jan 2020 23:20:56 -0000 Subject: [Python-checkins] bpo-39487: Merge duplicated _Py_IDENTIFIER identifiers in C code (GH-18254) Message-ID: https://github.com/python/cpython/commit/46874c26ee1fc752e2e6930efa1d223b2351edb8 commit: 46874c26ee1fc752e2e6930efa1d223b2351edb8 branch: master author: Hai Shi committer: GitHub date: 2020-01-30T15:20:25-08:00 summary: bpo-39487: Merge duplicated _Py_IDENTIFIER identifiers in C code (GH-18254) Moving repetitive `_Py_IDENTIFIER` instances to a global location helps identify them more easily in regards to sub-interpreter support. files: M Objects/bytesobject.c M Objects/descrobject.c M Objects/fileobject.c M Objects/iterobject.c M Objects/moduleobject.c M Objects/odictobject.c M Objects/rangeobject.c M Objects/typeobject.c M Python/_warnings.c M Python/ceval.c M Python/errors.c M Python/import.c diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index f9823f18e8699..5fd92f72a536a 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -25,6 +25,8 @@ Py_ssize_t _Py_null_strings, _Py_one_strings; static PyBytesObject *characters[UCHAR_MAX + 1]; static PyBytesObject *nullstring; +_Py_IDENTIFIER(__bytes__); + /* PyBytesObject_SIZE gives the basic size of a string; any memory allocation for a string of length n should request PyBytesObject_SIZE + n bytes. @@ -543,7 +545,6 @@ static PyObject * format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) { PyObject *func, *result; - _Py_IDENTIFIER(__bytes__); /* is it a bytes object? */ if (PyBytes_Check(v)) { *pbuf = PyBytes_AS_STRING(v); @@ -2485,7 +2486,6 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *func; Py_ssize_t size; static char *kwlist[] = {"source", "encoding", "errors", 0}; - _Py_IDENTIFIER(__bytes__); if (type != &PyBytes_Type) return bytes_subtype_new(type, args, kwds); diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 342b993e09039..b9b16d6d0a37d 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -6,6 +6,8 @@ #include "pycore_tupleobject.h" #include "structmember.h" /* Why is this not included in Python.h? */ +_Py_IDENTIFIER(getattr); + /*[clinic input] class mappingproxy "mappingproxyobject *" "&PyDictProxy_Type" class property "propertyobject *" "&PyProperty_Type" @@ -571,7 +573,6 @@ descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored)) static PyObject * descr_reduce(PyDescrObject *descr, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), PyDescr_TYPE(descr), PyDescr_NAME(descr)); } @@ -1240,7 +1241,6 @@ wrapper_repr(wrapperobject *wp) static PyObject * wrapper_reduce(wrapperobject *wp, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), wp->self, PyDescr_NAME(wp->descr)); } diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 3ec5a00f30f6a..527693c80998f 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -25,6 +25,8 @@ extern "C" { #endif +_Py_IDENTIFIER(open); + /* External C interface */ PyObject * @@ -32,7 +34,6 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c const char *errors, const char *newline, int closefd) { PyObject *io, *stream; - _Py_IDENTIFIER(open); /* import _io in case we are being used to open io.py */ io = PyImport_ImportModule("_io"); @@ -547,7 +548,6 @@ PyObject * PyFile_OpenCodeObject(PyObject *path) { PyObject *iomod, *f = NULL; - _Py_IDENTIFIER(open); if (!PyUnicode_Check(path)) { PyErr_Format(PyExc_TypeError, "'path' must be 'str', not '%.200s'", diff --git a/Objects/iterobject.c b/Objects/iterobject.c index da89298edc5cf..fe1de7e211c5d 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -11,6 +11,8 @@ typedef struct { PyObject *it_seq; /* Set to NULL when iterator is exhausted */ } seqiterobject; +_Py_IDENTIFIER(iter); + PyObject * PySeqIter_New(PyObject *seq) { @@ -104,7 +106,6 @@ PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list( static PyObject * iter_reduce(seqiterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_seq != NULL) return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter), it->it_seq, it->it_index); @@ -244,7 +245,6 @@ calliter_iternext(calliterobject *it) static PyObject * calliter_reduce(calliterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_callable != NULL && it->it_sentinel != NULL) return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_iter), it->it_callable, it->it_sentinel); diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 912c258401586..49cfd574d5664 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -7,6 +7,10 @@ static Py_ssize_t max_module_number; +_Py_IDENTIFIER(__doc__); +_Py_IDENTIFIER(__name__); +_Py_IDENTIFIER(__spec__); + typedef struct { PyObject_HEAD PyObject *md_dict; @@ -58,11 +62,8 @@ static int module_init_dict(PyModuleObject *mod, PyObject *md_dict, PyObject *name, PyObject *doc) { - _Py_IDENTIFIER(__name__); - _Py_IDENTIFIER(__doc__); _Py_IDENTIFIER(__package__); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__spec__); if (md_dict == NULL) return -1; @@ -461,7 +462,6 @@ int PyModule_SetDocString(PyObject *m, const char *doc) { PyObject *v; - _Py_IDENTIFIER(__doc__); v = PyUnicode_FromString(doc); if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) { @@ -488,7 +488,6 @@ PyModule_GetDict(PyObject *m) PyObject* PyModule_GetNameObject(PyObject *m) { - _Py_IDENTIFIER(__name__); PyObject *d; PyObject *name; if (!PyModule_Check(m)) { @@ -741,10 +740,8 @@ module_getattro(PyModuleObject *m, PyObject *name) if (getattr) { return _PyObject_CallOneArg(getattr, name); } - _Py_IDENTIFIER(__name__); mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__); if (mod_name && PyUnicode_Check(mod_name)) { - _Py_IDENTIFIER(__spec__); Py_INCREF(mod_name); PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__); Py_XINCREF(spec); diff --git a/Objects/odictobject.c b/Objects/odictobject.c index dfbd30a976caf..45e089be2871e 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -526,6 +526,8 @@ struct _odictnode { #define _odict_FOREACH(od, node) \ for (node = _odict_FIRST(od); node != NULL; node = _odictnode_NEXT(node)) +_Py_IDENTIFIER(items); + /* Return the index into the hash table, regardless of a valid node. */ static Py_ssize_t _odict_get_index_raw(PyODictObject *od, PyObject *key, Py_hash_t hash) @@ -896,7 +898,6 @@ static PyObject * odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(items); PyObject *dict = NULL, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -1375,7 +1376,6 @@ static PyObject * odict_repr(PyODictObject *self) { int i; - _Py_IDENTIFIER(items); PyObject *pieces = NULL, *result = NULL; if (PyODict_SIZE(self) == 0) @@ -2195,7 +2195,6 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) { int res = 0; Py_ssize_t len; - _Py_IDENTIFIER(items); _Py_IDENTIFIER(keys); /* first handle args, if any */ diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 9311f8b1f174c..e7168209324ed 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -18,6 +18,8 @@ typedef struct { PyObject *length; } rangeobject; +_Py_IDENTIFIER(iter); + /* Helper function for validating step. Always returns a new reference or NULL on error. */ @@ -757,7 +759,6 @@ PyDoc_STRVAR(length_hint_doc, static PyObject * rangeiter_reduce(rangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *start=NULL, *stop=NULL, *step=NULL; PyObject *range; @@ -915,7 +916,6 @@ longrangeiter_len(longrangeiterobject *r, PyObject *no_args) static PyObject * longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *product, *stop=NULL; PyObject *range; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 8422a3c5a38c4..01def837803d2 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -74,6 +74,7 @@ _Py_IDENTIFIER(__new__); _Py_IDENTIFIER(__set_name__); _Py_IDENTIFIER(__setitem__); _Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(mro); static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -310,7 +311,6 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { return; if (custom) { - _Py_IDENTIFIER(mro); mro_meth = lookup_maybe_method( (PyObject *)type, &PyId_mro, &unbound); if (mro_meth == NULL) @@ -1891,7 +1891,6 @@ mro_invoke(PyTypeObject *type) int custom = (Py_TYPE(type) != &PyType_Type); if (custom) { - _Py_IDENTIFIER(mro); int unbound; PyObject *mro_meth = lookup_method((PyObject *)type, &PyId_mro, &unbound); diff --git a/Python/_warnings.c b/Python/_warnings.c index b8585d204787d..602211c02efa0 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -24,6 +24,8 @@ typedef struct _warnings_runtime_state WarningsState; /* Forward declaration of the _warnings module definition. */ static struct PyModuleDef warningsmodule; +_Py_IDENTIFIER(__name__); + /* Given a module object, get its per-module state. */ static WarningsState * _Warnings_GetState() @@ -484,7 +486,6 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject *f_stderr; PyObject *name; char lineno_str[128]; - _Py_IDENTIFIER(__name__); PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); @@ -818,7 +819,6 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, PyObject **module, PyObject **registry) { _Py_IDENTIFIER(__warningregistry__); - _Py_IDENTIFIER(__name__); PyObject *globals; /* Setup globals, filename and lineno. */ @@ -969,7 +969,6 @@ get_source_line(PyObject *module_globals, int lineno) { _Py_IDENTIFIER(get_source); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__name__); PyObject *loader; PyObject *module_name; PyObject *get_source; diff --git a/Python/ceval.c b/Python/ceval.c index 2bf64eda4224a..892d668816ab9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -39,6 +39,7 @@ # error "ceval.c must be build with Py_BUILD_CORE define for best performance" #endif +_Py_IDENTIFIER(__name__); /* Forward declarations */ Py_LOCAL_INLINE(PyObject *) call_function( @@ -5032,7 +5033,6 @@ static PyObject * import_from(PyThreadState *tstate, PyObject *v, PyObject *name) { PyObject *x; - _Py_IDENTIFIER(__name__); PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg; if (_PyObject_LookupAttr(v, name, &x) != 0) { @@ -5108,7 +5108,6 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) { _Py_IDENTIFIER(__all__); _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(__name__); PyObject *all, *dict, *name, *value; int skip_leading_underscores = 0; int pos, err; diff --git a/Python/errors.c b/Python/errors.c index 18ea9c5652a46..652f4c9de7a84 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -24,11 +24,11 @@ extern char *strerror(int); extern "C" { #endif +_Py_IDENTIFIER(__module__); _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(flush); - /* Forward declarations */ static PyObject * _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, @@ -1009,7 +1009,6 @@ PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) { PyThreadState *tstate = _PyThreadState_GET(); - _Py_IDENTIFIER(__module__); PyObject *modulename = NULL; PyObject *classname = NULL; PyObject *mydict = NULL; @@ -1235,7 +1234,6 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } } - _Py_IDENTIFIER(__module__); PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { Py_XDECREF(moduleName); diff --git a/Python/import.c b/Python/import.c index 2e5f78382ed44..9838c3fa04538 100644 --- a/Python/import.c +++ b/Python/import.c @@ -39,6 +39,9 @@ extern struct _inittab _PyImport_Inittab[]; struct _inittab *PyImport_Inittab = _PyImport_Inittab; static struct _inittab *inittab_copy = NULL; +_Py_IDENTIFIER(__path__); +_Py_IDENTIFIER(__spec__); + /*[clinic input] module _imp [clinic start generated code]*/ @@ -383,7 +386,6 @@ import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) PyInterpreterState *interp = tstate->interp; PyObject *spec; - _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(_lock_unlock_module); /* Optimization: only call _bootstrap._lock_unlock_module() if @@ -1566,9 +1568,7 @@ remove_importlib_frames(PyThreadState *tstate) static PyObject * resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level) { - _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(__package__); - _Py_IDENTIFIER(__path__); _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(parent); PyObject *abs_name; @@ -1930,7 +1930,6 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } } else { - _Py_IDENTIFIER(__path__); PyObject *path; if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) { goto error; From webhook-mailer at python.org Thu Jan 30 20:55:50 2020 From: webhook-mailer at python.org (Zackery Spytz) Date: Fri, 31 Jan 2020 01:55:50 -0000 Subject: [Python-checkins] bpo-38792: Remove IDLE shell calltip before new prompt. (#17150) Message-ID: https://github.com/python/cpython/commit/bfdeaa37b3df7466624c17f9450d2bd1c3d95edf commit: bfdeaa37b3df7466624c17f9450d2bd1c3d95edf branch: master author: Zackery Spytz committer: GitHub date: 2020-01-30T20:55:42-05:00 summary: bpo-38792: Remove IDLE shell calltip before new prompt. (#17150) Previously, a calltip might be left after SyntaxError, KeyboardInterrupt, or Shell Restart. Co-authored-by: Terry Jan Reedy Co-authored-by: Tal Einat files: A Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/calltip.py M Lib/idlelib/editor.py M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 2b543985b3783..d57ba7e6bac90 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. + bpo-30780: Add remaining configdialog tests for buttons and highlights and keys tabs. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index a3dda2678bd4d..2e0db60d476ae 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -33,7 +33,7 @@ def _make_tk_calltip_window(self): # See __init__ for usage return calltip_w.CalltipWindow(self.text) - def _remove_calltip_window(self, event=None): + def remove_calltip_window(self, event=None): if self.active_calltip: self.active_calltip.hidetip() self.active_calltip = None @@ -55,7 +55,7 @@ def refresh_calltip_event(self, event): self.open_calltip(False) def open_calltip(self, evalfuncs): - self._remove_calltip_window() + self.remove_calltip_window() hp = HyperParser(self.editwin, "insert") sur_paren = hp.get_surrounding_brackets('(') diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index c9f1a1625ca5e..04c786dc5234c 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -328,7 +328,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): text.bind("<>", scriptbinding.run_module_event) text.bind("<>", scriptbinding.run_custom_event) text.bind("<>", self.Rstrip(self).do_rstrip) - ctip = self.Calltip(self) + self.ctip = ctip = self.Calltip(self) text.bind("<>", ctip.try_open_calltip_event) #refresh-calltip must come after paren-closed to work right text.bind("<>", ctip.refresh_calltip_event) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 065122dec7a73..d5b310ffd7a9b 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1292,6 +1292,7 @@ def resetoutput(self): self.text.insert("end-1c", "\n") self.text.mark_set("iomark", "end-1c") self.set_line_and_column() + self.ctip.remove_calltip_window() def write(self, s, tags=()): try: diff --git a/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst new file mode 100644 index 0000000000000..9aa2f0ffddfaf --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst @@ -0,0 +1,2 @@ +Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. From webhook-mailer at python.org Thu Jan 30 21:12:28 2020 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 31 Jan 2020 02:12:28 -0000 Subject: [Python-checkins] [3.6] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) (GH-18233) Message-ID: https://github.com/python/cpython/commit/51332c467ed2e07a191f903d554d0c54248e4d88 commit: 51332c467ed2e07a191f903d554d0c54248e4d88 branch: 3.6 author: Steve Dower committer: GitHub date: 2020-01-30T21:12:20-05:00 summary: [3.6] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) (GH-18233) files: A Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst M PC/getpathp.c M Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp diff --git a/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst new file mode 100644 index 0000000000000..5071e126b70d0 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst @@ -0,0 +1 @@ +Avoid unsafe load of ``api-ms-win-core-path-l1-1-0.dll`` at startup on Windows 7. diff --git a/PC/getpathp.c b/PC/getpathp.c index 880ea7b966e5c..e86c376fb4d34 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -224,7 +224,8 @@ static void join(wchar_t *buffer, const wchar_t *stuff) { if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); if (pathapi) _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); else @@ -249,7 +250,8 @@ static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; static void canonicalize(wchar_t *buffer, const wchar_t *path) { if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); if (pathapi) { _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); } diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index e88981fc3abb4..d14aeff190470 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -3042,8 +3042,16 @@ class PythonBootstrapperApplication : public CBalBaseBootstrapperApplication { } } else { if (IsWindows7SP1OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); - return; + HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); + if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533623"); + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue."); + /* The "MissingSP1" error also specifies updates are required */ + LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString); + } else { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); + return; + } } else if (IsWindows7OrGreater()) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 RTM"); BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); From webhook-mailer at python.org Thu Jan 30 21:12:50 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 Jan 2020 02:12:50 -0000 Subject: [Python-checkins] bpo-38792: Remove IDLE shell calltip before new prompt. (GH-17150) Message-ID: https://github.com/python/cpython/commit/8d021140866d050f90a4b44c2607f21be43208c1 commit: 8d021140866d050f90a4b44c2607f21be43208c1 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-30T18:12:46-08:00 summary: bpo-38792: Remove IDLE shell calltip before new prompt. (GH-17150) Previously, a calltip might be left after SyntaxError, KeyboardInterrupt, or Shell Restart. Co-authored-by: Terry Jan Reedy Co-authored-by: Tal Einat (cherry picked from commit bfdeaa37b3df7466624c17f9450d2bd1c3d95edf) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/calltip.py M Lib/idlelib/editor.py M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 79534111bcd8e..2afbe82277ee9 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-12-16? ====================================== +bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. + bpo-30780: Add remaining configdialog tests for buttons and highlights and keys tabs. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index a3dda2678bd4d..2e0db60d476ae 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -33,7 +33,7 @@ def _make_tk_calltip_window(self): # See __init__ for usage return calltip_w.CalltipWindow(self.text) - def _remove_calltip_window(self, event=None): + def remove_calltip_window(self, event=None): if self.active_calltip: self.active_calltip.hidetip() self.active_calltip = None @@ -55,7 +55,7 @@ def refresh_calltip_event(self, event): self.open_calltip(False) def open_calltip(self, evalfuncs): - self._remove_calltip_window() + self.remove_calltip_window() hp = HyperParser(self.editwin, "insert") sur_paren = hp.get_surrounding_brackets('(') diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index c9f1a1625ca5e..04c786dc5234c 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -328,7 +328,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): text.bind("<>", scriptbinding.run_module_event) text.bind("<>", scriptbinding.run_custom_event) text.bind("<>", self.Rstrip(self).do_rstrip) - ctip = self.Calltip(self) + self.ctip = ctip = self.Calltip(self) text.bind("<>", ctip.try_open_calltip_event) #refresh-calltip must come after paren-closed to work right text.bind("<>", ctip.refresh_calltip_event) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 065122dec7a73..d5b310ffd7a9b 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1292,6 +1292,7 @@ def resetoutput(self): self.text.insert("end-1c", "\n") self.text.mark_set("iomark", "end-1c") self.set_line_and_column() + self.ctip.remove_calltip_window() def write(self, s, tags=()): try: diff --git a/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst new file mode 100644 index 0000000000000..9aa2f0ffddfaf --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst @@ -0,0 +1,2 @@ +Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. From webhook-mailer at python.org Thu Jan 30 21:14:21 2020 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 31 Jan 2020 02:14:21 -0000 Subject: [Python-checkins] bpo-38792: Remove IDLE shell calltip before new prompt. (GH-17150) Message-ID: https://github.com/python/cpython/commit/83d3202b92fb4c2fc6df5b035d57f3a1cf715f20 commit: 83d3202b92fb4c2fc6df5b035d57f3a1cf715f20 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2020-01-30T18:14:16-08:00 summary: bpo-38792: Remove IDLE shell calltip before new prompt. (GH-17150) Previously, a calltip might be left after SyntaxError, KeyboardInterrupt, or Shell Restart. Co-authored-by: Terry Jan Reedy Co-authored-by: Tal Einat (cherry picked from commit bfdeaa37b3df7466624c17f9450d2bd1c3d95edf) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/calltip.py M Lib/idlelib/editor.py M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 4d2dd6d7ff2b9..1fc9e0f3090f6 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-12-16? ====================================== +bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. + bpo-30780: Add remaining configdialog tests for buttons and highlights and keys tabs. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index a3dda2678bd4d..2e0db60d476ae 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -33,7 +33,7 @@ def _make_tk_calltip_window(self): # See __init__ for usage return calltip_w.CalltipWindow(self.text) - def _remove_calltip_window(self, event=None): + def remove_calltip_window(self, event=None): if self.active_calltip: self.active_calltip.hidetip() self.active_calltip = None @@ -55,7 +55,7 @@ def refresh_calltip_event(self, event): self.open_calltip(False) def open_calltip(self, evalfuncs): - self._remove_calltip_window() + self.remove_calltip_window() hp = HyperParser(self.editwin, "insert") sur_paren = hp.get_surrounding_brackets('(') diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index c9f1a1625ca5e..04c786dc5234c 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -328,7 +328,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): text.bind("<>", scriptbinding.run_module_event) text.bind("<>", scriptbinding.run_custom_event) text.bind("<>", self.Rstrip(self).do_rstrip) - ctip = self.Calltip(self) + self.ctip = ctip = self.Calltip(self) text.bind("<>", ctip.try_open_calltip_event) #refresh-calltip must come after paren-closed to work right text.bind("<>", ctip.refresh_calltip_event) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 065122dec7a73..d5b310ffd7a9b 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1292,6 +1292,7 @@ def resetoutput(self): self.text.insert("end-1c", "\n") self.text.mark_set("iomark", "end-1c") self.set_line_and_column() + self.ctip.remove_calltip_window() def write(self, s, tags=()): try: diff --git a/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst new file mode 100644 index 0000000000000..9aa2f0ffddfaf --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst @@ -0,0 +1,2 @@ +Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. From webhook-mailer at python.org Fri Jan 31 04:50:24 2020 From: webhook-mailer at python.org (Julien Palard) Date: Fri, 31 Jan 2020 09:50:24 -0000 Subject: [Python-checkins] Doc: Fix s/pseudo random/pseudo-random/ (GH-18289) Message-ID: https://github.com/python/cpython/commit/58a4054760bffbb20aff90290dd0f3554f7bea42 commit: 58a4054760bffbb20aff90290dd0f3554f7bea42 branch: master author: Julien Palard committer: GitHub date: 2020-01-31T10:50:14+01:00 summary: Doc: Fix s/pseudo random/pseudo-random/ (GH-18289) files: M Doc/library/random.rst diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 933da3f8fcf65..1eb39bbda42e8 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -343,8 +343,8 @@ Alternative Generator Notes on Reproducibility ------------------------ -Sometimes it is useful to be able to reproduce the sequences given by a pseudo -random number generator. By re-using a seed value, the same sequence should be +Sometimes it is useful to be able to reproduce the sequences given by a +pseudo-random number generator. By re-using a seed value, the same sequence should be reproducible from run to run as long as multiple threads are not running. Most of the random module's algorithms and seeding functions are subject to From webhook-mailer at python.org Fri Jan 31 15:07:23 2020 From: webhook-mailer at python.org (Kyle Stanley) Date: Fri, 31 Jan 2020 20:07:23 -0000 Subject: [Python-checkins] bpo-37224: Improve test__xxsubinterpreters.DestroyTests (GH-18058) Message-ID: https://github.com/python/cpython/commit/f03a8f8d5001963ad5b5b28dbd95497e9cc15596 commit: f03a8f8d5001963ad5b5b28dbd95497e9cc15596 branch: master author: Kyle Stanley committer: GitHub date: 2020-01-31T12:07:09-08:00 summary: bpo-37224: Improve test__xxsubinterpreters.DestroyTests (GH-18058) Adds an additional assertion check based on a race condition for `test__xxsubinterpreters.DestroyTests.test_still_running` discovered in the bpo issue. https://bugs.python.org/issue37224 files: M Lib/test/test__xxsubinterpreters.py diff --git a/Lib/test/test__xxsubinterpreters.py b/Lib/test/test__xxsubinterpreters.py index 207b5db5d8fb9..30f8f98acc9dd 100644 --- a/Lib/test/test__xxsubinterpreters.py +++ b/Lib/test/test__xxsubinterpreters.py @@ -759,7 +759,11 @@ def test_still_running(self): main, = interpreters.list_all() interp = interpreters.create() with _running(interp): - with self.assertRaises(RuntimeError): + self.assertTrue(interpreters.is_running(interp), + msg=f"Interp {interp} should be running before destruction.") + + with self.assertRaises(RuntimeError, + msg=f"Should not be able to destroy interp {interp} while it's still running."): interpreters.destroy(interp) self.assertTrue(interpreters.is_running(interp)) From webhook-mailer at python.org Fri Jan 31 19:26:18 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 01 Feb 2020 00:26:18 -0000 Subject: [Python-checkins] bpo-39511: Fix multiprocessing semlock_acquire() (GH-18298) Message-ID: https://github.com/python/cpython/commit/7dc140126e918cc7c6e65aea321b7255f0020798 commit: 7dc140126e918cc7c6e65aea321b7255f0020798 branch: master author: Victor Stinner committer: GitHub date: 2020-02-01T01:25:59+01:00 summary: bpo-39511: Fix multiprocessing semlock_acquire() (GH-18298) The Python C API must not be used when the GIL is released: only access Py_None when the GIL is hold. files: M Modules/_multiprocessing/semaphore.c diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 4be2deae37750..ee490256d2a27 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -268,11 +268,8 @@ static PyObject * semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) { int blocking = 1, res, err = 0; - double timeout; PyObject *timeout_obj = Py_None; struct timespec deadline = {0}; - struct timeval now; - long sec, nsec; static char *kwlist[] = {"block", "timeout", NULL}; @@ -285,19 +282,23 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) Py_RETURN_TRUE; } - if (timeout_obj != Py_None) { - timeout = PyFloat_AsDouble(timeout_obj); - if (PyErr_Occurred()) + int use_deadline = (timeout_obj != Py_None); + if (use_deadline) { + double timeout = PyFloat_AsDouble(timeout_obj); + if (PyErr_Occurred()) { return NULL; - if (timeout < 0.0) + } + if (timeout < 0.0) { timeout = 0.0; + } + struct timeval now; if (gettimeofday(&now, NULL) < 0) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } - sec = (long) timeout; - nsec = (long) (1e9 * (timeout - sec) + 0.5); + long sec = (long) timeout; + long nsec = (long) (1e9 * (timeout - sec) + 0.5); deadline.tv_sec = now.tv_sec + sec; deadline.tv_nsec = now.tv_usec * 1000 + nsec; deadline.tv_sec += (deadline.tv_nsec / 1000000000); @@ -315,7 +316,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) /* Couldn't acquire immediately, need to block */ do { Py_BEGIN_ALLOW_THREADS - if (timeout_obj == Py_None) { + if (!use_deadline) { res = sem_wait(self->handle); } else { From webhook-mailer at python.org Fri Jan 31 20:30:33 2020 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 01 Feb 2020 01:30:33 -0000 Subject: [Python-checkins] bpo-39511: PyThreadState_Clear() calls on_delete (GH-18296) Message-ID: https://github.com/python/cpython/commit/4d96b4635aeff1b8ad41d41422ce808ce0b971c8 commit: 4d96b4635aeff1b8ad41d41422ce808ce0b971c8 branch: master author: Victor Stinner committer: GitHub date: 2020-02-01T02:30:25+01:00 summary: bpo-39511: PyThreadState_Clear() calls on_delete (GH-18296) PyThreadState.on_delete is a callback used to notify Python when a thread completes. _thread._set_sentinel() function creates a lock which is released when the thread completes. It sets on_delete callback to the internal release_sentinel() function. This lock is known as Threading._tstate_lock in the threading module. The release_sentinel() function uses the Python C API. The problem is that on_delete is called late in the Python finalization, when the C API is no longer fully working. The PyThreadState_Clear() function now calls the PyThreadState.on_delete callback. Previously, that happened in PyThreadState_Delete(). The release_sentinel() function is now called when the C API is still fully working. files: A Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst M Doc/c-api/init.rst M Python/pystate.c diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 7ea48aec009c9..14049ee64205f 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1048,6 +1048,10 @@ All of the following functions must be called after :c:func:`Py_Initialize`. Reset all information in a thread state object. The global interpreter lock must be held. + .. versionchanged:: 3.9 + This function now calls the :c:member:`PyThreadState.on_delete` callback. + Previously, that happened in :c:func:`PyThreadState_Delete`. + .. c:function:: void PyThreadState_Delete(PyThreadState *tstate) diff --git a/Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst b/Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst new file mode 100644 index 0000000000000..14a04875a8894 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst @@ -0,0 +1,3 @@ +The :c:func:`PyThreadState_Clear` function now calls the +:c:member:`PyThreadState.on_delete` callback. Previously, that happened in +:c:func:`PyThreadState_Delete`. diff --git a/Python/pystate.c b/Python/pystate.c index d792380de4649..ebc17ea5a7219 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -806,6 +806,10 @@ PyThreadState_Clear(PyThreadState *tstate) Py_CLEAR(tstate->async_gen_finalizer); Py_CLEAR(tstate->context); + + if (tstate->on_delete != NULL) { + tstate->on_delete(tstate->on_delete_data); + } } @@ -830,9 +834,7 @@ tstate_delete_common(PyThreadState *tstate, if (tstate->next) tstate->next->prev = tstate->prev; HEAD_UNLOCK(runtime); - if (tstate->on_delete != NULL) { - tstate->on_delete(tstate->on_delete_data); - } + PyMem_RawFree(tstate); if (gilstate->autoInterpreterState && From webhook-mailer at python.org Sat Jan 25 08:54:02 2020 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Sat, 25 Jan 2020 13:54:02 -0000 Subject: [Python-checkins] (no subject) Message-ID: To: python-checkins at python.org Subject: Python 3.9.0a3 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 https://github.com/python/cpython/commit/c33378df3988de26a07df9cb9ba5df4192ed= 9c4e commit: c33378df3988de26a07df9cb9ba5df4192ed9c4e branch: master author: =C5=81ukasz Langa committer: =C5=81ukasz Langa date: 2020-01-24T22:05:07+01:00 summary: Python 3.9.0a3 files: A Misc/NEWS.d/3.9.0a3.rst D Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst D Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst D Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst D Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst D Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst D Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst D Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst D Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst D Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst D Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst D Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.r= st D Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst D Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst D Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst D Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS.rst D Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst D Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst D Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst D Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst D Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst D Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst D Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst D Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst D Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst D Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst D Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst D Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst D Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst D Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst D Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst D Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst D Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst D Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst D Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst D Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst D Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst D Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst D Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst D Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst D Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst D Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst D Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst D Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst D Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst D Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst D Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst D Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst D Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst D Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst D Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst D Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst D Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst D Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst D Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst D Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst D Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst D Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst D Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst D Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst D Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst D Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst D Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst D Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst D Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst D Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst D Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst D Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst D Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst D Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst D Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst D Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index e6b33dad38e4c..d0720f7d8c6d2 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 9 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 2 +#define PY_RELEASE_SERIAL 3 =20 /* Version as a string */ -#define PY_VERSION "3.9.0a2+" +#define PY_VERSION "3.9.0a3" /*--end constants--*/ =20 /* Version as a single 4-byte hex number, e.g. 0x010502B2 =3D=3D 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index d9535f70be861..fd91446587239 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Wed Dec 18 22:05:39 2019 +# Autogenerated by Sphinx on Fri Jan 24 22:03:37 2020 topics =3D {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -470,24 +470,25 @@ 'The following code:\n' '\n' ' async for TARGET in ITER:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'Is semantically equivalent to:\n' '\n' ' iter =3D (ITER)\n' ' iter =3D type(iter).__aiter__(iter)\n' ' running =3D True\n' + '\n' ' while running:\n' ' try:\n' ' TARGET =3D await type(iter).__anext__(iter)\n' ' except StopAsyncIteration:\n' ' running =3D False\n' ' else:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'See also "__aiter__()" and "__anext__()" for details.\n' '\n' @@ -507,23 +508,27 @@ '\n' 'The following code:\n' '\n' - ' async with EXPR as VAR:\n' - ' BLOCK\n' + ' async with EXPRESSION as TARGET:\n' + ' SUITE\n' '\n' - 'Is semantically equivalent to:\n' + 'is semantically equivalent to:\n' '\n' - ' mgr =3D (EXPR)\n' - ' aexit =3D type(mgr).__aexit__\n' - ' aenter =3D type(mgr).__aenter__(mgr)\n' + ' manager =3D (EXPRESSION)\n' + ' aenter =3D type(manager).__aenter__\n' + ' aexit =3D type(manager).__aexit__\n' + ' value =3D await aenter(manager)\n' + ' hit_except =3D False\n' '\n' - ' VAR =3D await aenter\n' ' try:\n' - ' BLOCK\n' + ' TARGET =3D value\n' + ' SUITE\n' ' except:\n' - ' if not await aexit(mgr, *sys.exc_info()):\n' + ' hit_except =3D True\n' + ' if not await aexit(manager, *sys.exc_info()):\n' ' raise\n' - ' else:\n' - ' await aexit(mgr, None, None, None)\n' + ' finally:\n' + ' if not hit_except:\n' + ' await aexit(manager, None, None, None)\n' '\n' 'See also "__aenter__()" and "__aexit__()" for details.\n' '\n' @@ -2519,11 +2524,13 @@ '"with_item")\n' ' is evaluated to obtain a context manager.\n' '\n' - '2. The context manager=E2=80=99s "__exit__()" is loaded for la= ter use.\n' + '2. The context manager=E2=80=99s "__enter__()" is loaded for l= ater use.\n' '\n' - '3. The context manager=E2=80=99s "__enter__()" method is invok= ed.\n' + '3. The context manager=E2=80=99s "__exit__()" is loaded for la= ter use.\n' '\n' - '4. If a target was included in the "with" statement, the retur= n\n' + '4. The context manager=E2=80=99s "__enter__()" method is invok= ed.\n' + '\n' + '5. If a target was included in the "with" statement, the retur= n\n' ' value from "__enter__()" is assigned to it.\n' '\n' ' Note: The "with" statement guarantees that if the ' @@ -2536,9 +2543,9 @@ 'occurring\n' ' within the suite would be. See step 6 below.\n' '\n' - '5. The suite is executed.\n' + '6. The suite is executed.\n' '\n' - '6. The context manager=E2=80=99s "__exit__()" method is invoke= d. If an\n' + '7. The context manager=E2=80=99s "__exit__()" method is invoke= d. If an\n' ' exception caused the suite to be exited, its type, value, ' 'and\n' ' traceback are passed as arguments to "__exit__()". Otherwis= e, ' @@ -2560,18 +2567,42 @@ 'proceeds\n' ' at the normal location for the kind of exit that was taken.= \n' '\n' + 'The following code:\n' + '\n' + ' with EXPRESSION as TARGET:\n' + ' SUITE\n' + '\n' + 'is semantically equivalent to:\n' + '\n' + ' manager =3D (EXPRESSION)\n' + ' enter =3D type(manager).__enter__\n' + ' exit =3D type(manager).__exit__\n' + ' value =3D enter(manager)\n' + ' hit_except =3D False\n' + '\n' + ' try:\n' + ' TARGET =3D value\n' + ' SUITE\n' + ' except:\n' + ' hit_except =3D True\n' + ' if not exit(manager, *sys.exc_info()):\n' + ' raise\n' + ' finally:\n' + ' if not hit_except:\n' + ' exit(manager, None, None, None)\n' + '\n' 'With more than one item, the context managers are processed as= ' 'if\n' 'multiple "with" statements were nested:\n' '\n' ' with A() as a, B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' - 'is equivalent to\n' + 'is semantically equivalent to:\n' '\n' ' with A() as a:\n' ' with B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' 'Changed in version 3.1: Support for multiple context ' 'expressions.\n' @@ -2935,24 +2966,25 @@ 'The following code:\n' '\n' ' async for TARGET in ITER:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'Is semantically equivalent to:\n' '\n' ' iter =3D (ITER)\n' ' iter =3D type(iter).__aiter__(iter)\n' ' running =3D True\n' + '\n' ' while running:\n' ' try:\n' ' TARGET =3D await type(iter).__anext__(iter)\n' ' except StopAsyncIteration:\n' ' running =3D False\n' ' else:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'See also "__aiter__()" and "__anext__()" for details.\n' '\n' @@ -2972,23 +3004,27 @@ '\n' 'The following code:\n' '\n' - ' async with EXPR as VAR:\n' - ' BLOCK\n' + ' async with EXPRESSION as TARGET:\n' + ' SUITE\n' '\n' - 'Is semantically equivalent to:\n' + 'is semantically equivalent to:\n' '\n' - ' mgr =3D (EXPR)\n' - ' aexit =3D type(mgr).__aexit__\n' - ' aenter =3D type(mgr).__aenter__(mgr)\n' + ' manager =3D (EXPRESSION)\n' + ' aenter =3D type(manager).__aenter__\n' + ' aexit =3D type(manager).__aexit__\n' + ' value =3D await aenter(manager)\n' + ' hit_except =3D False\n' '\n' - ' VAR =3D await aenter\n' ' try:\n' - ' BLOCK\n' + ' TARGET =3D value\n' + ' SUITE\n' ' except:\n' - ' if not await aexit(mgr, *sys.exc_info()):\n' + ' hit_except =3D True\n' + ' if not await aexit(manager, *sys.exc_info()):\n' ' raise\n' - ' else:\n' - ' await aexit(mgr, None, None, None)\n' + ' finally:\n' + ' if not hit_except:\n' + ' await aexit(manager, None, None, None)\n' '\n' 'See also "__aenter__()" and "__aexit__()" for details.\n' '\n' @@ -6808,7 +6844,7 @@ 'object.__rfloordiv__(self, other)\n' 'object.__rmod__(self, other)\n' 'object.__rdivmod__(self, other)\n' - 'object.__rpow__(self, other)\n' + 'object.__rpow__(self, other[, modulo])\n' 'object.__rlshift__(self, other)\n' 'object.__rrshift__(self, other)\n' 'object.__rand__(self, other)\n' @@ -9483,7 +9519,7 @@ 'object.__rfloordiv__(self, other)\n' 'object.__rmod__(self, other)\n' 'object.__rdivmod__(self, other)\n' - 'object.__rpow__(self, other)\n' + 'object.__rpow__(self, other[, modulo])\n' 'object.__rlshift__(self, other)\n' 'object.__rrshift__(self, other)\n' 'object.__rand__(self, other)\n' @@ -9874,9 +9910,8 @@ 'best\n' ' performances, but only used at the first encoding ' 'error. Enable the\n' - ' development mode ("-X" "dev" option), or use a debug ' - 'build, to\n' - ' check *errors*.\n' + ' Python Development Mode, or use a debug build to chec= k ' + '*errors*.\n' '\n' ' Changed in version 3.1: Support for keyword arguments= ' 'added.\n' @@ -12401,6 +12436,8 @@ 'dictionary. This\n' ' is a shortcut for "reversed(d.keys())".\n' '\n' + ' New in version 3.8.\n' + '\n' ' setdefault(key[, default])\n' '\n' ' If *key* is in the dictionary, return its value. If= ' @@ -13606,11 +13643,13 @@ '1. The context expression (the expression given in the "with_item"= )\n' ' is evaluated to obtain a context manager.\n' '\n' - '2. The context manager=E2=80=99s "__exit__()" is loaded for later = use.\n' + '2. The context manager=E2=80=99s "__enter__()" is loaded for later= use.\n' '\n' - '3. The context manager=E2=80=99s "__enter__()" method is invoked.\= n' + '3. The context manager=E2=80=99s "__exit__()" is loaded for later = use.\n' '\n' - '4. If a target was included in the "with" statement, the return\n' + '4. The context manager=E2=80=99s "__enter__()" method is invoked.\= n' + '\n' + '5. If a target was included in the "with" statement, the return\n' ' value from "__enter__()" is assigned to it.\n' '\n' ' Note: The "with" statement guarantees that if the "__enter__()"= \n' @@ -13620,9 +13659,9 @@ ' target list, it will be treated the same as an error occurrin= g\n' ' within the suite would be. See step 6 below.\n' '\n' - '5. The suite is executed.\n' + '6. The suite is executed.\n' '\n' - '6. The context manager=E2=80=99s "__exit__()" method is invoked. = If an\n' + '7. The context manager=E2=80=99s "__exit__()" method is invoked. = If an\n' ' exception caused the suite to be exited, its type, value, and\n' ' traceback are passed as arguments to "__exit__()". Otherwise, ' 'three\n' @@ -13642,17 +13681,41 @@ 'proceeds\n' ' at the normal location for the kind of exit that was taken.\n' '\n' + 'The following code:\n' + '\n' + ' with EXPRESSION as TARGET:\n' + ' SUITE\n' + '\n' + 'is semantically equivalent to:\n' + '\n' + ' manager =3D (EXPRESSION)\n' + ' enter =3D type(manager).__enter__\n' + ' exit =3D type(manager).__exit__\n' + ' value =3D enter(manager)\n' + ' hit_except =3D False\n' + '\n' + ' try:\n' + ' TARGET =3D value\n' + ' SUITE\n' + ' except:\n' + ' hit_except =3D True\n' + ' if not exit(manager, *sys.exc_info()):\n' + ' raise\n' + ' finally:\n' + ' if not hit_except:\n' + ' exit(manager, None, None, None)\n' + '\n' 'With more than one item, the context managers are processed as if\= n' 'multiple "with" statements were nested:\n' '\n' ' with A() as a, B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' - 'is equivalent to\n' + 'is semantically equivalent to:\n' '\n' ' with A() as a:\n' ' with B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' 'Changed in version 3.1: Support for multiple context expressions.\= n' '\n' diff --git a/Misc/NEWS.d/3.9.0a3.rst b/Misc/NEWS.d/3.9.0a3.rst new file mode 100644 index 0000000000000..6c71d7e839d05 --- /dev/null +++ b/Misc/NEWS.d/3.9.0a3.rst @@ -0,0 +1,906 @@ +.. bpo: 39427 +.. date: 2020-01-22-22-28-04 +.. nonce: LiO-Eo +.. release date: 2020-01-24 +.. section: Core and Builtins + +Document all possibilities for the ``-X`` options in the command line help +section. Patch by Pablo Galindo. + +.. + +.. bpo: 39421 +.. date: 2020-01-22-15-53-37 +.. nonce: O3nG7u +.. section: Core and Builtins + +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. + +.. + +.. bpo: 39386 +.. date: 2020-01-20-21-40-57 +.. nonce: ULqD8t +.. section: Core and Builtins + +Prevent double awaiting of async iterator. + +.. + +.. bpo: 17005 +.. date: 2020-01-17-00-00-58 +.. nonce: nTSxsy +.. section: Core and Builtins + +Add :class:`functools.TopologicalSorter` to the :mod:`functools` module to +offers functionality to perform topological sorting of graphs. Patch by +Pablo Galindo, Tim Peters and Larry Hastings. + +.. + +.. bpo: 39320 +.. date: 2020-01-15-15-33-44 +.. nonce: b4hnJW +.. section: Core and Builtins + +Replace four complex bytecodes for building sequences with three simpler +ones. + +The following four bytecodes have been removed: + +* BUILD_LIST_UNPACK +* BUILD_TUPLE_UNPACK +* BUILD_SET_UNPACK +* BUILD_TUPLE_UNPACK_WITH_CALL + +The following three bytecodes have been added: + +* LIST_TO_TUPLE +* LIST_EXTEND +* SET_UPDATE + +.. + +.. bpo: 39336 +.. date: 2020-01-15-01-39-29 +.. nonce: nJ7W9I +.. section: Core and Builtins + +Import loaders which publish immutable module objects can now publish +immutable packages in addition to individual modules. + +.. + +.. bpo: 39322 +.. date: 2020-01-13-15-18-13 +.. nonce: aAs-1T +.. section: Core and Builtins + +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. Patch by Pablo Galindo. + +.. + +.. bpo: 39048 +.. date: 2020-01-13-14-45-22 +.. nonce: iPsj81 +.. section: Core and Builtins + +Improve the displayed error message when incorrect types are passed to +``async with`` statements by looking up the :meth:`__aenter__` special +method before the :meth:`__aexit__` special method when entering an +asynchronous context manager. Patch by G=C3=A9ry Ogam. + +.. + +.. bpo: 39235 +.. date: 2020-01-09-10-01-18 +.. nonce: RYwjoc +.. section: Core and Builtins + +Fix AST end location for lone generator expression in function call, e.g. +f(i for i in a). + +.. + +.. bpo: 39209 +.. date: 2020-01-06-10-29-16 +.. nonce: QHAONe +.. section: Core and Builtins + +Correctly handle multi-line tokens in interactive mode. Patch by Pablo +Galindo. + +.. + +.. bpo: 1635741 +.. date: 2020-01-05-13-40-08 +.. nonce: QRTJVC +.. section: Core and Builtins + +Port _json extension module to multiphase initialization (:pep:`489`). + +.. + +.. bpo: 39216 +.. date: 2020-01-05-06-55-52 +.. nonce: 74jLh9 +.. section: Core and Builtins + +Fix constant folding optimization for positional only arguments - by Anthony +Sottile. + +.. + +.. bpo: 39215 +.. date: 2020-01-04-17-25-34 +.. nonce: xiqiIz +.. section: Core and Builtins + +Fix ``SystemError`` when nested function has annotation on positional-only +argument - by Anthony Sottile. + +.. + +.. bpo: 39200 +.. date: 2020-01-04-01-14-32 +.. nonce: 8Z9DYp +.. section: Core and Builtins + +Correct the error message when calling the :func:`min` or :func:`max` with +no arguments. Patch by Dong-hee Na. + +.. + +.. bpo: 39200 +.. date: 2020-01-03-14-50-14 +.. nonce: Ip2_iI +.. section: Core and Builtins + +Correct the error message when trying to construct :class:`range` objects +with no arguments. Patch by Pablo Galindo. + +.. + +.. bpo: 39166 +.. date: 2020-01-02-22-22-03 +.. nonce: Qt-UeD +.. section: Core and Builtins + +Fix incorrect line execution reporting in trace functions when tracing the +last iteration of asynchronous for loops. Patch by Pablo Galindo. + +.. + +.. bpo: 39114 +.. date: 2019-12-31-18-25-45 +.. nonce: WG9alt +.. section: Core and Builtins + +Fix incorrent line execution reporting in trace functions when tracing +exception handlers with name binding. Patch by Pablo Galindo. + +.. + +.. bpo: 39156 +.. date: 2019-12-30-10-53-59 +.. nonce: veT-CB +.. section: Core and Builtins + +Split the COMPARE_OP bytecode instruction into four distinct instructions. + +* COMPARE_OP for rich comparisons +* IS_OP for 'is' and 'is not' tests +* CONTAINS_OP for 'in' and 'is not' tests +* JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. + +This improves the clarity of the interpreter and should provide a modest +speedup. + +.. + +.. bpo: 38588 +.. date: 2019-12-29-19-13-54 +.. nonce: pgXnNS +.. section: Core and Builtins + +Fix possible crashes in dict and list when calling +:c:func:`PyObject_RichCompareBool`. + +.. + +.. bpo: 13601 +.. date: 2019-12-17-22-32-11 +.. nonce: vNP4LC +.. section: Core and Builtins + +By default, ``sys.stderr`` is line-buffered now, even if ``stderr`` is +redirected to a file. You can still make ``sys.stderr`` unbuffered by +passing the :option:`-u` command-line option or setting the +:envvar:`PYTHONUNBUFFERED` environment variable. + +(Contributed by Jendrik Seipp in bpo-13601.) + +.. + +.. bpo: 38610 +.. date: 2019-10-31-14-30-39 +.. nonce: fHdVMS +.. section: Core and Builtins + +Fix possible crashes in several list methods by holding strong references to +list elements when calling :c:func:`PyObject_RichCompareBool`. + +.. + +.. bpo: 32021 +.. date: 2019-03-11-13-30-40 +.. nonce: dpbtkP +.. section: Core and Builtins + +Include brotli .br encoding in mimetypes encodings_map + +.. + +.. bpo: 39430 +.. date: 2020-01-24-11-05-21 +.. nonce: I0UQzM +.. section: Library + +Fixed race condition in lazy imports in :mod:`tarfile`. + +.. + +.. bpo: 39413 +.. date: 2020-01-24-10-10-25 +.. nonce: 7XYDM8 +.. section: Library + +The :func:`os.unsetenv` function is now also available on Windows. + +.. + +.. bpo: 39390 +.. date: 2020-01-23-21-34-29 +.. nonce: D2tSXk +.. section: Library + +Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. + +.. + +.. bpo: 39395 +.. date: 2020-01-23-03-05-41 +.. nonce: 4dda42 +.. section: Library + +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. + +.. + +.. bpo: 39406 +.. date: 2020-01-22-21-18-58 +.. nonce: HMpe8x +.. section: Library + +If ``setenv()`` C function is available, :func:`os.putenv` is now +implemented with ``setenv()`` instead of ``putenv()``, so Python doesn't +have to handle the environment variable memory. + +.. + +.. bpo: 39396 +.. date: 2020-01-21-09-00-42 +.. nonce: 6UXQXE +.. section: Library + +Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. + +.. + +.. bpo: 29435 +.. date: 2020-01-20-18-48-00 +.. nonce: qqJ2Ax +.. section: Library + +Allow :func:`tarfile.is_tarfile` to be used with file and file-like objects, +like :func:`zipfile.is_zipfile`. Patch by William Woodruff. + +.. + +.. bpo: 39377 +.. date: 2020-01-20-13-00-35 +.. nonce: QSFdaU +.. section: Library + +Removed ``encoding`` option from :func:`json.loads`. It has been deprecated +since Python 3.1. + +.. + +.. bpo: 39389 +.. date: 2020-01-20-00-56-01 +.. nonce: fEirIS +.. section: Library + +Write accurate compression level metadata in :mod:`gzip` archives, rather +than always signaling maximum compression. + +.. + +.. bpo: 39366 +.. date: 2020-01-17-18-14-51 +.. nonce: Cv3NQS +.. section: Library + +The previously deprecated ``xpath()`` and ``xgtitle()`` methods of +:class:`nntplib.NNTP` have been removed. + +.. + +.. bpo: 39357 +.. date: 2020-01-16-11-24-00 +.. nonce: bCwx-h +.. section: Library + +Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, +it was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an +open file object, to control how the file is opened. The *compresslevel* +parameter becomes keyword-only. + +.. + +.. bpo: 39353 +.. date: 2020-01-16-10-21-48 +.. nonce: ntp7Ql +.. section: Library + +Deprecate binhex4 and hexbin4 standards. Deprecate the :mod:`binhex` module +and the following :mod:`binascii` functions: :func:`~binascii.b2a_hqx`, +:func:`~binascii.a2b_hqx`, :func:`~binascii.rlecode_hqx`, +:func:`~binascii.rledecode_hqx`, :func:`~binascii.crc_hqx`. + +.. + +.. bpo: 39351 +.. date: 2020-01-16-09-27-28 +.. nonce: a-FQdv +.. section: Library + +Remove ``base64.encodestring()`` and ``base64.decodestring()``, aliases +deprecated since Python 3.1: use :func:`base64.encodebytes` and +:func:`base64.decodebytes` instead. + +.. + +.. bpo: 39350 +.. date: 2020-01-16-09-15-40 +.. nonce: ZQx0uY +.. section: Library + +Remove ``fractions.gcd()`` function, deprecated since Python 3.5 +(:issue:`22486`): use :func:`math.gcd` instead. + +.. + +.. bpo: 39329 +.. date: 2020-01-14-22-16-07 +.. nonce: 6OKGBn +.. section: Library + +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +Patch by Dong-hee Na. + +.. + +.. bpo: 39313 +.. date: 2020-01-12-18-17-00 +.. nonce: DCTsnm +.. section: Library + +Add a new ``exec_function`` option (*--exec-function* in the CLI) to +``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan +Taskaya. + +.. + +.. bpo: 39259 +.. date: 2020-01-12-17-19-40 +.. nonce: iax06r +.. section: Library + +:class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 39259 +.. date: 2020-01-12-16-34-28 +.. nonce: J_yBVq +.. section: Library + +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 39310 +.. date: 2020-01-12-13-34-42 +.. nonce: YMRdcj +.. section: Library + +Add :func:`math.ulp`: return the value of the least significant bit of a +float. + +.. + +.. bpo: 39297 +.. date: 2020-01-11-01-15-37 +.. nonce: y98Z6Q +.. section: Library + +Improved performance of importlib.metadata distribution discovery and +resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). + +.. + +.. bpo: 39259 +.. date: 2020-01-11-00-32-45 +.. nonce: _S5VjC +.. section: Library + +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 38901 +.. date: 2020-01-10-22-30-48 +.. nonce: OdVIIb +.. section: Library + +When you specify prompt=3D'.' or equivalently python -m venv --prompt . ... +the basename of the current directory is used to set the created venv's +prompt when it's activated. + +.. + +.. bpo: 39288 +.. date: 2020-01-10-16-52-09 +.. nonce: IB-aQX +.. section: Library + +Add :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. + +.. + +.. bpo: 39259 +.. date: 2020-01-09-10-58-58 +.. nonce: RmDgCC +.. section: Library + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 39242 +.. date: 2020-01-08-23-25-27 +.. nonce: bnL65N +.. section: Library + +Updated the Gmane domain from news.gmane.org to news.gmane.io which is used +for examples of :class:`~nntplib.NNTP` news reader server and nntplib tests. + +.. + +.. bpo: 35292 +.. date: 2020-01-08-14-39-19 +.. nonce: ihRT1z +.. section: Library + +Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so +the `mimetypes.init` is called lazily to avoid unnecessary costs when +:mod:`http.server` module is imported. + +.. + +.. bpo: 39239 +.. date: 2020-01-07-01-02-44 +.. nonce: r7vecs +.. section: Library + +The :meth:`select.epoll.unregister` method no longer ignores the +:data:`~errno.EBADF` error. + +.. + +.. bpo: 38907 +.. date: 2020-01-06-02-14-38 +.. nonce: F1RkCR +.. section: Library + +In http.server script, restore binding to IPv4 on Windows. + +.. + +.. bpo: 39152 +.. date: 2020-01-03-18-02-50 +.. nonce: JgPjCC +.. section: Library + +Fix ttk.Scale.configure([name]) to return configuration tuple for name or +all options. Giovanni Lombardo contributed part of the patch. + +.. + +.. bpo: 39198 +.. date: 2020-01-02-20-21-03 +.. nonce: nzwGyG +.. section: Library + +If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio +timeouts or stopit) , the `logging` global lock may not be released +appropriately, resulting in deadlock. This change wraps that block of code +with `try...finally` to ensure the lock is released. + +.. + +.. bpo: 39191 +.. date: 2020-01-02-17-28-03 +.. nonce: ur_scy +.. section: Library + +Perform a check for running loop before starting a new task in +``loop.run_until_complete()`` to fail fast; it prevents the side effect of +new task spawning before exception raising. + +.. + +.. bpo: 38871 +.. date: 2020-01-01-18-44-52 +.. nonce: 3EEOLg +.. section: Library + +Correctly parenthesize filter-based statements that contain lambda +expressions in mod:`lib2to3`. Patch by Dong-hee Na. + +.. + +.. bpo: 39142 +.. date: 2019-12-31-19-27-23 +.. nonce: oqU5iD +.. section: Library + +A change was made to logging.config.dictConfig to avoid converting instances +of named tuples to ConvertingTuple. It's assumed that named tuples are too +specialised to be treated like ordinary tuples; if a user of named tuples +requires ConvertingTuple functionality, they will have to implement that +themselves in their named tuple class. + +.. + +.. bpo: 39158 +.. date: 2019-12-29-15-44-38 +.. nonce: cxVoOR +.. section: Library + +ast.literal_eval() now supports empty sets. + +.. + +.. bpo: 39129 +.. date: 2019-12-24-10-43-13 +.. nonce: jVx5rW +.. section: Library + +Fix import path for ``asyncio.TimeoutError`` + +.. + +.. bpo: 39057 +.. date: 2019-12-15-21-47-54 +.. nonce: FOxn-w +.. section: Library + +:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and +no longer ignores a trailing newline. + +.. + +.. bpo: 39056 +.. date: 2019-12-15-21-05-16 +.. nonce: nEfUM9 +.. section: Library + +Fixed handling invalid warning category in the -W option. No longer import +the re module if it is not needed. + +.. + +.. bpo: 39055 +.. date: 2019-12-15-19-23-23 +.. nonce: FmN3un +.. section: Library + +:func:`base64.b64decode` with ``validate=3DTrue`` raises now a binascii.Error +if the input ends with a single ``\n``. + +.. + +.. bpo: 21600 +.. date: 2019-12-14-14-38-40 +.. nonce: kC4Cgh +.. section: Library + +Fix :func:`mock.patch.stopall` to stop active patches that were created with +:func:`mock.patch.dict`. + +.. + +.. bpo: 39019 +.. date: 2019-12-10-21-11-05 +.. nonce: YIlgZ7 +.. section: Library + +Implement dummy ``__class_getitem__`` for +:class:`tempfile.SpooledTemporaryFile`. + +.. + +.. bpo: 39019 +.. date: 2019-12-10-21-03-34 +.. nonce: i8RpMZ +.. section: Library + +Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, +``subprocess.CompletedProcess`` + +.. + +.. bpo: 38914 +.. date: 2019-11-26-23-21-56 +.. nonce: 8l-g-T +.. section: Library + +Adjusted the wording of the warning issued by distutils' ``check`` command +when the ``author`` and ``maintainer`` fields are supplied but no +corresponding e-mail field (``author_email`` or ``maintainer_email``) is +found. The wording now reflects the fact that these fields are suggested, +but not required. Patch by Juergen Gmach. + +.. + +.. bpo: 38878 +.. date: 2019-11-22-12-08-52 +.. nonce: EJ0cFf +.. section: Library + +Fixed __subclasshook__ of :class:`os.PathLike` to return a correct result +upon inheritence. Patch by Bar Harel. + +.. + +.. bpo: 38615 +.. date: 2019-11-17-17-32-35 +.. nonce: OVyaNX +.. section: Library + +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have an optional +*timeout* parameter for their constructors. Also, the +:meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. Patch by +Dong-hee Na. + +.. + +.. bpo: 35182 +.. date: 2019-10-31-19-23-25 +.. nonce: hzeNl9 +.. section: Library + +Fixed :func:`Popen.communicate` subsequent call crash when the child process +has already closed any piped standard stream, but still continues to be +running. Patch by Andriy Maletsky. + +.. + +.. bpo: 38630 +.. date: 2019-10-29-12-21-10 +.. nonce: Dv6Xrm +.. section: Library + +On Unix, :meth:`subprocess.Popen.send_signal` now polls the process status. +Polling reduces the risk of sending a signal to the wrong process if the +process completed, the :attr:`subprocess.Popen.returncode` attribute is +still ``None``, and the pid has been reassigned (recycled) to a new +different process. + +.. + +.. bpo: 38536 +.. date: 2019-10-21-20-24-51 +.. nonce: beZ0Sk +.. section: Library + +Removes trailing space in formatted currency with `international=3DTrue` and= a +locale with symbol following value. E.g. `locale.currency(12.34, +international=3DTrue)` returned `'12,34 EUR '` instead of `'12,34 EUR'`. + +.. + +.. bpo: 38473 +.. date: 2019-10-14-21-14-55 +.. nonce: uXpVld +.. section: Library + +Use signature from inner mock for autospecced methods attached with +:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 38361 +.. date: 2019-10-04-09-49-56 +.. nonce: LM4u4T +.. section: Library + +Fixed an issue where ``ident`` could include a leading path separator when +:func:`syslog.openlog` was called without arguments. + +.. + +.. bpo: 38293 +.. date: 2019-09-29-08-17-03 +.. nonce: wls5s3 +.. section: Library + +Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` +objects. + +.. + +.. bpo: 37958 +.. date: 2019-08-27-03-57-25 +.. nonce: lRORI3 +.. section: Library + +Added the pstats.Stats.get_profile_dict() method to return the profile data +as a StatsProfile instance. + +.. + +.. bpo: 28367 +.. date: 2019-05-06-22-38-47 +.. nonce: 2AKen5 +.. section: Library + +Termios magic constants for the following baud rates: - B500000 - +B576000 - B921600 - B1000000 - B1152000 - B1500000 - B2000000 - +B2500000 - B3000000 - B3500000 - B4000000 Patch by Andrey Smirnov + +.. + +.. bpo: 39381 +.. date: 2020-01-18-15-37-56 +.. nonce: wTWe8d +.. section: Documentation + +Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new +event loop only if called from the main thread. + +.. + +.. bpo: 38918 +.. date: 2019-12-15-22-04-41 +.. nonce: 8JnDTS +.. section: Documentation + +Add an entry for ``__module__`` in the "function" & "method" sections of the +`inspect docs types and members table +`_ + +.. + +.. bpo: 3530 +.. date: 2019-11-17-11-53-10 +.. nonce: 8zFUMc +.. section: Documentation + +In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` +example and add advice on when to use the ``fix_missing_locations`` +function. + +.. + +.. bpo: 39395 +.. date: 2020-01-23-03-05-13 +.. nonce: RoArIZ +.. section: Build + +On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` +functions are now required to build Python. + +.. + +.. bpo: 39160 +.. date: 2019-12-30-03-54-24 +.. nonce: aBmj13 +.. section: Build + +Updated the documentation in `./configure --help` to show default values, +reference documentation where required and add additional explanation where +needed. + +.. + +.. bpo: 39144 +.. date: 2019-12-27-22-18-26 +.. nonce: dwHMlR +.. section: Build + +The ctags and etags build targets both include Modules/_ctypes and Python +standard library source files. + +.. + +.. bpo: 39050 +.. date: 2020-01-22-22-28-06 +.. nonce: zkn0FO +.. section: IDLE + +Make IDLE Settings dialog Help button work again. + +.. + +.. bpo: 34118 +.. date: 2019-12-30-16-44-07 +.. nonce: FaNW0a +.. section: IDLE + +Tag memoryview, range, and tuple as classes, the same as list, etcetera, in +the library manual built-in functions list. + +.. + +.. bpo: 32989 +.. date: 2018-03-03-12-56-26 +.. nonce: FVhmhH +.. section: IDLE + +Add tests for editor newline_and_indent_event method. Remove dead code from +pyparse find_good_parse_start method. + +.. + +.. bpo: 39372 +.. date: 2020-01-17-19-25-48 +.. nonce: hGJMY6 +.. section: C API + +Clean header files of interfaces defined but with no implementation. The +public API symbols being removed are: +``_PyBytes_InsertThousandsGroupingLocale``, +``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, +``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, +``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, ``_PyAIterWrapper_Type``, +``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, +``PyNoArgsFunction``. + +.. + +.. bpo: 39164 +.. date: 2019-12-30-10-43-52 +.. nonce: WEV0uu +.. section: C API + +Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception +information of the specified Python thread state. diff --git a/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst = b/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst deleted file mode 100644 index 8b90da19622e6..0000000000000 --- a/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst +++ /dev/null @@ -1 +0,0 @@ -The ctags and etags build targets both include Modules/_ctypes and Python st= andard library source files. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst = b/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst deleted file mode 100644 index 9fb4088de0e70..0000000000000 --- a/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst +++ /dev/null @@ -1 +0,0 @@ -Updated the documentation in `./configure --help` to show default values, re= ference documentation where required and add additional explanation where nee= ded. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst = b/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst deleted file mode 100644 index aa2146a11d9d7..0000000000000 --- a/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` functi= ons -are now required to build Python. diff --git a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst = b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst deleted file mode 100644 index bb72ac70d5b62..0000000000000 --- a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst=09 +++ /dev/null @@ -1 +0,0 @@ -Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception informa= tion of the specified Python thread state. diff --git a/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst = b/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst deleted file mode 100644 index 8415d756ffa49..0000000000000 --- a/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst=09 +++ /dev/null @@ -1,8 +0,0 @@ -Clean header files of interfaces defined but with no implementation. The -public API symbols being removed are: -``_PyBytes_InsertThousandsGroupingLocale``, -``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, -``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, -``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, ``_PyAIterWrapper_Type``, -``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, -``PyNoArgsFunction``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021= .dpbtkP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-3202= 1.dpbtkP.rst deleted file mode 100644 index a07f6d3e85af5..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP= .rst=09 +++ /dev/null @@ -1 +0,0 @@ -Include brotli .br encoding in mimetypes encodings_map \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610= .fHdVMS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-3861= 0.fHdVMS.rst deleted file mode 100644 index 0ee63bbb40dc6..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crashes in several list methods by holding strong references to -list elements when calling :c:func:`PyObject_RichCompareBool`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601= .vNP4LC.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-1360= 1.vNP4LC.rst deleted file mode 100644 index f2c9495a59afb..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC= .rst=09 +++ /dev/null @@ -1,6 +0,0 @@ -By default, ``sys.stderr`` is line-buffered now, even if ``stderr`` is -redirected to a file. You can still make ``sys.stderr`` unbuffered by -passing the :option:`-u` command-line option or setting the -:envvar:`PYTHONUNBUFFERED` environment variable. - -(Contributed by Jendrik Seipp in bpo-13601.) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588= .pgXnNS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-3858= 8.pgXnNS.rst deleted file mode 100644 index 0b81085a89d25..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crashes in dict and list when calling -:c:func:`PyObject_RichCompareBool`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156= .veT-CB.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-3915= 6.veT-CB.rst deleted file mode 100644 index f8d1a1a88a78f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB= .rst=09 +++ /dev/null @@ -1,9 +0,0 @@ -Split the COMPARE_OP bytecode instruction into four distinct instructions. - -* COMPARE_OP for rich comparisons -* IS_OP for 'is' and 'is not' tests -* CONTAINS_OP for 'in' and 'is not' tests -* JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. - -This improves the clarity of the interpreter and should provide a modest -speedup. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114= .WG9alt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-3911= 4.WG9alt.rst deleted file mode 100644 index d742af9d3262e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix incorrent line execution reporting in trace functions when tracing -exception handlers with name binding. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166= .Qt-UeD.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-3916= 6.Qt-UeD.rst deleted file mode 100644 index 4737e9c4d2ee7..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix incorrect line execution reporting in trace functions when tracing the -last iteration of asynchronous for loops. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200= .Ip2_iI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-3920= 0.Ip2_iI.rst deleted file mode 100644 index e5cb396643fe0..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Correct the error message when trying to construct :class:`range` objects -with no arguments. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200= .8Z9DYp.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-3920= 0.8Z9DYp.rst deleted file mode 100644 index 71e4072099245..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Correct the error message when calling the :func:`min` or :func:`max` with -no arguments. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215= .xiqiIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-3921= 5.xiqiIz.rst deleted file mode 100644 index 9a3178f9c6218..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``SystemError`` when nested function has annotation on positional-only -argument - by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216= .74jLh9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-3921= 6.74jLh9.rst deleted file mode 100644 index 971b06552973e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix constant folding optimization for positional only arguments - by Anthony -Sottile. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-16357= 41.QRTJVC.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-16= 35741.QRTJVC.rst deleted file mode 100644 index 9b856c9e1ba24..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJ= VC.rst=09 +++ /dev/null @@ -1 +0,0 @@ -Port _json extension module to multiphase initialization (:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209= .QHAONe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-3920= 9.QHAONe.rst deleted file mode 100644 index c05b3f8dfa4d4..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Correctly handle multi-line tokens in interactive mode. Patch by Pablo -Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235= .RYwjoc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-3923= 5.RYwjoc.rst deleted file mode 100644 index 5fb0d45356bad..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix AST end location for lone generator expression in function call, e.g. -f(i for i in a). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048= .iPsj81.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-3904= 8.iPsj81.rst deleted file mode 100644 index 1179ef49651bd..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81= .rst=09 +++ /dev/null @@ -1,4 +0,0 @@ -Improve the displayed error message when incorrect types are passed to ``asy= nc -with`` statements by looking up the :meth:`__aenter__` special method before -the :meth:`__aexit__` special method when entering an asynchronous context -manager. Patch by G=C3=A9ry Ogam. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322= .aAs-1T.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-3932= 2.aAs-1T.rst deleted file mode 100644 index 60df44cc67219..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Added a new function :func:`gc.is_finalized` to check if an object has been -finalized by the garbage collector. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336= .nJ7W9I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-3933= 6.nJ7W9I.rst deleted file mode 100644 index 55b6bbbcac0d1..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I= .rst=09 +++ /dev/null @@ -1 +0,0 @@ -Import loaders which publish immutable module objects can now publish immuta= ble packages in addition to individual modules. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320= .b4hnJW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-3932= 0.b4hnJW.rst deleted file mode 100644 index 1e7235b7e6f7f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW= .rst=09 +++ /dev/null @@ -1,15 +0,0 @@ -Replace four complex bytecodes for building sequences with three simpler one= s. - - -The following four bytecodes have been removed: - -* BUILD_LIST_UNPACK -* BUILD_TUPLE_UNPACK=20 -* BUILD_SET_UNPACK=20 -* BUILD_TUPLE_UNPACK_WITH_CALL - -The following three bytecodes have been added: - -* LIST_TO_TUPLE -* LIST_EXTEND -* SET_UPDATE diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005= .nTSxsy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-1700= 5.nTSxsy.rst deleted file mode 100644 index e5336437754af..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy= .rst=09 +++ /dev/null @@ -1,3 +0,0 @@ -Add :class:`functools.TopologicalSorter` to the :mod:`functools` module to -offers functionality to perform topological sorting of graphs. Patch by -Pablo Galindo, Tim Peters and Larry Hastings. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386= .ULqD8t.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-3938= 6.ULqD8t.rst deleted file mode 100644 index f24e1f4e8a183..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t= .rst=09 +++ /dev/null @@ -1 +0,0 @@ -Prevent double awaiting of async iterator. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421= .O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-3942= 1.O3nG7u.rst deleted file mode 100644 index bae008150ee12..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crashes when operating with the functions in the :mod:`heapq` -module and custom comparison operators. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427= .LiO-Eo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-3942= 7.LiO-Eo.rst deleted file mode 100644 index a3915a4d81c79..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo= .rst=09 +++ /dev/null @@ -1,2 +0,0 @@ -Document all possibilities for the ``-X`` options in the command line help -section. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFU= Mc.rst b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.r= st deleted file mode 100644 index 65f1a6d156a12..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst +++ /dev/null @@ -1,2 +0,0 @@ -In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer``= example and add -advice on when to use the ``fix_missing_locations`` function. diff --git a/Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8Jn= DTS.rst b/Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS= .rst deleted file mode 100644 index 5747936dd64d5..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add an entry for ``__module__`` in the "function" & "method" sections of the -`inspect docs types and members table -`_ diff --git a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTW= e8d.rst b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d= .rst deleted file mode 100644 index 37b66ad9dfd17..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst +++ /dev/null @@ -1,2 +0,0 @@ -Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new -event loop only if called from the main thread. diff --git a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst b= /Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst deleted file mode 100644 index 38f0fb6e10452..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add tests for editor newline_and_indent_event method. -Remove dead code from pyparse find_good_parse_start method. diff --git a/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst b= /Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst deleted file mode 100644 index ce95eb5482f2b..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst +++ /dev/null @@ -1,2 +0,0 @@ -Tag memoryview, range, and tuple as classes, the same as list, etcetera, in -the library manual built-in functions list. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst b= /Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst deleted file mode 100644 index e71265cdf109b..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst +++ /dev/null @@ -1 +0,0 @@ -Make IDLE Settings dialog Help button work again. diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rs= t b/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst deleted file mode 100644 index 115f458bfbf3e..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst +++ /dev/null @@ -1,13 +0,0 @@ -Termios magic constants for the following baud rates: - - B500000 - - B576000 - - B921600 - - B1000000 - - B1152000 - - B1500000 - - B2000000 - - B2500000 - - B3000000 - - B3500000 - - B4000000 -Patch by Andrey Smirnov \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rs= t b/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst deleted file mode 100644 index d0b4d6adca4b9..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added the pstats.Stats.get_profile_dict() method to return the profile -data as a StatsProfile instance. diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rs= t b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst deleted file mode 100644 index 0b19551970eb0..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` = objects. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rs= t b/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst deleted file mode 100644 index 65186db60b455..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed an issue where ``ident`` could include a leading path separator when := func:`syslog.openlog` was called without arguments. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rs= t b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst deleted file mode 100644 index de80e89e00e2d..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use signature from inner mock for autospecced methods attached with -:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rs= t b/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst deleted file mode 100644 index 147d181cc7e14..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removes trailing space in formatted currency with `international=3DTrue` and= a locale with symbol following value. -E.g. `locale.currency(12.34, international=3DTrue)` returned `'12,34 EUR '` = instead of `'12,34 EUR'`. diff --git a/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rs= t b/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst deleted file mode 100644 index 1a4d59205ab18..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst +++ /dev/null @@ -1,5 +0,0 @@ -On Unix, :meth:`subprocess.Popen.send_signal` now polls the process status. -Polling reduces the risk of sending a signal to the wrong process if the -process completed, the :attr:`subprocess.Popen.returncode` attribute is still -``None``, and the pid has been reassigned (recycled) to a new different -process. diff --git a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rs= t b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst deleted file mode 100644 index 9438cd8f9fd0b..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed :func:`Popen.communicate` subsequent call crash when the child process -has already closed any piped standard stream, but still continues to be -running. Patch by Andriy Maletsky. diff --git a/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rs= t b/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst deleted file mode 100644 index 04f51da0db723..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst +++ /dev/null @@ -1,5 +0,0 @@ -:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have an=20 -optional *timeout* parameter for their constructors.=20 -Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* p= arameter -with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and -:class:`~imaplib.IMAP4_stream` were applied to this change. Patch by Dong-he= e Na. diff --git a/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rs= t b/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst deleted file mode 100644 index 9cbdf08dd53e3..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed __subclasshook__ of :class:`os.PathLike` to return a correct result -upon inheritence. Patch by Bar Harel. diff --git a/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rs= t b/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst deleted file mode 100644 index 2dfc1ea149b1b..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst +++ /dev/null @@ -1,5 +0,0 @@ -Adjusted the wording of the warning issued by distutils' ``check`` command w= hen -the ``author`` and ``maintainer`` fields are supplied but no corresponding -e-mail field (``author_email`` or ``maintainer_email``) is found. The wording -now reflects the fact that these fields are suggested, but not required. Pat= ch -by Juergen Gmach. diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rs= t b/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst deleted file mode 100644 index b64a56edc50c7..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, -``subprocess.CompletedProcess`` diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rs= t b/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst deleted file mode 100644 index 7bdf291950f82..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst +++ /dev/null @@ -1 +0,0 @@ -Implement dummy ``__class_getitem__`` for :class:`tempfile.SpooledTemporaryF= ile`. diff --git a/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rs= t b/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst deleted file mode 100644 index 0f72639310653..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`mock.patch.stopall` to stop active patches that were created with -:func:`mock.patch.dict`. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rs= t b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst deleted file mode 100644 index 83b1431e92fcb..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`base64.b64decode` with ``validate=3DTrue`` raises now a binascii.Error -if the input ends with a single ``\n``. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rs= t b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst deleted file mode 100644 index d5d2b98e9b0b3..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed handling invalid warning category in the -W option. No longer import -the re module if it is not needed. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rs= t b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst deleted file mode 100644 index 24a17444b97da..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and -no longer ignores a trailing newline. diff --git a/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rs= t b/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst deleted file mode 100644 index 6667697671a28..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix import path for ``asyncio.TimeoutError`` diff --git a/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rs= t b/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst deleted file mode 100644 index c41799bebaeb9..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst +++ /dev/null @@ -1 +0,0 @@ -ast.literal_eval() now supports empty sets. diff --git a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rs= t b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst deleted file mode 100644 index 508d1338d7c31..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst +++ /dev/null @@ -1,5 +0,0 @@ -A change was made to logging.config.dictConfig to avoid converting instances -of named tuples to ConvertingTuple. It's assumed that named tuples are too -specialised to be treated like ordinary tuples; if a user of named tuples -requires ConvertingTuple functionality, they will have to implement that -themselves in their named tuple class. diff --git a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rs= t b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst deleted file mode 100644 index fe970fd9e3fa1..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correctly parenthesize filter-based statements that contain lambda -expressions in mod:`lib2to3`. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rs= t b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst deleted file mode 100644 index 138c93c2e4877..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst +++ /dev/null @@ -1,3 +0,0 @@ -Perform a check for running loop before starting a new task in -``loop.run_until_complete()`` to fail fast; it prevents the side effect of -new task spawning before exception raising. diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rs= t b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst deleted file mode 100644 index ec4e81e2bbe4a..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst +++ /dev/null @@ -1 +0,0 @@ -If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio = timeouts or stopit) , the `logging` global lock may not be released appropria= tely, resulting in deadlock. This change wraps that block of code with `try.= ..finally` to ensure the lock is released. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rs= t b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst deleted file mode 100644 index abb3df0da0fe4..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ttk.Scale.configure([name]) to return configuration tuple for name -or all options. Giovanni Lombardo contributed part of the patch. diff --git a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rs= t b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst deleted file mode 100644 index a6e79f7809521..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst +++ /dev/null @@ -1 +0,0 @@ -In http.server script, restore binding to IPv4 on Windows. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rs= t b/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst deleted file mode 100644 index 2a1c9290869c1..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :meth:`select.epoll.unregister` method no longer ignores the -:data:`~errno.EBADF` error. diff --git a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rs= t b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst deleted file mode 100644 index ae52f970d0b71..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst +++ /dev/null @@ -1 +0,0 @@ -Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so= the `mimetypes.init` is called lazily to avoid unnecessary costs when :mod:`= http.server` module is imported. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rs= t b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst deleted file mode 100644 index a87dddf81dcd5..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst +++ /dev/null @@ -1,3 +0,0 @@ -Updated the Gmane domain from news.gmane.org to news.gmane.io=20 -which is used for examples of :class:`~nntplib.NNTP` news reader server and -nntplib tests. diff --git a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rs= t b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst deleted file mode 100644 index c7ef8be7e3adb..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rs= t b/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst deleted file mode 100644 index 0e0ec99c344ae..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`math.nextafter`: return the next floating-point value after *x* -towards *y*. diff --git a/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rs= t b/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst deleted file mode 100644 index 304d53289e0ef..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst +++ /dev/null @@ -1,3 +0,0 @@ -When you specify prompt=3D'.' or equivalently python -m venv --prompt . ... -the basename of the current directory is used to set the created venv's -prompt when it's activated. diff --git a/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rs= t b/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst deleted file mode 100644 index a454572c80db4..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rs= t b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst deleted file mode 100644 index 618f6f9f2b7ff..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst +++ /dev/null @@ -1 +0,0 @@ -Improved performance of importlib.metadata distribution discovery and resili= ents to inaccessible sys.path entries (importlib_metadata v1.4.0). diff --git a/Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rs= t b/Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst deleted file mode 100644 index a787f69608740..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`math.ulp`: return the value of the least significant bit of a flo= at. diff --git a/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rs= t b/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst deleted file mode 100644 index 6cc490eb35e6e..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rs= t b/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst deleted file mode 100644 index bfcaff3c3d006..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rs= t b/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst deleted file mode 100644 index 784d73c7b3f96..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a new ``exec_function`` option (*--exec-function* in the CLI) to -``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan Taskaya. diff --git a/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rs= t b/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst deleted file mode 100644 index 1e3da4618b41c..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rs= t b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst deleted file mode 100644 index 264e52fdc518b..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove ``fractions.gcd()`` function, deprecated since Python 3.5 -(:issue:`22486`): use :func:`math.gcd` instead. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rs= t b/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst deleted file mode 100644 index b89bec97bfa4f..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove ``base64.encodestring()`` and ``base64.decodestring()``, aliases -deprecated since Python 3.1: use :func:`base64.encodebytes` and -:func:`base64.decodebytes` instead. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rs= t b/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst deleted file mode 100644 index c0d4583ca7fec..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst +++ /dev/null @@ -1,4 +0,0 @@ -Deprecate binhex4 and hexbin4 standards. Deprecate the :mod:`binhex` module = and -the following :mod:`binascii` functions: :func:`~binascii.b2a_hqx`, -:func:`~binascii.a2b_hqx`, :func:`~binascii.rlecode_hqx`, -:func:`~binascii.rledecode_hqx`, :func:`~binascii.crc_hqx`. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rs= t b/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst deleted file mode 100644 index a90802c91a2ed..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst +++ /dev/null @@ -1,4 +0,0 @@ -Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, = it -was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an open -file object, to control how the file is opened. The *compresslevel* parameter -becomes keyword-only. diff --git a/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rs= t b/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst deleted file mode 100644 index 00d98a7f183ae..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst +++ /dev/null @@ -1,2 +0,0 @@ -The previously deprecated ``xpath()`` and ``xgtitle()`` methods of -:class:`nntplib.NNTP` have been removed. diff --git a/Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rs= t b/Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst deleted file mode 100644 index d4c80506f7d6b..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Write accurate compression level metadata in :mod:`gzip` archives, rather -than always signaling maximum compression. diff --git a/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rs= t b/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst deleted file mode 100644 index 8493ac88e4b72..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed ``encoding`` option from :func:`json.loads`. It has been deprecated -since Python 3.1. diff --git a/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rs= t b/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst deleted file mode 100644 index eabc94242c813..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow :func:`tarfile.is_tarfile` to be used with file and file-like -objects, like :func:`zipfile.is_zipfile`. Patch by William Woodruff. diff --git a/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rs= t b/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst deleted file mode 100644 index af7076854a5f9..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. diff --git a/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rs= t b/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst deleted file mode 100644 index 56a5316043238..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst +++ /dev/null @@ -1,3 +0,0 @@ -If ``setenv()`` C function is available, :func:`os.putenv` is now -implemented with ``setenv()`` instead of ``putenv()``, so Python doesn't -have to handle the environment variable memory. diff --git a/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rs= t b/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst deleted file mode 100644 index cf713709dcfbb..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :func:`os.putenv` and :func:`os.unsetenv` functions are now always -available. diff --git a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rs= t b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst deleted file mode 100644 index ffa961ea4cd22..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. -The argument types are now str and List[str] again. diff --git a/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rs= t b/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst deleted file mode 100644 index a185ab5efe2ed..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst +++ /dev/null @@ -1 +0,0 @@ -The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rs= t b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst deleted file mode 100644 index 712fc5d34bbe0..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed race condition in lazy imports in :mod:`tarfile`. diff --git a/README.rst b/README.rst index e8fd598a61edd..5971d4aefcba1 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.9.0 alpha 2 +This is Python version 3.9.0 alpha 3 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 .. image:: https://travis-ci.org/python/cpython.svg?branch=3Dmaster